Pārlūkot izejas kodu

Start user quota implementation

Sergio Brighenti 5 gadi atpakaļ
vecāks
revīzija
b2e0d683a2

+ 34 - 11
app/Controllers/AdminController.php

@@ -24,16 +24,7 @@ class AdminController extends Controller
         $usersCount = $this->database->query('SELECT COUNT(*) AS `count` FROM `users`')->fetch()->count;
         $mediasCount = $this->database->query('SELECT COUNT(*) AS `count` FROM `uploads`')->fetch()->count;
         $orphanFilesCount = $this->database->query('SELECT COUNT(*) AS `count` FROM `uploads` WHERE `user_id` IS NULL')->fetch()->count;
-
-        $medias = $this->database->query('SELECT `uploads`.`storage_path` FROM `uploads`')->fetchAll();
-
-        $totalSize = 0;
-
-        $filesystem = $this->storage;
-        foreach ($medias as $media) {
-            $totalSize += $filesystem->getSize($media->storage_path);
-        }
-
+        $totalSize = $this->database->query('SELECT SUM(`current_disk_quota`) AS `sum` FROM `users`')->fetch()->sum ?? 0;
         $registerEnabled = $this->database->query('SELECT `value` FROM `settings` WHERE `key` = \'register_enabled\'')->fetch()->value ?? 'off';
         $hideByDefault = $this->database->query('SELECT `value` FROM `settings` WHERE `key` = \'hide_by_default\'')->fetch()->value ?? 'off';
         $copyUrl = $this->database->query('SELECT `value` FROM `settings` WHERE `key` = \'copy_url_behavior\'')->fetch()->value ?? 'off';
@@ -60,7 +51,6 @@ class AdminController extends Controller
     }
 
     /**
-     * @param  Request  $request
      * @param  Response  $response
      *
      * @return Response
@@ -105,4 +95,37 @@ class AdminController extends Controller
 
         return json($response, $out);
     }
+
+    /**
+     * @param  Response  $response
+     * @return Response
+     */
+    public function recalculateUserQuota(Response $response): Response
+    {
+        $uploads = $this->database->query('SELECT `id`,`user_id`, `storage_path` FROM `uploads`')->fetchAll();
+
+        $usersQuotas = [];
+
+        $filesystem = $this->storage;
+        foreach ($uploads as $upload) {
+            if (!array_key_exists($upload->user_id, $usersQuotas)) {
+                $usersQuotas[$upload->user_id] = 0;
+            }
+            try {
+                $usersQuotas[$upload->user_id] += $filesystem->getSize($upload->storage_path);
+            } catch (FileNotFoundException $e) {
+                $this->database->query('DELETE FROM `uploads` WHERE `id` = ?', $upload->id);
+            }
+        }
+
+        foreach ($usersQuotas as $userId => $quota) {
+            $this->database->query('UPDATE `users` SET `current_disk_quota`=? WHERE `id` = ?', [
+                $quota,
+                $userId,
+            ]);
+        }
+
+        $this->session->alert(lang('quota_recalculated'));
+        return redirect($response, route('system'));
+    }
 }

+ 1 - 0
app/routes.php

@@ -28,6 +28,7 @@ $app->group('', function (RouteCollectorProxy $group) {
         $group->get('/home/switchView', [DashboardController::class, 'switchView'])->setName('switchView');
 
         $group->get('/system/deleteOrphanFiles', [AdminController::class, 'deleteOrphanFiles'])->setName('system.deleteOrphanFiles');
+        $group->get('/system/recalculateUserQuota', [AdminController::class, 'recalculateUserQuota'])->setName('system.recalculateUserQuota');
 
         $group->get('/system/themes', [AdminController::class, 'getThemes'])->setName('theme');
 

+ 2 - 0
resources/lang/en.lang.php

@@ -131,4 +131,6 @@ return [
     'password_repeat' => 'Repeat Password',
     'password_match' => 'Password and repeat password must be the same.',
     'password_restored' => 'Password has been reset.',
+    'recalculate_user_quota' => 'Recalculate user quota from disk',
+    'quota_recalculated' => 'User quota recalculated from the disk successfully.',
 ];

+ 1 - 1
resources/templates/auth/register.twig

@@ -38,7 +38,7 @@
                     <label for="username" class="sr-only">{{ lang('username') }}</label>
                     <input type="text" id="username" class="form-control first" placeholder="{{ lang('username') }}" name="username" required autofocus>
                     <label for="email" class="sr-only">E-Mail</label>
-                    <input type="email" id="email" class="form-control middle" placeholder="mail@example.com" name="email" required>
+                    <input type="email" id="email" class="form-control middle" placeholder="E-Mail" name="email" required>
                     <label for="password" class="sr-only">{{ lang('password') }}</label>
                     <input type="password" id="password" class="form-control last" placeholder="{{ lang('password') }}" name="password" required>
                 </div>

+ 2 - 1
resources/templates/dashboard/system.twig

@@ -173,7 +173,8 @@
                 <div class="card shadow-sm mt-3">
                     <div class="card-header"><i class="fas fa-tools fa-fw"></i> {{ lang('maintenance') }}</div>
                     <div class="card-body">
-                        <a href="{{ route('system.deleteOrphanFiles') }}" class="btn btn-outline-dark btn-block"><i class="fas fa-broom fa-fw"></i> {{ lang('clean_orphaned_uploads') }}</a>
+                        <a href="{{ route('system.deleteOrphanFiles') }}" class="btn btn-outline-danger btn-block"><i class="fas fa-broom fa-fw"></i> {{ lang('clean_orphaned_uploads') }}</a>
+                        <a href="{{ route('system.recalculateUserQuota') }}" class="btn btn-outline-info btn-block"><i class="fas fa-calculator fa-fw"></i> {{ lang('recalculate_user_quota') }}</a>
                     </div>
                 </div>
                 <div class="card shadow-sm mt-3">