From cd638589d5474099218357350f1719c2ba4aa6f8 Mon Sep 17 00:00:00 2001 From: Samuel Weirich <4281791+SamuelWei@users.noreply.github.com> Date: Tue, 2 Apr 2024 15:41:40 +0200 Subject: [PATCH 1/2] Refactor time periods and UI for app banner --- .../Commands/CleanupAttendanceCommand.php | 8 +- .../Commands/CleanupStatisticsCommand.php | 16 +- .../Commands/DeleteObsoleteTokensCommand.php | 4 +- app/Enums/TimePeriod.php | 18 + app/Http/Requests/UpdateSetting.php | 15 +- app/Models/RoomToken.php | 2 +- lang/de/meetings.php | 2 + lang/de/settings.php | 1 + lang/en/meetings.php | 2 + lang/en/settings.php | 1 + resources/js/components/RoomTabHistory.vue | 7 +- resources/js/views/settings/Config.vue | 400 +++++++++--------- tests/Feature/api/v1/Room/RoomTokenTest.php | 2 +- tests/Feature/api/v1/SettingsTest.php | 2 +- .../Unit/Console/DeleteObsoleteTokensTest.php | 10 +- 15 files changed, 253 insertions(+), 237 deletions(-) create mode 100644 app/Enums/TimePeriod.php diff --git a/app/Console/Commands/CleanupAttendanceCommand.php b/app/Console/Commands/CleanupAttendanceCommand.php index 4f931d7f4..b1ac338c1 100644 --- a/app/Console/Commands/CleanupAttendanceCommand.php +++ b/app/Console/Commands/CleanupAttendanceCommand.php @@ -30,8 +30,10 @@ class CleanupAttendanceCommand extends Command public function handle() { // Remove all attendance data older than the retention period - $day = now()->subDays(setting('attendance.retention_period'))->toDateString(); - Log::info('Removing attendance data older than '.$day); - MeetingAttendee::where('join', '<', $day)->delete(); + if (setting('attendance.retention_period') != -1) { + $day = now()->subDays(setting('attendance.retention_period'))->toDateString(); + Log::info('Removing attendance data older than '.$day); + MeetingAttendee::where('join', '<', $day)->delete(); + } } } diff --git a/app/Console/Commands/CleanupStatisticsCommand.php b/app/Console/Commands/CleanupStatisticsCommand.php index 6bb14165a..b1a3ec10f 100644 --- a/app/Console/Commands/CleanupStatisticsCommand.php +++ b/app/Console/Commands/CleanupStatisticsCommand.php @@ -31,13 +31,17 @@ class CleanupStatisticsCommand extends Command public function handle() { // Remove all server statistics data older than the retention period - $serverDay = now()->subDays(setting('statistics.servers.retention_period'))->toDateString(); - Log::info('Removing server statistics data older than '.$serverDay); - ServerStat::where('created_at', '<', $serverDay)->delete(); + if (setting('statistics.servers.retention_period') != -1) { + $serverDay = now()->subDays(setting('statistics.servers.retention_period'))->toDateString(); + Log::info('Removing server statistics data older than '.$serverDay); + ServerStat::where('created_at', '<', $serverDay)->delete(); + } // Remove all meeting statistics data older than the retention period - $meetingDay = now()->subDays(setting('statistics.meetings.retention_period'))->toDateString(); - Log::info('Removing meeting statistics data older than '.$serverDay); - MeetingStat::where('created_at', '<', $meetingDay)->delete(); + if (setting('statistics.meetings.retention_period') != -1) { + $meetingDay = now()->subDays(setting('statistics.meetings.retention_period'))->toDateString(); + Log::info('Removing meeting statistics data older than '.$serverDay); + MeetingStat::where('created_at', '<', $meetingDay)->delete(); + } } } diff --git a/app/Console/Commands/DeleteObsoleteTokensCommand.php b/app/Console/Commands/DeleteObsoleteTokensCommand.php index be5996d0e..521d59d87 100644 --- a/app/Console/Commands/DeleteObsoleteTokensCommand.php +++ b/app/Console/Commands/DeleteObsoleteTokensCommand.php @@ -33,11 +33,11 @@ public function handle() if (setting('room_token_expiration') > -1) { $expiredTokens = RoomToken::where(function ($query) { $query->whereNull('last_usage') - ->where('created_at', '<', Carbon::now()->subMinutes(setting('room_token_expiration'))); + ->where('created_at', '<', Carbon::now()->subDays(setting('room_token_expiration'))); }) ->orWhere(function ($query) { $query->whereNotNull('last_usage') - ->where('last_usage', '<', Carbon::now()->subMinutes(setting('room_token_expiration'))); + ->where('last_usage', '<', Carbon::now()->subDays(setting('room_token_expiration'))); }) ->pluck('token'); diff --git a/app/Enums/TimePeriod.php b/app/Enums/TimePeriod.php new file mode 100644 index 000000000..65dfc2756 --- /dev/null +++ b/app/Enums/TimePeriod.php @@ -0,0 +1,18 @@ + 'nullable|string|url|max:255', 'privacy_policy_url' => 'nullable|string|url|max:255', 'statistics.servers.enabled' => 'required|boolean', - 'statistics.servers.retention_period' => 'required|numeric|min:1|max:365', + 'statistics.servers.retention_period' => ['required', 'numeric', Rule::enum(TimePeriod::class)], 'statistics.meetings.enabled' => 'required|boolean', - 'statistics.meetings.retention_period' => 'required|numeric|min:1|max:365', - 'attendance.retention_period' => 'required|numeric|min:1|max:365', + 'statistics.meetings.retention_period' => ['required', 'numeric', Rule::enum(TimePeriod::class)], + 'attendance.retention_period' => ['required', 'numeric', Rule::enum(TimePeriod::class)], 'bbb.logo' => 'string|max:255', 'bbb.logo_file' => 'image|max:500', 'bbb.style' => 'nullable|file|max:500', - 'room_token_expiration' => 'required|numeric|in:,-1,1440,10080,43200,129600,262800,525600', + 'room_token_expiration' => ['required', 'numeric', Rule::enum(TimePeriod::class)], 'room_auto_delete.enabled' => 'required|boolean', - 'room_auto_delete.inactive_period' => 'required|numeric|in:-1,7,14,30,90,180,365,730', - 'room_auto_delete.never_used_period' => 'required|numeric|in:-1,7,14,30,90,180,365,730', - 'room_auto_delete.deadline_period' => 'required|numeric|in:7,14,30', + 'room_auto_delete.inactive_period' => ['required', 'numeric', Rule::enum(TimePeriod::class)], + 'room_auto_delete.never_used_period' => ['required', 'numeric', Rule::enum(TimePeriod::class)], + 'room_auto_delete.deadline_period' => ['required', 'numeric', Rule::enum(TimePeriod::class)->only([TimePeriod::ONE_WEEK, TimePeriod::TWO_WEEKS, TimePeriod::ONE_MONTH])], ]; } diff --git a/app/Models/RoomToken.php b/app/Models/RoomToken.php index a9482869b..ea2f8b5bf 100644 --- a/app/Models/RoomToken.php +++ b/app/Models/RoomToken.php @@ -87,6 +87,6 @@ public function getFullnameAttribute() */ public function getExpiresAttribute() { - return setting('room_token_expiration') > -1 ? ($this->last_usage != null ? $this->last_usage->addMinutes(setting('room_token_expiration')) : $this->created_at->addMinutes(setting('room_token_expiration'))) : null; + return setting('room_token_expiration') > -1 ? ($this->last_usage != null ? $this->last_usage->addDays(setting('room_token_expiration')) : $this->created_at->addDays(setting('room_token_expiration'))) : null; } } diff --git a/lang/de/meetings.php b/lang/de/meetings.php index ccd92eb47..3bb3fd801 100644 --- a/lang/de/meetings.php +++ b/lang/de/meetings.php @@ -11,6 +11,7 @@ 'no_data' => 'Keine protokollierte Anwesenheit gefunden.', 'no_data_filtered' => 'Für die Suchanfrage wurde keine protokollierte Anwesenheit gefunden!', 'retention_period' => 'Die Anwesenheit wird für :days Tage gespeichert.', + 'retention_period_unlimited' => 'Die Anwesenheit wird zeitlich unbegrenzt gespeichert.', 'sessions' => 'Sitzungen', 'view' => 'Anwesenheit anzeigen', ], @@ -31,6 +32,7 @@ 'no_breakout_support' => 'Die Auslastung der Breakout-Räume wird aktuell nicht unterstützt. Es wird nur die Auslastung des Hauptraums gemessen.', 'participants' => 'Teilnehmer', 'retention_period' => 'Die Auslastung der Räume wird für :days Tage gespeichert.', + 'retention_period_unlimited' => 'Die Auslastung der Räume wird zeitlich unbegrenzt gespeichert.', 'time' => 'Uhrzeit', 'videos' => 'Webcams', 'voices' => 'Mikrofone', diff --git a/lang/de/settings.php b/lang/de/settings.php index d56efdf34..e4f7c7a9f 100644 --- a/lang/de/settings.php +++ b/lang/de/settings.php @@ -12,6 +12,7 @@ 'banner_title' => 'Überschrift', 'color' => 'Textfarbe des Banners', 'enabled' => 'Anzeigen', + 'preview' => 'Vorschau', 'icon' => 'Icon', 'icon_description' => 'Die CSS-Klasse des Fontawesome-Icons (z. B. `fa-solid fa-door-open`). Das Icon wird nur angezeigt, wenn ein Titel angegeben wurde.', 'link' => 'Anzuzeigender Link nach der Mitteilung', diff --git a/lang/en/meetings.php b/lang/en/meetings.php index ade6e3404..891ef101c 100644 --- a/lang/en/meetings.php +++ b/lang/en/meetings.php @@ -11,6 +11,7 @@ 'no_data' => 'No logged attendance found.', 'no_data_filtered' => 'For the filter query no logged attendance were found!', 'retention_period' => 'The attendance is stored for :days days.', + 'retention_period_unlimited' => 'The attendance is stored indefinitely.', 'sessions' => 'Sessions', 'view' => 'Show attendance', ], @@ -31,6 +32,7 @@ 'no_breakout_support' => 'The utilisation of the breakout rooms is currently not supported. Only the utilisation of the main room is measured.', 'participants' => 'Participants', 'retention_period' => 'The utilisation of the rooms is stored for :days days.', + 'retention_period_unlimited' => 'The utilisation of the rooms is stored indefinitely.', 'time' => 'Time', 'videos' => 'Webcams', 'voices' => 'Microphones', diff --git a/lang/en/settings.php b/lang/en/settings.php index d01966d6d..93a458117 100644 --- a/lang/en/settings.php +++ b/lang/en/settings.php @@ -12,6 +12,7 @@ 'banner_title' => 'Title', 'color' => 'Text color of the banner', 'enabled' => 'Show', + 'preview' => 'Preview', 'icon' => 'Icon', 'icon_description' => 'The CSS class of the Fontawesome-Icon (e. g. `fa-solid fa-door-open`). The icon will only be visible, if a title is supplied.', 'link' => 'Link to show after the message', diff --git a/resources/js/components/RoomTabHistory.vue b/resources/js/components/RoomTabHistory.vue index 5aec8834a..203bd2f11 100644 --- a/resources/js/components/RoomTabHistory.vue +++ b/resources/js/components/RoomTabHistory.vue @@ -79,8 +79,11 @@ > {{ $t('meetings.retention_period') }}
- {{ $t('meetings.stats.retention_period', {'days': settingsStore.getSetting('statistics.meetings.retention_period')}) }}
- {{ $t('meetings.attendance.retention_period', {'days': settingsStore.getSetting('attendance.retention_period')}) }}
+ {{ $t('meetings.stats.retention_period', {'days': settingsStore.getSetting('statistics.meetings.retention_period')}) }}
+ {{ $t('meetings.stats.retention_period_unlimited') }}
+ + {{ $t('meetings.attendance.retention_period', {'days': settingsStore.getSetting('attendance.retention_period')}) }}
+ {{ $t('meetings.attendance.retention_period_unlimited') }}
diff --git a/resources/js/views/settings/Config.vue b/resources/js/views/settings/Config.vue index 03a752d20..82f85f891 100644 --- a/resources/js/views/settings/Config.vue +++ b/resources/js/views/settings/Config.vue @@ -178,8 +178,11 @@ + +

{{ $t('settings.application.banner.title') }}

+
- {{$t('settings.application.banner.title')}} + {{$t('settings.application.banner.enabled')}}
- +

+
+
-
- +
+ {{$t('settings.application.banner.preview')}} +
+ +
+
- - -
- -
-
-
+
+ +
+
+
-
- -
-
-
+
+ +
+
+
-
- -
-