Add endpoint for reading and updating site .env file (#564)

* feat(api): Add endpoint for reading site .env file

- Add GET /api/projects/{project}/servers/{server}/sites/{site}/env endpoint
- Add feature tests with SSH mocking

* added updating env

* fix coding style

* generate docs

---------

Co-authored-by: Saeed Vaziry <mr.saeedvaziry@gmail.com>
This commit is contained in:
Dimitar Yanakiev
2025-04-05 20:59:57 +03:00
committed by GitHub
parent 2a670146d8
commit e98e974e20
31 changed files with 2404 additions and 1395 deletions

View File

@ -6,6 +6,7 @@
use App\Actions\Site\Deploy;
use App\Actions\Site\UpdateAliases;
use App\Actions\Site\UpdateDeploymentScript;
use App\Actions\Site\UpdateEnv;
use App\Actions\Site\UpdateLoadBalancer;
use App\Enums\LoadBalancerMethod;
use App\Enums\SiteType;
@ -184,6 +185,45 @@ public function showDeploymentScript(Project $project, Server $server, Site $sit
]);
}
#[Get('{site}/env', name: 'api.projects.servers.sites.env.show', middleware: 'ability:read')]
#[Endpoint(title: 'env', description: 'Get site .env file content')]
#[Response(content: [
'data' => [
'env' => 'APP_NAME=Laravel\nAPP_ENV=production',
],
], status: 200)]
public function showEnv(Project $project, Server $server, Site $site): \Illuminate\Http\JsonResponse
{
$this->authorize('view', [$site, $server]);
$this->validateRoute($project, $server, $site);
return response()->json([
'data' => [
'env' => $site->getEnv(),
],
]);
}
#[Put('{site}/env', name: 'api.projects.servers.sites.env', middleware: 'ability:write')]
#[Endpoint(title: 'env', description: 'Update site .env file')]
#[BodyParam(name: 'env', type: 'string', description: 'Content of the .env file')]
#[Response(status: 200)]
public function updateEnv(Request $request, Project $project, Server $server, Site $site): SiteResource
{
$this->authorize('update', [$site, $server]);
$this->validateRoute($project, $server, $site);
$this->validate($request, [
'env' => ['required', 'string'],
]);
app(UpdateEnv::class)->update($site, $request->all());
return new SiteResource($site);
}
private function validateRoute(Project $project, Server $server, ?Site $site = null): void
{
if ($project->id !== $server->project_id) {