From eae194469576e1810e208e37f8e4290d32064a99 Mon Sep 17 00:00:00 2001 From: Thorsten Sommer Date: Fri, 12 Jul 2024 23:13:10 +0200 Subject: [PATCH] Added temporary chat maintenance service --- .../Components/Layout/MainLayout.razor.cs | 1 + app/MindWork AI Studio/Program.cs | 1 + .../Tools/TemporaryChatService.cs | 71 +++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 app/MindWork AI Studio/Tools/TemporaryChatService.cs diff --git a/app/MindWork AI Studio/Components/Layout/MainLayout.razor.cs b/app/MindWork AI Studio/Components/Layout/MainLayout.razor.cs index e886937d..7c7f09dd 100644 --- a/app/MindWork AI Studio/Components/Layout/MainLayout.razor.cs +++ b/app/MindWork AI Studio/Components/Layout/MainLayout.razor.cs @@ -67,6 +67,7 @@ public partial class MainLayout : LayoutComponentBase, IMessageBusReceiver // Set the js runtime for the update service: UpdateService.SetBlazorDependencies(this.JsRuntime, this.Snackbar); + TemporaryChatService.Initialize(); await base.OnInitializedAsync(); } diff --git a/app/MindWork AI Studio/Program.cs b/app/MindWork AI Studio/Program.cs index 4c1ad4a2..1ca814e9 100644 --- a/app/MindWork AI Studio/Program.cs +++ b/app/MindWork AI Studio/Program.cs @@ -31,6 +31,7 @@ builder.Services.AddMudMarkdownClipboardService(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddHostedService(); +builder.Services.AddHostedService(); builder.Services.AddRazorComponents() .AddInteractiveServerComponents() .AddHubOptions(options => diff --git a/app/MindWork AI Studio/Tools/TemporaryChatService.cs b/app/MindWork AI Studio/Tools/TemporaryChatService.cs new file mode 100644 index 00000000..c7122ae2 --- /dev/null +++ b/app/MindWork AI Studio/Tools/TemporaryChatService.cs @@ -0,0 +1,71 @@ +using AIStudio.Settings; + +namespace AIStudio.Tools; + +public class TemporaryChatService(SettingsManager settingsManager) : BackgroundService +{ + private static readonly TimeSpan CHECK_INTERVAL = TimeSpan.FromDays(1); + private static bool IS_INITIALIZED; + + #region Overrides of BackgroundService + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + while (!stoppingToken.IsCancellationRequested && !IS_INITIALIZED) + await Task.Delay(TimeSpan.FromSeconds(3), stoppingToken); + + await settingsManager.LoadSettings(); + if(settingsManager.ConfigurationData.WorkspaceStorageTemporaryMaintenancePolicy is WorkspaceStorageTemporaryMaintenancePolicy.NO_AUTOMATIC_MAINTENANCE) + { + Console.WriteLine("Automatic maintenance of temporary chat storage is disabled. Exiting maintenance service."); + return; + } + + await this.StartMaintenance(); + while (!stoppingToken.IsCancellationRequested) + { + await Task.Delay(CHECK_INTERVAL, stoppingToken); + await this.StartMaintenance(); + } + } + + #endregion + + private Task StartMaintenance() + { + var temporaryDirectories = Path.Join(SettingsManager.DataDirectory, "tempChats"); + if(!Directory.Exists(temporaryDirectories)) + return Task.CompletedTask; + + foreach (var tempChatDirPath in Directory.EnumerateDirectories(temporaryDirectories)) + { + var chatPath = Path.Join(tempChatDirPath, "thread.json"); + var chatMetadata = new FileInfo(chatPath); + if (!chatMetadata.Exists) + continue; + + var lastWriteTime = chatMetadata.LastWriteTimeUtc; + var deleteChat = settingsManager.ConfigurationData.WorkspaceStorageTemporaryMaintenancePolicy switch + { + WorkspaceStorageTemporaryMaintenancePolicy.DELETE_OLDER_THAN_7_DAYS => DateTime.UtcNow - lastWriteTime > TimeSpan.FromDays(7), + WorkspaceStorageTemporaryMaintenancePolicy.DELETE_OLDER_THAN_30_DAYS => DateTime.UtcNow - lastWriteTime > TimeSpan.FromDays(30), + WorkspaceStorageTemporaryMaintenancePolicy.DELETE_OLDER_THAN_90_DAYS => DateTime.UtcNow - lastWriteTime > TimeSpan.FromDays(90), + WorkspaceStorageTemporaryMaintenancePolicy.DELETE_OLDER_THAN_180_DAYS => DateTime.UtcNow - lastWriteTime > TimeSpan.FromDays(180), + WorkspaceStorageTemporaryMaintenancePolicy.DELETE_OLDER_THAN_365_DAYS => DateTime.UtcNow - lastWriteTime > TimeSpan.FromDays(365), + + WorkspaceStorageTemporaryMaintenancePolicy.NO_AUTOMATIC_MAINTENANCE => false, + _ => false, + }; + + if(deleteChat) + Directory.Delete(tempChatDirPath, true); + } + + return Task.CompletedTask; + } + + public static void Initialize() + { + IS_INITIALIZED = true; + } +} \ No newline at end of file