Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pterodactyl
GitHub Repository: pterodactyl/panel
Path: blob/1.0-develop/app/Http/Controllers/Api/Client/Servers/DatabaseController.php
14056 views
1
<?php
2
3
namespace Pterodactyl\Http\Controllers\Api\Client\Servers;
4
5
use Illuminate\Http\Response;
6
use Pterodactyl\Models\Server;
7
use Pterodactyl\Models\Database;
8
use Pterodactyl\Facades\Activity;
9
use Pterodactyl\Exceptions\DisplayException;
10
use Pterodactyl\Services\Databases\DatabasePasswordService;
11
use Pterodactyl\Transformers\Api\Client\DatabaseTransformer;
12
use Pterodactyl\Services\Databases\DatabaseManagementService;
13
use Pterodactyl\Services\Databases\DeployServerDatabaseService;
14
use Pterodactyl\Http\Controllers\Api\Client\ClientApiController;
15
use Pterodactyl\Http\Requests\Api\Client\Servers\Databases\GetDatabasesRequest;
16
use Pterodactyl\Http\Requests\Api\Client\Servers\Databases\StoreDatabaseRequest;
17
use Pterodactyl\Http\Requests\Api\Client\Servers\Databases\DeleteDatabaseRequest;
18
use Pterodactyl\Http\Requests\Api\Client\Servers\Databases\RotatePasswordRequest;
19
20
class DatabaseController extends ClientApiController
21
{
22
/**
23
* DatabaseController constructor.
24
*/
25
public function __construct(
26
private DeployServerDatabaseService $deployDatabaseService,
27
private DatabaseManagementService $managementService,
28
private DatabasePasswordService $passwordService,
29
) {
30
parent::__construct();
31
}
32
33
/**
34
* Return all the databases that belong to the given server.
35
*/
36
public function index(GetDatabasesRequest $request, Server $server): array
37
{
38
return $this->fractal->collection($server->databases)
39
->transformWith($this->getTransformer(DatabaseTransformer::class))
40
->toArray();
41
}
42
43
/**
44
* Create a new database for the given server and return it.
45
*
46
* @throws \Throwable
47
* @throws \Pterodactyl\Exceptions\Service\Database\TooManyDatabasesException
48
* @throws \Pterodactyl\Exceptions\Service\Database\DatabaseClientFeatureNotEnabledException
49
*/
50
public function store(StoreDatabaseRequest $request, Server $server): array
51
{
52
$database = Activity::event('server:database.create')->transaction(function ($log) use ($request, $server) {
53
if ($server->databases()->lockForUpdate()->count() >= $server->database_limit) {
54
throw new DisplayException('Cannot create additional databases on this server: limit has been reached.');
55
}
56
57
$database = $this->deployDatabaseService->handle($server, $request->validated());
58
59
$log->subject($database)->property('name', $database->database);
60
61
return $database;
62
});
63
64
return $this->fractal->item($database)
65
->parseIncludes(['password'])
66
->transformWith($this->getTransformer(DatabaseTransformer::class))
67
->toArray();
68
}
69
70
/**
71
* Rotates the password for the given server model and returns a fresh instance to
72
* the caller.
73
*
74
* @throws \Throwable
75
*/
76
public function rotatePassword(RotatePasswordRequest $request, Server $server, Database $database): array
77
{
78
Activity::event('server:database.rotate-password')
79
->subject($database)
80
->property('name', $database->database)
81
->transaction(fn () => $this->passwordService->handle($database));
82
83
return $this->fractal->item($database->refresh())
84
->parseIncludes(['password'])
85
->transformWith($this->getTransformer(DatabaseTransformer::class))
86
->toArray();
87
}
88
89
/**
90
* Removes a database from the server.
91
*
92
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
93
*/
94
public function delete(DeleteDatabaseRequest $request, Server $server, Database $database): Response
95
{
96
$this->managementService->delete($database);
97
98
Activity::event('server:database.delete')
99
->subject($database)
100
->property('name', $database->database)
101
->log();
102
103
return new Response('', Response::HTTP_NO_CONTENT);
104
}
105
}
106
107