Path: blob/1.0-develop/app/Http/Controllers/Api/Client/Servers/DatabaseController.php
14056 views
<?php12namespace Pterodactyl\Http\Controllers\Api\Client\Servers;34use Illuminate\Http\Response;5use Pterodactyl\Models\Server;6use Pterodactyl\Models\Database;7use Pterodactyl\Facades\Activity;8use Pterodactyl\Exceptions\DisplayException;9use Pterodactyl\Services\Databases\DatabasePasswordService;10use Pterodactyl\Transformers\Api\Client\DatabaseTransformer;11use Pterodactyl\Services\Databases\DatabaseManagementService;12use Pterodactyl\Services\Databases\DeployServerDatabaseService;13use Pterodactyl\Http\Controllers\Api\Client\ClientApiController;14use Pterodactyl\Http\Requests\Api\Client\Servers\Databases\GetDatabasesRequest;15use Pterodactyl\Http\Requests\Api\Client\Servers\Databases\StoreDatabaseRequest;16use Pterodactyl\Http\Requests\Api\Client\Servers\Databases\DeleteDatabaseRequest;17use Pterodactyl\Http\Requests\Api\Client\Servers\Databases\RotatePasswordRequest;1819class DatabaseController extends ClientApiController20{21/**22* DatabaseController constructor.23*/24public function __construct(25private DeployServerDatabaseService $deployDatabaseService,26private DatabaseManagementService $managementService,27private DatabasePasswordService $passwordService,28) {29parent::__construct();30}3132/**33* Return all the databases that belong to the given server.34*/35public function index(GetDatabasesRequest $request, Server $server): array36{37return $this->fractal->collection($server->databases)38->transformWith($this->getTransformer(DatabaseTransformer::class))39->toArray();40}4142/**43* Create a new database for the given server and return it.44*45* @throws \Throwable46* @throws \Pterodactyl\Exceptions\Service\Database\TooManyDatabasesException47* @throws \Pterodactyl\Exceptions\Service\Database\DatabaseClientFeatureNotEnabledException48*/49public function store(StoreDatabaseRequest $request, Server $server): array50{51$database = Activity::event('server:database.create')->transaction(function ($log) use ($request, $server) {52if ($server->databases()->lockForUpdate()->count() >= $server->database_limit) {53throw new DisplayException('Cannot create additional databases on this server: limit has been reached.');54}5556$database = $this->deployDatabaseService->handle($server, $request->validated());5758$log->subject($database)->property('name', $database->database);5960return $database;61});6263return $this->fractal->item($database)64->parseIncludes(['password'])65->transformWith($this->getTransformer(DatabaseTransformer::class))66->toArray();67}6869/**70* Rotates the password for the given server model and returns a fresh instance to71* the caller.72*73* @throws \Throwable74*/75public function rotatePassword(RotatePasswordRequest $request, Server $server, Database $database): array76{77Activity::event('server:database.rotate-password')78->subject($database)79->property('name', $database->database)80->transaction(fn () => $this->passwordService->handle($database));8182return $this->fractal->item($database->refresh())83->parseIncludes(['password'])84->transformWith($this->getTransformer(DatabaseTransformer::class))85->toArray();86}8788/**89* Removes a database from the server.90*91* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException92*/93public function delete(DeleteDatabaseRequest $request, Server $server, Database $database): Response94{95$this->managementService->delete($database);9697Activity::event('server:database.delete')98->subject($database)99->property('name', $database->database)100->log();101102return new Response('', Response::HTTP_NO_CONTENT);103}104}105106107