44
55use Illuminate \View \View ;
66use Illuminate \Http \Request ;
7+ use Illuminate \Http \Response ;
78use Illuminate \Http \JsonResponse ;
9+ use Illuminate \Http \RedirectResponse ;
10+ use Prologue \Alerts \AlertsMessageBag ;
811use Pterodactyl \Http \Controllers \Controller ;
912use Pterodactyl \Traits \Controllers \JavascriptInjection ;
1013use Pterodactyl \Services \Databases \DatabasePasswordService ;
14+ use Pterodactyl \Services \Databases \DatabaseManagementService ;
15+ use Pterodactyl \Services \Databases \DeployServerDatabaseService ;
1116use Pterodactyl \Contracts \Repository \DatabaseRepositoryInterface ;
17+ use Pterodactyl \Contracts \Repository \DatabaseHostRepositoryInterface ;
18+ use Pterodactyl \Http \Requests \Server \Database \StoreServerDatabaseRequest ;
19+ use Pterodactyl \Http \Requests \Server \Database \DeleteServerDatabaseRequest ;
1220
1321class DatabaseController extends Controller
1422{
1523 use JavascriptInjection;
1624
25+ /**
26+ * @var \Prologue\Alerts\AlertsMessageBag
27+ */
28+ private $ alert ;
29+
30+ /**
31+ * @var \Pterodactyl\Services\Databases\DeployServerDatabaseService
32+ */
33+ private $ deployServerDatabaseService ;
34+
35+ /**
36+ * @var \Pterodactyl\Contracts\Repository\DatabaseHostRepositoryInterface
37+ */
38+ private $ databaseHostRepository ;
39+
40+ /**
41+ * @var \Pterodactyl\Services\Databases\DatabaseManagementService
42+ */
43+ private $ managementService ;
44+
1745 /**
1846 * @var \Pterodactyl\Services\Databases\DatabasePasswordService
1947 */
20- protected $ passwordService ;
48+ private $ passwordService ;
2149
2250 /**
2351 * @var \Pterodactyl\Contracts\Repository\DatabaseRepositoryInterface
2452 */
25- protected $ repository ;
53+ private $ repository ;
2654
2755 /**
2856 * DatabaseController constructor.
2957 *
30- * @param \Pterodactyl\Services\Databases\DatabasePasswordService $passwordService
31- * @param \Pterodactyl\Contracts\Repository\DatabaseRepositoryInterface $repository
58+ * @param \Prologue\Alerts\AlertsMessageBag $alert
59+ * @param \Pterodactyl\Services\Databases\DeployServerDatabaseService $deployServerDatabaseService
60+ * @param \Pterodactyl\Contracts\Repository\DatabaseHostRepositoryInterface $databaseHostRepository
61+ * @param \Pterodactyl\Services\Databases\DatabaseManagementService $managementService
62+ * @param \Pterodactyl\Services\Databases\DatabasePasswordService $passwordService
63+ * @param \Pterodactyl\Contracts\Repository\DatabaseRepositoryInterface $repository
3264 */
33- public function __construct (DatabasePasswordService $ passwordService , DatabaseRepositoryInterface $ repository )
34- {
65+ public function __construct (
66+ AlertsMessageBag $ alert ,
67+ DeployServerDatabaseService $ deployServerDatabaseService ,
68+ DatabaseHostRepositoryInterface $ databaseHostRepository ,
69+ DatabaseManagementService $ managementService ,
70+ DatabasePasswordService $ passwordService ,
71+ DatabaseRepositoryInterface $ repository
72+ ) {
73+ $ this ->alert = $ alert ;
74+ $ this ->databaseHostRepository = $ databaseHostRepository ;
75+ $ this ->deployServerDatabaseService = $ deployServerDatabaseService ;
76+ $ this ->managementService = $ managementService ;
3577 $ this ->passwordService = $ passwordService ;
3678 $ this ->repository = $ repository ;
3779 }
@@ -50,11 +92,42 @@ public function index(Request $request): View
5092 $ this ->authorize ('view-databases ' , $ server );
5193 $ this ->setRequest ($ request )->injectJavascript ();
5294
95+ $ canCreateDatabase = config ('pterodactyl.client_features.databases.enabled ' );
96+ $ allowRandom = config ('pterodactyl.client_features.databases.allow_random ' );
97+
98+ if ($ this ->databaseHostRepository ->findCountWhere ([['node_id ' , '= ' , $ server ->node_id ]]) === 0 ) {
99+ if ($ canCreateDatabase && ! $ allowRandom ) {
100+ $ canCreateDatabase = false ;
101+ }
102+ }
103+
104+ $ databases = $ this ->repository ->getDatabasesForServer ($ server ->id );
105+
53106 return view ('server.databases.index ' , [
54- 'databases ' => $ this ->repository ->getDatabasesForServer ($ server ->id ),
107+ 'allowCreation ' => $ canCreateDatabase ,
108+ 'overLimit ' => ! is_null ($ server ->database_limit ) && count ($ databases ) >= $ server ->database_limit ,
109+ 'databases ' => $ databases ,
55110 ]);
56111 }
57112
113+ /**
114+ * Handle a request from a user to create a new database for the server.
115+ *
116+ * @param \Pterodactyl\Http\Requests\Server\Database\StoreServerDatabaseRequest $request
117+ * @return \Illuminate\Http\RedirectResponse
118+ *
119+ * @throws \Exception
120+ * @throws \Pterodactyl\Exceptions\Service\Database\DatabaseClientFeatureNotEnabledException
121+ */
122+ public function store (StoreServerDatabaseRequest $ request ): RedirectResponse
123+ {
124+ $ this ->deployServerDatabaseService ->handle ($ request ->getServer (), $ request ->validated ());
125+
126+ $ this ->alert ->success ('Successfully created a new database. ' )->flash ();
127+
128+ return redirect ()->route ('server.databases.index ' , $ request ->getServer ()->uuidShort );
129+ }
130+
58131 /**
59132 * Handle a request to update the password for a specific database.
60133 *
@@ -74,4 +147,19 @@ public function update(Request $request): JsonResponse
74147
75148 return response ()->json (['password ' => $ password ]);
76149 }
150+
151+ /**
152+ * Delete a database for this server from the SQL server and Panel database.
153+ *
154+ * @param \Pterodactyl\Http\Requests\Server\Database\DeleteServerDatabaseRequest $request
155+ * @return \Illuminate\Http\Response
156+ *
157+ * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
158+ */
159+ public function delete (DeleteServerDatabaseRequest $ request ): Response
160+ {
161+ $ this ->managementService ->delete ($ request ->attributes ->get ('database ' )->id );
162+
163+ return response ('' , Response::HTTP_NO_CONTENT );
164+ }
77165}
0 commit comments