Skip to content

Commit 9be2aa4

Browse files
committed
Push beginning of DB deletion stuff
1 parent c28e9c1 commit 9be2aa4

File tree

9 files changed

+120
-16
lines changed

9 files changed

+120
-16
lines changed

app/Http/Controllers/Api/Client/Servers/DatabaseController.php

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@
22

33
namespace Pterodactyl\Http\Controllers\Api\Client\Servers;
44

5+
use Illuminate\Http\Response;
56
use Pterodactyl\Models\Server;
67
use Pterodactyl\Transformers\Api\Client\DatabaseTransformer;
8+
use Pterodactyl\Services\Databases\DatabaseManagementService;
79
use Pterodactyl\Services\Databases\DeployServerDatabaseService;
810
use Pterodactyl\Http\Controllers\Api\Client\ClientApiController;
911
use Pterodactyl\Contracts\Repository\DatabaseRepositoryInterface;
1012
use Pterodactyl\Http\Requests\Api\Client\Servers\Databases\GetDatabasesRequest;
1113
use Pterodactyl\Http\Requests\Api\Client\Servers\Databases\StoreDatabaseRequest;
14+
use Pterodactyl\Http\Requests\Api\Client\Servers\Databases\DeleteDatabaseRequest;
1215

1316
class DatabaseController extends ClientApiController
1417
{
@@ -22,18 +25,28 @@ class DatabaseController extends ClientApiController
2225
*/
2326
private $repository;
2427

28+
/**
29+
* @var \Pterodactyl\Services\Databases\DatabaseManagementService
30+
*/
31+
private $managementService;
32+
2533
/**
2634
* DatabaseController constructor.
2735
*
36+
* @param \Pterodactyl\Services\Databases\DatabaseManagementService $managementService
2837
* @param \Pterodactyl\Contracts\Repository\DatabaseRepositoryInterface $repository
2938
* @param \Pterodactyl\Services\Databases\DeployServerDatabaseService $deployDatabaseService
3039
*/
31-
public function __construct(DatabaseRepositoryInterface $repository, DeployServerDatabaseService $deployDatabaseService)
32-
{
40+
public function __construct(
41+
DatabaseManagementService $managementService,
42+
DatabaseRepositoryInterface $repository,
43+
DeployServerDatabaseService $deployDatabaseService
44+
) {
3345
parent::__construct();
3446

3547
$this->deployDatabaseService = $deployDatabaseService;
3648
$this->repository = $repository;
49+
$this->managementService = $managementService;
3750
}
3851

3952
/**
@@ -66,4 +79,16 @@ public function store(StoreDatabaseRequest $request): array
6679
->transformWith($this->getTransformer(DatabaseTransformer::class))
6780
->toArray();
6881
}
82+
83+
/**
84+
* @param \Pterodactyl\Http\Requests\Api\Client\Servers\Databases\DeleteDatabaseRequest $request
85+
* @return \Illuminate\Http\Response
86+
*
87+
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
88+
*/
89+
public function delete(DeleteDatabaseRequest $request): Response
90+
{
91+
return Response::create('', Response::HTTP_NO_CONTENT);
92+
// $this->managementService->delete($request->input('database'));
93+
}
6994
}

app/Http/Middleware/Api/Client/SubstituteClientApiBindings.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44

55
use Closure;
66
use Illuminate\Container\Container;
7+
use Pterodactyl\Contracts\Extensions\HashidsInterface;
78
use Pterodactyl\Http\Middleware\Api\ApiSubstituteBindings;
89
use Pterodactyl\Exceptions\Repository\RecordNotFoundException;
910
use Pterodactyl\Contracts\Repository\ServerRepositoryInterface;
11+
use Pterodactyl\Contracts\Repository\DatabaseRepositoryInterface;
1012

1113
class SubstituteClientApiBindings extends ApiSubstituteBindings
1214
{
@@ -34,6 +36,20 @@ public function handle($request, Closure $next)
3436
}
3537
});
3638

39+
$this->router->bind('database', function ($value) use ($request) {
40+
try {
41+
$id = Container::getInstance()->make(HashidsInterface::class)->decodeFirst($value);
42+
43+
return Container::getInstance()->make(DatabaseRepositoryInterface::class)->findFirstWhere([
44+
['id', '=', $id],
45+
]);
46+
} catch (RecordNotFoundException $exception) {
47+
$request->attributes->set('is_missing_model', true);
48+
49+
return null;
50+
}
51+
});
52+
3753
return parent::handle($request, $next);
3854
}
3955
}

app/Http/Requests/Api/Application/ApplicationApiRequest.php

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,10 +126,6 @@ protected function prepareForValidation()
126126
*
127127
* @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
128128
*/
129-
130-
/**
131-
* @return bool
132-
*/
133129
protected function passesAuthorization()
134130
{
135131
// If we have already validated we do not need to call this function
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
namespace Pterodactyl\Http\Requests\Api\Client\Servers\Databases;
4+
5+
use Pterodactyl\Models\Server;
6+
use Pterodactyl\Models\Database;
7+
use Pterodactyl\Contracts\Http\ClientPermissionsRequest;
8+
use Pterodactyl\Http\Requests\Api\Client\ClientApiRequest;
9+
10+
class DeleteDatabaseRequest extends ClientApiRequest implements ClientPermissionsRequest
11+
{
12+
/**
13+
* @return string
14+
*/
15+
public function permission(): string
16+
{
17+
return 'delete-database';
18+
}
19+
20+
/**
21+
* Determine if the provided database even belongs to this server instance.
22+
*
23+
* @return bool
24+
*/
25+
public function resourceExists(): bool
26+
{
27+
$server = $this->getModel(Server::class);
28+
$database = $this->getModel(Database::class);
29+
30+
return $database->server_id === $server->id;
31+
}
32+
}

app/Transformers/Api/Client/DatabaseTransformer.php

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Pterodactyl\Models\Database;
66
use League\Fractal\Resource\Item;
77
use Illuminate\Contracts\Encryption\Encrypter;
8+
use Pterodactyl\Contracts\Extensions\HashidsInterface;
89

910
class DatabaseTransformer extends BaseClientTransformer
1011
{
@@ -15,14 +16,21 @@ class DatabaseTransformer extends BaseClientTransformer
1516
*/
1617
private $encrypter;
1718

19+
/**
20+
* @var \Pterodactyl\Contracts\Extensions\HashidsInterface
21+
*/
22+
private $hashids;
23+
1824
/**
1925
* Handle dependency injection.
2026
*
21-
* @param \Illuminate\Contracts\Encryption\Encrypter $encrypter
27+
* @param \Illuminate\Contracts\Encryption\Encrypter $encrypter
28+
* @param \Pterodactyl\Contracts\Extensions\HashidsInterface $hashids
2229
*/
23-
public function handle(Encrypter $encrypter)
30+
public function handle(Encrypter $encrypter, HashidsInterface $hashids)
2431
{
2532
$this->encrypter = $encrypter;
33+
$this->hashids = $hashids;
2634
}
2735

2836
/**
@@ -42,6 +50,7 @@ public function transform(Database $model): array
4250
$model->loadMissing('host');
4351

4452
return [
53+
'id' => $this->hashids->encode($model->id),
4554
'host' => [
4655
'address' => $model->getRelation('host')->host,
4756
'port' => $model->getRelation('host')->port,

resources/assets/scripts/components/server/subpages/Databases.vue

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
</div>
1313
</div>
1414
<div v-else>
15-
<div class="content-box mb-6" v-for="database in databases" :key="database.name">
15+
<div class="content-box mb-6 hover:border-grey" v-for="database in databases" :key="database.name">
1616
<div class="flex items-center text-grey-darker">
1717
<database-icon class="flex-none text-green"></database-icon>
1818
<div class="flex-1 px-4">
@@ -38,11 +38,16 @@
3838
<p class="uppercase text-xs text-grey pb-1 select-none">Server</p>
3939
<p><code class="text-sm">{{database.host.address}}:{{database.host.port}}</code></p>
4040
</div>
41+
<div class="flex-none px-4">
42+
<button class="btn btn-xs btn-secondary btn-red" v-on:click="deleteDatabase(database)">
43+
<trash2-icon class="w-3 h-3 mx-1"/>
44+
</button>
45+
</div>
4146
</div>
4247
</div>
43-
<div>
44-
<button class="btn btn-blue btn-lg" v-on:click="showCreateModal = true">Create new database</button>
45-
</div>
48+
</div>
49+
<div>
50+
<button class="btn btn-blue btn-lg" v-on:click="showCreateModal = true">Create new database</button>
4651
</div>
4752
<modal :show="showCreateModal" v-on:close="showCreateModal = false">
4853
<create-database-modal
@@ -55,14 +60,14 @@
5560
</template>
5661

5762
<script>
58-
import { DatabaseIcon, LockIcon } from 'vue-feather-icons';
63+
import { DatabaseIcon, LockIcon, Trash2Icon } from 'vue-feather-icons';
5964
import map from 'lodash/map';
6065
import Modal from '../../core/Modal';
6166
import CreateDatabaseModal from '../components/CreateDatabaseModal';
6267
6368
export default {
6469
name: 'databases-page',
65-
components: {CreateDatabaseModal, Modal, DatabaseIcon, LockIcon },
70+
components: {CreateDatabaseModal, Modal, DatabaseIcon, LockIcon, Trash2Icon },
6671
6772
data: function () {
6873
return {
@@ -136,6 +141,15 @@
136141
137142
database.showPassword = !database.showPassword;
138143
},
144+
145+
deleteDatabase: function (database) {
146+
window.axios.delete(this.route('api.client.servers.databases.delete', {
147+
server: this.$route.params.id,
148+
database: database.id,
149+
}))
150+
.then(response => console.log(response))
151+
.catch(err => console.error(err.response));
152+
},
139153
}
140154
};
141155
</script>

0 commit comments

Comments
 (0)