authorize('viewAny', [DatabaseUser::class, $server]); $this->validateRoute($project, $server); return DatabaseUserResource::collection($server->databaseUsers()->simplePaginate(25)); } #[Post('/', name: 'api.projects.servers.database-users.create', middleware: 'ability:write')] #[Endpoint(title: 'create', description: 'Create a new database user.')] #[BodyParam(name: 'username', required: true)] #[BodyParam(name: 'password', required: true)] #[BodyParam(name: 'host', description: 'Host, if it is a remote user.', example: '%')] #[ResponseFromApiResource(DatabaseUserResource::class, DatabaseUser::class)] public function create(Request $request, Project $project, Server $server): DatabaseUserResource { $this->authorize('create', [DatabaseUser::class, $server]); $this->validateRoute($project, $server); $this->validate($request, CreateDatabaseUser::rules($server, $request->input())); $databaseUser = app(CreateDatabaseUser::class)->create($server, $request->all()); return new DatabaseUserResource($databaseUser); } #[Get('{databaseUser}', name: 'api.projects.servers.database-users.show', middleware: 'ability:read')] #[Endpoint(title: 'show', description: 'Get a database user by ID.')] #[ResponseFromApiResource(DatabaseUserResource::class, DatabaseUser::class)] public function show(Project $project, Server $server, DatabaseUser $databaseUser): DatabaseUserResource { $this->authorize('view', [$databaseUser, $server]); $this->validateRoute($project, $server, $databaseUser); return new DatabaseUserResource($databaseUser); } #[Post('{databaseUser}/link', name: 'api.projects.servers.database-users.link', middleware: 'ability:write')] #[Endpoint(title: 'link', description: 'Link to databases')] #[BodyParam(name: 'databases', description: 'Array of database names to link to the user.', required: true)] #[ResponseFromApiResource(DatabaseUserResource::class, DatabaseUser::class)] public function link(Request $request, Project $project, Server $server, DatabaseUser $databaseUser): DatabaseUserResource { $this->authorize('update', [$databaseUser, $server]); $this->validateRoute($project, $server, $databaseUser); $this->validate($request, LinkUser::rules($server, $request->all())); $databaseUser = app(LinkUser::class)->link($databaseUser, $request->all()); return new DatabaseUserResource($databaseUser); } #[Delete('{databaseUser}', name: 'api.projects.servers.database-users.delete', middleware: 'ability:write')] #[Endpoint(title: 'delete', description: 'Delete database user.')] #[Response(status: 204)] public function delete(Project $project, Server $server, DatabaseUser $databaseUser): \Illuminate\Http\Response { $this->authorize('delete', [$databaseUser, $server]); $this->validateRoute($project, $server, $databaseUser); $databaseUser->delete(); return response()->noContent(); } private function validateRoute(Project $project, Server $server, ?DatabaseUser $databaseUser = null): void { if ($project->id !== $server->project_id) { abort(404, 'Server not found in project'); } if ($databaseUser && $databaseUser->server_id !== $server->id) { abort(404, 'Database user not found in server'); } } }