diff --git a/app/Enums/ServerProvider.php b/app/Enums/ProviderType.php similarity index 85% rename from app/Enums/ServerProvider.php rename to app/Enums/ProviderType.php index 02686ad..0dc59e7 100644 --- a/app/Enums/ServerProvider.php +++ b/app/Enums/ProviderType.php @@ -4,7 +4,7 @@ namespace App\Enums; use App\Enums\Concerns\Arrayable; -enum ServerProvider: string +enum ProviderType: string { use Arrayable; diff --git a/app/Http/Controllers/ServerController.php b/app/Http/Controllers/ServerController.php index 154b272..a98ccb6 100644 --- a/app/Http/Controllers/ServerController.php +++ b/app/Http/Controllers/ServerController.php @@ -72,7 +72,7 @@ class ServerController extends Controller $server = $organisation->servers()->create([ 'name' => $createdServer->name, - 'provider' => ServerProvider::tryFrom($request->provider), + // 'provider' => ServerProvider::tryFrom($request->provider), // @todo 'provider_id' => $createdServer->id, 'ipv4' => $createdServer->ipv4, 'ipv6' => $createdServer->ipv6, diff --git a/app/Models/Network.php b/app/Models/Network.php index c6a864a..3f6e398 100644 --- a/app/Models/Network.php +++ b/app/Models/Network.php @@ -16,7 +16,6 @@ class Network extends Model { return [ 'type' => NetworkType::class, - 'provider' => ServerProvider::class, ]; } @@ -34,4 +33,9 @@ class Network extends Model { return $this->belongsTo(Organisation::class); } + + public function provider(): BelongsTo + { + return $this->belongsTo(Provider::class); + } } diff --git a/app/Models/Provider.php b/app/Models/Provider.php new file mode 100644 index 0000000..997e2bc --- /dev/null +++ b/app/Models/Provider.php @@ -0,0 +1,30 @@ + 'encrypted', + 'type' => ProviderType::class, + ]; + } + + public function networks(): HasMany + { + return $this->hasMany(Network::class); + } + + public function servers(): HasMany + { + return $this->hasMany(Server::class); + } +} diff --git a/app/Models/Server.php b/app/Models/Server.php index 235c095..b0a9826 100644 --- a/app/Models/Server.php +++ b/app/Models/Server.php @@ -20,7 +20,6 @@ class Server extends Model protected function casts(): array { return [ - 'provider' => ServerProvider::class, 'status' => ServerStatus::class, ]; } @@ -66,6 +65,11 @@ class Server extends Model return $this->hasMany(FirewallRule::class); } + public function provider(): BelongsTo + { + return $this->belongsTo(Provider::class); + } + public function sshClient(string $user = 'root'): Ssh { return Ssh::create($user, $this->ipv4) diff --git a/config/services.php b/config/services.php index a9c2aef..fc45adb 100644 --- a/config/services.php +++ b/config/services.php @@ -35,8 +35,8 @@ return [ ], ], - 'hetzner' => [ - 'key' => env('HETZNER_KEY'), - ], + // 'hetzner' => [ + // 'key' => env('HETZNER_KEY'), + // ], ]; diff --git a/database/factories/ServerFactory.php b/database/factories/ServerFactory.php index a3be484..7d0408e 100644 --- a/database/factories/ServerFactory.php +++ b/database/factories/ServerFactory.php @@ -20,8 +20,6 @@ class ServerFactory extends Factory { return [ 'name' => $this->faker->word(), - 'provider' => ServerProvider::HETZNER, - 'provider_id' => $this->faker->uuid(), 'ipv4' => $this->faker->ipv4(), 'ipv6' => $this->faker->ipv6(), 'provider_status' => '', @@ -41,4 +39,13 @@ class ServerFactory extends Factory ]; }); } + + public function forProvider(string $providerId): static + { + return $this->state(function (array $attributes) use ($providerId) { + return [ + 'provider_id' => $providerId, + ]; + }); + } } diff --git a/database/migrations/2025_03_27_120552_create_servers_table.php b/database/migrations/2025_03_27_120552_create_servers_table.php index 871b050..ef5ce1b 100644 --- a/database/migrations/2025_03_27_120552_create_servers_table.php +++ b/database/migrations/2025_03_27_120552_create_servers_table.php @@ -2,6 +2,7 @@ use App\Models\Network; use App\Models\Organisation; +use App\Models\Provider; use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; @@ -15,9 +16,9 @@ return new class extends Migration $table->foreignIdFor(Organisation::class); $table->foreignIdFor(Network::class, 'external_network_id'); $table->foreignIdFor(Network::class, 'internal_network_id'); + $table->foreignIdFor(Provider::class); + $table->string('provider_external_id')->nullable(); $table->string('name'); - $table->string('provider'); - $table->string('provider_id'); $table->string('ipv4'); $table->string('ipv6'); $table->string('private_ip'); diff --git a/database/migrations/2025_04_06_171437_create_networks_table.php b/database/migrations/2025_04_06_171437_create_networks_table.php index b264043..91d9a8a 100644 --- a/database/migrations/2025_04_06_171437_create_networks_table.php +++ b/database/migrations/2025_04_06_171437_create_networks_table.php @@ -1,6 +1,7 @@ id(); $table->foreignIdFor(Organisation::class); + $table->foreignIdFor(Provider::class); + $table->string('provider_external_id')->nullable(); $table->string('type'); - $table->string('provider')->nullable(); - $table->string('provider_id')->nullable(); $table->string('name'); $table->string('ip_range'); $table->timestamps(); diff --git a/database/migrations/2025_04_07_132552_create_providers_table.php b/database/migrations/2025_04_07_132552_create_providers_table.php new file mode 100644 index 0000000..70e43bc --- /dev/null +++ b/database/migrations/2025_04_07_132552_create_providers_table.php @@ -0,0 +1,29 @@ +id(); + $table->foreignIdFor(Organisation::class); + $table->string('name'); + $table->string('type'); + $table->text('token'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('providers'); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index ffce97d..fc59cc1 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -3,6 +3,7 @@ namespace Database\Seeders; use App\Enums\OrganisationRole; +use App\Enums\ProviderType; use App\Enums\RepositoryType; use App\Models\Organisation; use App\Models\Server; @@ -32,7 +33,16 @@ class DatabaseSeeder extends Seeder 'owner_id' => 1, ]); - $servers = Server::factory(40)->forOrganisation($organisation->id)->create(); + $provider = $organisation->providers()->create([ + 'name' => 'Hetzner', + 'type' => ProviderType::HETZNER, + 'token' => env('HETZNER_KEY'), + ]); + + $servers = Server::factory(40) + ->forOrganisation($organisation->id) + ->forProvider($provider->id) + ->create(); $organisation->servers()->saveMany($servers);