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