Start user quota implementation

This commit is contained in:
Sergio Brighenti 2020-02-27 19:45:05 +01:00
parent 0d375201c8
commit b2e0d683a2
5 changed files with 40 additions and 13 deletions

View file

@ -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'));
}
}

View file

@ -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');

View file

@ -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.',
];

View file

@ -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>

View file

@ -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">