diff --git a/app/Actions/GetProviderService.php b/app/Actions/GetProviderService.php deleted file mode 100644 index d67ae76..0000000 --- a/app/Actions/GetProviderService.php +++ /dev/null @@ -1,17 +0,0 @@ - new HetznerService, - default => null, - }; - } -} diff --git a/app/Http/Controllers/ServerController.php b/app/Http/Controllers/ServerController.php index a98ccb6..7b9399b 100644 --- a/app/Http/Controllers/ServerController.php +++ b/app/Http/Controllers/ServerController.php @@ -4,10 +4,10 @@ namespace App\Http\Controllers; use App\Actions\GenerateRandomSlug; use App\Actions\GetProviderService; -use App\Enums\ServerProvider; use App\Enums\ServerStatus; use App\Jobs\Servers\WaitForServerToConnect; use App\Models\Organisation; +use App\Models\Provider; use Illuminate\Http\Request; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Str; @@ -30,7 +30,8 @@ class ServerController extends Controller $images = null; if ($request->has('provider')) { - $providerService = app(GetProviderService::class)->execute($request->provider); + $provider = Provider::findOrFail($request->provider); + $providerService = $provider->service(); if ($providerService) { $locations = Cache::remember($request->provider.'.locations', now()->addHour(), function () use ($providerService) { diff --git a/app/Http/Integrations/Connectors/HetznerConnector.php b/app/Http/Integrations/Connectors/HetznerConnector.php index 1def6fe..9f33a86 100644 --- a/app/Http/Integrations/Connectors/HetznerConnector.php +++ b/app/Http/Integrations/Connectors/HetznerConnector.php @@ -2,10 +2,16 @@ namespace App\Http\Integrations\Connectors; +use App\Models\Provider; use Saloon\Http\Connector; class HetznerConnector extends Connector { + public function __construct(protected readonly Provider $provider) + { + // + } + public function resolveBaseUrl(): string { return 'https://api.hetzner.cloud/v1'; @@ -16,7 +22,7 @@ class HetznerConnector extends Connector return [ 'Content-Type' => 'application/json', 'Accept' => 'application/json', - 'Authorization' => 'Bearer '.config('services.hetzner.key'), + 'Authorization' => 'Bearer '.$this->provider->token, ]; } } diff --git a/app/Models/Network.php b/app/Models/Network.php index 3f6e398..1639c72 100644 --- a/app/Models/Network.php +++ b/app/Models/Network.php @@ -3,7 +3,6 @@ namespace App\Models; use App\Enums\NetworkType; -use App\Enums\ServerProvider; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\HasMany; diff --git a/app/Models/Provider.php b/app/Models/Provider.php index 997e2bc..d7c1606 100644 --- a/app/Models/Provider.php +++ b/app/Models/Provider.php @@ -3,6 +3,8 @@ namespace App\Models; use App\Enums\ProviderType; +use App\Services\ServerProviders\HetznerService; +use App\Services\ServerProviders\ServerProviderService; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; @@ -27,4 +29,12 @@ class Provider extends Model { return $this->hasMany(Server::class); } + + public function service(): ?ServerProviderService + { + return match ($this->type) { + ProviderType::HETZNER => new HetznerService($this), + default => null, + }; + } } diff --git a/app/Models/Server.php b/app/Models/Server.php index b0a9826..a3e4268 100644 --- a/app/Models/Server.php +++ b/app/Models/Server.php @@ -2,7 +2,6 @@ namespace App\Models; -use App\Enums\ServerProvider; use App\Enums\ServerStatus; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; diff --git a/app/Services/ServerProviders/HetznerService.php b/app/Services/ServerProviders/HetznerService.php index 1a48abe..d1772c9 100644 --- a/app/Services/ServerProviders/HetznerService.php +++ b/app/Services/ServerProviders/HetznerService.php @@ -11,14 +11,15 @@ use App\Http\Integrations\Requests\Hetzner\Images\GetImagesRequest; use App\Http\Integrations\Requests\Hetzner\Locations\GetLocationsRequest; use App\Http\Integrations\Requests\Hetzner\Servers\CreateServerRequest; use App\Http\Integrations\Requests\Hetzner\ServerTypes\GetServerTypesRequest; +use App\Models\Provider; use Exception; use Illuminate\Support\Collection; class HetznerService extends ServerProviderService { - public function __construct() + public function __construct(Provider $provider) { - $this->connector = new HetznerConnector; + $this->connector = new HetznerConnector($provider); } public function createServer( diff --git a/database/factories/ServerFactory.php b/database/factories/ServerFactory.php index 7d0408e..387906b 100644 --- a/database/factories/ServerFactory.php +++ b/database/factories/ServerFactory.php @@ -2,7 +2,6 @@ namespace Database\Factories; -use App\Enums\ServerProvider; use App\Enums\ServerStatus; use Illuminate\Database\Eloquent\Factories\Factory; diff --git a/tests/Feature/ServerControllerTest.php b/tests/Feature/ServerControllerTest.php index 5fc8cd0..4daf4a9 100644 --- a/tests/Feature/ServerControllerTest.php +++ b/tests/Feature/ServerControllerTest.php @@ -54,23 +54,6 @@ test('store route fails with invalid provider', function () { test('store route creates a server with valid data', function () { $organisation = Organisation::factory()->create(); - $this->mock(GetProviderService::class, function ($mock) { - $providerMock = \Mockery::mock(\App\Services\ServerProviders\ServerProviderService::class); - - $providerMock->shouldReceive('createServer')->andReturn( - new CreatedServer( - name: 'test-server', - id: 123, - ipv4: '127.0.0.1', - ipv6: '::1', - status: 'running', - rootPassword: Str::random(16), - ) - ); - - $mock->shouldReceive('execute')->andReturn($providerMock); - }); - $response = $this->post(route('servers.store', ['organisation' => $organisation->id]), [ 'provider' => 'hetzner', 'server_type' => 'cx11',