using AIStudio.Settings; namespace AIStudio.Tools.Services.Indexing; /// /// The files an attachment is written to while the runtime reads its text. /// /// /// The runtime reads documents from disk only. An attachment therefore lands in a file of its own /// for as long as its text is read, and is deleted right after. Their names are random: the /// runtime logs the path it reads, and the name of an attachment may name a person. /// /// Whatever a crash left behind is deleted when AI Studio starts again, before the first mailbox /// is synced. That is why the files live in a directory of their own within the data directory of /// AI Studio, rather than in the temporary directory of the OS: deleting everything in it touches /// no file of another program. /// internal static class MailAttachmentFiles { private const string DIRECTORY_NAME = "mailAttachments"; /// /// Makes up the path of a file for one attachment, and creates the directory it lies in. /// /// The extension of the attachment, checked against the known document types beforehand, without a dot. /// The path, where no file exists yet. /// The data directory is not known yet. public static string CreatePath(string extension) { var directory = GetDirectory() ?? throw new InvalidOperationException("The data directory is not known yet."); Directory.CreateDirectory(directory); return Path.Join(directory, $"{Guid.NewGuid():N}.{extension}"); } /// /// Deletes the file of one attachment, should it exist. /// /// The path from CreatePath. /// The logger, for a file which cannot be deleted. The next start deletes it. public static void Delete(string path, ILogger logger) { try { File.Delete(path); } catch (Exception exception) { logger.LogWarning(exception, "The temporary file '{Path}' of a mail attachment could not be deleted. It is deleted on the next start.", path); } } /// /// Deletes every file an earlier session of AI Studio left behind. /// /// /// Only to be called before any mailbox is synced, since it deletes the files of a running sync as well. /// /// The logger. public static void DeleteLeftovers(ILogger logger) { if (GetDirectory() is not { } directory || !Directory.Exists(directory)) return; try { Directory.Delete(directory, true); logger.LogInformation("Deleted the temporary files of mail attachments an earlier session left behind."); } catch (Exception exception) { logger.LogWarning(exception, "The temporary files of mail attachments in '{Directory}' could not be deleted.", directory); } } private static string? GetDirectory() => string.IsNullOrWhiteSpace(SettingsManager.DataDirectory) ? null : Path.Join(SettingsManager.DataDirectory, DIRECTORY_NAME); }