Emalawi19 commited on
Commit
1c86072
·
verified ·
1 Parent(s): c68def6

Create api/delete.php

Browse files
Files changed (1) hide show
  1. api/delete.php +103 -0
api/delete.php ADDED
@@ -0,0 +1,103 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ header('Content-Type: application/json');
3
+ header('Access-Control-Allow-Origin: *');
4
+ header('Access-Control-Allow-Methods: POST, OPTIONS');
5
+ header('Access-Control-Allow-Headers: Content-Type');
6
+
7
+ if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
8
+ http_response_code(204);
9
+ exit;
10
+ }
11
+
12
+ if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
13
+ http_response_code(405);
14
+ echo json_encode(['error' => 'Method not allowed']);
15
+ exit;
16
+ }
17
+
18
+ $input = json_decode(file_get_contents('php://input'), true);
19
+ $username = trim($input['username'] ?? '');
20
+ $filepath = trim($input['filepath'] ?? ''); // empty = delete entire site
21
+ $deleteAll = (bool)($input['delete_all'] ?? false);
22
+
23
+ // Validate username
24
+ if (!preg_match('/^[a-z0-9]{3,32}$/', $username)) {
25
+ http_response_code(400);
26
+ echo json_encode(['error' => 'Invalid username']);
27
+ exit;
28
+ }
29
+
30
+ // Check user exists
31
+ $db = new PDO('sqlite:/data/db/platform.sqlite');
32
+ $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
33
+ $stmt = $db->prepare('SELECT id FROM users WHERE username = ?');
34
+ $stmt->execute([$username]);
35
+ if (!$stmt->fetch()) {
36
+ http_response_code(404);
37
+ echo json_encode(['error' => 'User not found']);
38
+ exit;
39
+ }
40
+
41
+ $htdocs = "/data/sites/{$username}/htdocs";
42
+
43
+ // ── Delete entire site ────────────────────────────────────────────────────────
44
+ if ($deleteAll) {
45
+ $siteDir = "/data/sites/{$username}";
46
+
47
+ // Recursively delete the site directory
48
+ $deleted = deleteDirectory($siteDir);
49
+
50
+ if ($deleted) {
51
+ // Remove user and all files from database
52
+ $db->prepare('DELETE FROM files WHERE username = ?')->execute([$username]);
53
+ $db->prepare('DELETE FROM users WHERE username = ?')->execute([$username]);
54
+ echo json_encode([
55
+ 'success' => true,
56
+ 'message' => "Site {$username} deleted completely"
57
+ ]);
58
+ } else {
59
+ http_response_code(500);
60
+ echo json_encode(['error' => 'Failed to delete site directory']);
61
+ }
62
+ exit;
63
+ }
64
+
65
+ // ── Delete a single file ──────────────────────────────────────────────────────
66
+ $filepath = basename($filepath);
67
+ if (empty($filepath)) {
68
+ http_response_code(400);
69
+ echo json_encode(['error' => 'No filepath provided']);
70
+ exit;
71
+ }
72
+
73
+ $dest = "{$htdocs}/{$filepath}";
74
+
75
+ if (!file_exists($dest)) {
76
+ http_response_code(404);
77
+ echo json_encode(['error' => 'File not found']);
78
+ exit;
79
+ }
80
+
81
+ if (unlink($dest)) {
82
+ $db->prepare('DELETE FROM files WHERE username = ? AND filepath = ?')
83
+ ->execute([$username, $filepath]);
84
+ echo json_encode([
85
+ 'success' => true,
86
+ 'message' => "File {$filepath} deleted"
87
+ ]);
88
+ } else {
89
+ http_response_code(500);
90
+ echo json_encode(['error' => 'Failed to delete file']);
91
+ }
92
+
93
+ // ── Helper: recursively delete a directory ────────────────────────────────────
94
+ function deleteDirectory(string $dir): bool {
95
+ if (!is_dir($dir)) return false;
96
+ $items = scandir($dir);
97
+ foreach ($items as $item) {
98
+ if ($item === '.' || $item === '..') continue;
99
+ $path = "{$dir}/{$item}";
100
+ is_dir($path) ? deleteDirectory($path) : unlink($path);
101
+ }
102
+ return rmdir($dir);
103
+ }