Add endpoint for reading & updating site deployment script (#562)

* feat(api): Add endpoint for updating site deployment script

- Add PUT /api/projects/{project}/servers/{server}/sites/{site}/deployment-script endpoint
- Add feature tests for successful and failed updates

* added reading deployment script as well

* generate docs

---------

Co-authored-by: Saeed Vaziry <mr.saeedvaziry@gmail.com>
This commit is contained in:
Dimitar Yanakiev
2025-03-29 22:49:28 +02:00
committed by GitHub
parent 03be2d3ee2
commit 7882d2022c
33 changed files with 4072 additions and 1701 deletions

View File

@ -4,6 +4,7 @@
use App\Actions\Site\CreateSite;
use App\Actions\Site\UpdateAliases;
use App\Actions\Site\UpdateDeploymentScript;
use App\Actions\Site\UpdateLoadBalancer;
use App\Enums\LoadBalancerMethod;
use App\Enums\SiteType;
@ -132,6 +133,37 @@ public function updateAliases(Request $request, Project $project, Server $server
return new SiteResource($site);
}
#[Put('{site}/deployment-script', name: 'api.projects.servers.sites.deployment-script', middleware: 'ability:write')]
#[Endpoint(title: 'deployment-script', description: 'Update site deployment script')]
#[BodyParam(name: 'script', type: 'string', description: 'Content of the deployment script')]
#[Response(status: 204)]
public function updateDeploymentScript(Request $request, Project $project, Server $server, Site $site): \Illuminate\Http\Response
{
$this->authorize('update', [$site, $server]);
$this->validateRoute($project, $server, $site);
$this->validate($request, UpdateDeploymentScript::rules());
app(UpdateDeploymentScript::class)->update($site, $request->all());
return response()->noContent();
}
#[Get('{site}/deployment-script', name: 'api.projects.servers.sites.deployment-script.show', middleware: 'ability:read')]
#[Endpoint(title: 'deployment-script', description: 'Get site deployment script content')]
#[Response(status: 200)]
public function showDeploymentScript(Project $project, Server $server, Site $site): \Illuminate\Http\JsonResponse
{
$this->authorize('view', [$site, $server]);
$this->validateRoute($project, $server, $site);
return response()->json([
'script' => $site->deploymentScript?->content,
]);
}
private function validateRoute(Project $project, Server $server, ?Site $site = null): void
{
if ($project->id !== $server->project_id) {