diff --git a/app/Enums/Concerns/Arrayable.php b/app/Enums/Concerns/Arrayable.php new file mode 100644 index 0000000..c14cc96 --- /dev/null +++ b/app/Enums/Concerns/Arrayable.php @@ -0,0 +1,14 @@ + */ + use HasFactory; + protected $guarded = []; public function owner(): BelongsTo diff --git a/app/Models/Server.php b/app/Models/Server.php index e6afdd5..88a74d0 100644 --- a/app/Models/Server.php +++ b/app/Models/Server.php @@ -4,6 +4,7 @@ namespace App\Models; use App\Enums\ServerProvider; use App\Enums\ServerStatus; +use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\HasMany; @@ -11,6 +12,9 @@ use Spatie\Ssh\Ssh; class Server extends Model { + /** @use HasFactory<\Database\Factories\UserFactory> */ + use HasFactory; + protected $guarded = []; protected function casts(): array diff --git a/app/Services/ServerProviders/HetznerService.php b/app/Services/ServerProviders/HetznerService.php index 4cfbb65..1a48abe 100644 --- a/app/Services/ServerProviders/HetznerService.php +++ b/app/Services/ServerProviders/HetznerService.php @@ -104,6 +104,6 @@ class HetznerService extends ServerProviderService osFlavor: $image['os_flavor'], osVersion: $image['os_version'], ); - })->values(); + })->where('osVersion', '!=', 'unknown')->values(); } } diff --git a/database/factories/OrganisationFactory.php b/database/factories/OrganisationFactory.php new file mode 100644 index 0000000..96e178c --- /dev/null +++ b/database/factories/OrganisationFactory.php @@ -0,0 +1,29 @@ + + */ +class OrganisationFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + $name = $this->faker->company(); + $owner = User::inRandomOrder()->first() ?: User::factory()->create(); + return [ + 'name' => $this->faker->company(), + 'slug' => Organisation::createUniqueSlug($name), + 'owner_id' => $owner->id, + ]; + } +} diff --git a/database/factories/ServerFactory.php b/database/factories/ServerFactory.php new file mode 100644 index 0000000..a3be484 --- /dev/null +++ b/database/factories/ServerFactory.php @@ -0,0 +1,44 @@ + + */ +class ServerFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'name' => $this->faker->word(), + 'provider' => ServerProvider::HETZNER, + 'provider_id' => $this->faker->uuid(), + 'ipv4' => $this->faker->ipv4(), + 'ipv6' => $this->faker->ipv6(), + 'provider_status' => '', + 'status' => $this->faker->randomElement(ServerStatus::toArray()), + 'region' => '28', + 'os' => 'ubuntu', + 'plan' => '26', + 'user' => 'keystone', + ]; + } + + public function forOrganisation(int $organisationId): static + { + return $this->state(function (array $attributes) use ($organisationId) { + return [ + 'organisation_id' => $organisationId, + ]; + }); + } +} diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 6d951bd..13e5a09 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -5,6 +5,7 @@ namespace Database\Seeders; use App\Enums\OrganisationRole; use App\Enums\RepositoryType; use App\Models\Organisation; +use App\Models\Server; use App\Models\User; // use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; @@ -31,6 +32,10 @@ class DatabaseSeeder extends Seeder 'owner_id' => 1, ]); + $servers = Server::factory(40)->forOrganisation($organisation->id)->create(); + + $organisation->servers()->saveMany($servers); + $organisation->members()->attach($user, ['role' => OrganisationRole::ADMIN]); $application = $organisation->applications()->create([ diff --git a/resources/js/pages/servers/Create.vue b/resources/js/pages/servers/Create.vue index 8a5c421..d2ebda7 100644 --- a/resources/js/pages/servers/Create.vue +++ b/resources/js/pages/servers/Create.vue @@ -33,25 +33,62 @@ const serverProviders = [ watch( () => form.provider, (provider) => { - console.log(provider); + loadLocations(); }, ); -if (form.provider && !props.locations) { - router.reload({ - only: ['locations'], - data: { - provider: form.provider, - }, - async: true, - }); +watch ( + () => form.location, + (location) => { + loadServerTypes(); + } +) + +loadLocations(); +loadServerTypes(); + +function loadLocations() { + if (form.provider && !props.locations) { + router.reload({ + only: ['locations'], + data: { + provider: form.provider, + }, + async: true, + }); + } +} + +function loadServerTypes() { + if (form.location && !props.serverTypes) { + router.reload({ + only: ['serverTypes', 'images'], + data: { + provider: form.provider, + location: form.location, + }, + async: true, + }); + } }