From a32342d12633daba9f4da5a4cc15a1f3f77493a0 Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Fri, 15 Aug 2025 20:24:32 +0200 Subject: [PATCH] feat(api): add create_environment endpoint to ProjectController for environment creation in projects --- .../Controllers/Api/ProjectController.php | 70 +++++++++++++++++++ routes/api.php | 1 + 2 files changed, 71 insertions(+) diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php index 98637c3e8..c56a469e6 100644 --- a/app/Http/Controllers/Api/ProjectController.php +++ b/app/Http/Controllers/Api/ProjectController.php @@ -447,4 +447,74 @@ class ProjectController extends Controller return response()->json(['message' => 'Project deleted.']); } + + #[OA\Post( + summary: 'Create Environment', + description: 'Create environment in project.', + path: '/projects/{uuid}/{environment_name}', + operationId: 'create-environment', + security: [ + ['bearerAuth' => []], + ], + tags: ['Projects'], + parameters: [ + new OA\Parameter(name: 'uuid', in: 'path', required: true, description: 'Project UUID', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'environment_name', in: 'path', required: true, description: 'Environment name', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response( + response: 201, + description: 'Environment created.', + content: [ + new OA\MediaType( + mediaType: 'application/json', + schema: new OA\Schema( + type: 'object', + properties: [ + 'uuid' => ['type' => 'string', 'example' => 'env123', 'description' => 'The UUID of the environment.'], + ] + ) + ), + ]), + new OA\Response( + response: 401, + ref: '#/components/responses/401', + ), + new OA\Response( + response: 400, + ref: '#/components/responses/400', + ), + new OA\Response( + response: 404, + description: 'Project not found.', + ), + ] + )] + public function create_environment(Request $request) + { + $teamId = getTeamIdFromToken(); + if (is_null($teamId)) { + return invalidTokenResponse(); + } + + if (! $request->uuid) { + return response()->json(['message' => 'Project UUID is required.'], 422); + } + if (! $request->environment_name) { + return response()->json(['message' => 'Environment name is required.'], 422); + } + + $project = Project::whereTeamId($teamId)->whereUuid($request->uuid)->first(); + if (! $project) { + return response()->json(['message' => 'Project not found.'], 404); + } + + $environment = $project->environments()->create([ + 'name' => $request->environment_name, + ]); + + return response()->json([ + 'uuid' => $environment->uuid, + ])->setStatusCode(201); + } } diff --git a/routes/api.php b/routes/api.php index d63e3ee0e..e6090f581 100644 --- a/routes/api.php +++ b/routes/api.php @@ -48,6 +48,7 @@ Route::group([ Route::get('/projects/{uuid}/{environment_name_or_uuid}', [ProjectController::class, 'environment_details'])->middleware(['api.ability:read']); Route::post('/projects', [ProjectController::class, 'create_project'])->middleware(['api.ability:read']); + Route::post('/projects/{uuid}/{environment_name}', [ProjectController::class, 'create_environment'])->middleware(['api.ability:write']); Route::patch('/projects/{uuid}', [ProjectController::class, 'update_project'])->middleware(['api.ability:write']); Route::delete('/projects/{uuid}', [ProjectController::class, 'delete_project'])->middleware(['api.ability:write']);