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
};
}
}