authorize('viewAny', [Database::class, $server]); $this->validateRoute($project, $server); return DatabaseResource::collection($server->databases()->simplePaginate(25)); } #[Post('/', name: 'api.projects.servers.databases.create', middleware: 'ability:write')] #[Endpoint(title: 'create', description: 'Create a new database.')] #[BodyParam(name: 'name', required: true)] #[ResponseFromApiResource(DatabaseResource::class, Database::class)] public function create(Request $request, Project $project, Server $server): DatabaseResource { $this->authorize('create', [Database::class, $server]); $this->validateRoute($project, $server); $this->validate($request, CreateDatabase::rules($server, $request->input())); $database = app(CreateDatabase::class)->create($server, $request->all()); return new DatabaseResource($database); } #[Get('{database}', name: 'api.projects.servers.databases.show', middleware: 'ability:read')] #[Endpoint(title: 'show', description: 'Get a database by ID.')] #[ResponseFromApiResource(DatabaseResource::class, Database::class)] public function show(Project $project, Server $server, Database $database): DatabaseResource { $this->authorize('view', [$database, $server]); $this->validateRoute($project, $server, $database); return new DatabaseResource($database); } #[Delete('{database}', name: 'api.projects.servers.databases.delete', middleware: 'ability:write')] #[Endpoint(title: 'delete', description: 'Delete database.')] #[Response(status: 204)] public function delete(Project $project, Server $server, Database $database) { $this->authorize('delete', [$database, $server]); $this->validateRoute($project, $server, $database); $database->delete(); return response()->noContent(); } private function validateRoute(Project $project, Server $server, ?Database $database = null): void { if ($project->id !== $server->project_id) { abort(404, 'Server not found in project'); } if ($database && $database->server_id !== $server->id) { abort(404, 'Database not found in server'); } } }