using VoidCat.Model; using VoidCat.Model.User; using VoidCat.Services.Abstractions; namespace VoidCat.Services.Files; /// /// Main interface for getting file info to serve to clients. /// This interface should wrap all stores and return the combined result /// public sealed class FileInfoManager { private readonly IFileMetadataStore _metadataStore; private readonly IPaymentStore _paymentStore; private readonly IStatsReporter _statsReporter; private readonly IUserStore _userStore; private readonly IVirusScanStore _virusScanStore; private readonly IUserUploadsStore _userUploadsStore; public FileInfoManager(IFileMetadataStore metadataStore, IPaymentStore paymentStore, IStatsReporter statsReporter, IUserStore userStore, IVirusScanStore virusScanStore, IUserUploadsStore userUploadsStore) { _metadataStore = metadataStore; _paymentStore = paymentStore; _statsReporter = statsReporter; _userStore = userStore; _virusScanStore = virusScanStore; _userUploadsStore = userUploadsStore; } /// /// Get all metadata for a single file /// /// /// public ValueTask Get(Guid id) { return Get(id); } /// /// Get all private metadata for a single file /// /// /// public ValueTask GetPrivate(Guid id) { return Get(id); } /// /// Get all metadata for multiple files /// /// /// public async ValueTask> Get(Guid[] ids) { var ret = new List(); foreach (var id in ids) { var v = await Get(id); if (v != default) { ret.Add(v); } } return ret; } /// /// Deletes all file metadata /// /// /// public async ValueTask Delete(Guid id) { await _metadataStore.Delete(id); await _paymentStore.Delete(id); await _statsReporter.Delete(id); await _virusScanStore.Delete(id); } private async ValueTask Get(Guid id) where TMeta : FileMeta where TFile : VoidFile, new() { var meta = _metadataStore.Get(id); var payment = _paymentStore.Get(id); var bandwidth = _statsReporter.GetBandwidth(id); var virusScan = _virusScanStore.GetByFile(id); var uploader = _userUploadsStore.Uploader(id); await Task.WhenAll(meta.AsTask(), payment.AsTask(), bandwidth.AsTask(), virusScan.AsTask(), uploader.AsTask()); if (meta.Result == default) return default; var user = uploader.Result.HasValue ? await _userStore.Get(uploader.Result.Value) : null; return new TFile() { Id = id, Metadata = meta.Result, Payment = payment.Result, Bandwidth = bandwidth.Result, Uploader = user?.Flags.HasFlag(UserFlags.PublicProfile) == true ? user : null, VirusScan = virusScan.Result }; } }