void.cat/VoidCat/Services/Files/FileInfoManager.cs

87 lines
2.8 KiB
C#
Raw Normal View History

2022-02-27 13:54:25 +00:00
using VoidCat.Model;
using VoidCat.Services.Abstractions;
namespace VoidCat.Services.Files;
2022-06-08 16:17:53 +00:00
/// <inheritdoc />
2022-02-27 13:54:25 +00:00
public class FileInfoManager : IFileInfoManager
{
private readonly IFileMetadataStore _metadataStore;
private readonly IPaywallStore _paywallStore;
private readonly IStatsReporter _statsReporter;
private readonly IUserStore _userStore;
2022-03-07 13:38:28 +00:00
private readonly IVirusScanStore _virusScanStore;
2022-06-10 20:42:36 +00:00
private readonly IUserUploadsStore _userUploadsStore;
2022-02-27 13:54:25 +00:00
public FileInfoManager(IFileMetadataStore metadataStore, IPaywallStore paywallStore, IStatsReporter statsReporter,
2022-06-10 20:42:36 +00:00
IUserStore userStore, IVirusScanStore virusScanStore, IUserUploadsStore userUploadsStore)
2022-02-27 13:54:25 +00:00
{
_metadataStore = metadataStore;
_paywallStore = paywallStore;
_statsReporter = statsReporter;
_userStore = userStore;
2022-03-07 13:38:28 +00:00
_virusScanStore = virusScanStore;
2022-06-10 20:42:36 +00:00
_userUploadsStore = userUploadsStore;
2022-02-27 13:54:25 +00:00
}
2022-06-08 16:17:53 +00:00
/// <inheritdoc />
2022-06-10 20:42:36 +00:00
public ValueTask<PublicVoidFile?> Get(Guid id)
2022-02-27 13:54:25 +00:00
{
2022-06-10 20:42:36 +00:00
return Get<PublicVoidFile, VoidFileMeta>(id);
}
2022-02-27 13:54:25 +00:00
2022-06-10 20:42:36 +00:00
/// <inheritdoc />
public ValueTask<PrivateVoidFile?> GetPrivate(Guid id)
{
return Get<PrivateVoidFile, SecretVoidFileMeta>(id);
2022-02-27 13:54:25 +00:00
}
2022-06-08 16:17:53 +00:00
/// <inheritdoc />
2022-06-06 21:51:25 +00:00
public async ValueTask<IReadOnlyList<PublicVoidFile>> Get(Guid[] ids)
{
var ret = new List<PublicVoidFile>();
foreach (var id in ids)
{
var v = await Get(id);
if (v != default)
{
ret.Add(v);
}
}
return ret;
}
2022-06-08 16:17:53 +00:00
/// <inheritdoc />
public async ValueTask Delete(Guid id)
{
await _metadataStore.Delete(id);
await _paywallStore.Delete(id);
await _statsReporter.Delete(id);
2022-03-07 13:38:28 +00:00
await _virusScanStore.Delete(id);
}
2022-06-10 20:42:36 +00:00
private async ValueTask<TFile?> Get<TFile, TMeta>(Guid id)
where TMeta : VoidFileMeta where TFile : VoidFile<TMeta>, new()
{
var meta = _metadataStore.Get<TMeta>(id);
var paywall = _paywallStore.Get(id);
var bandwidth = _statsReporter.GetBandwidth(id);
2022-06-13 10:29:16 +00:00
var virusScan = _virusScanStore.GetByFile(id);
2022-06-10 20:42:36 +00:00
var uploader = _userUploadsStore.Uploader(id);
await Task.WhenAll(meta.AsTask(), paywall.AsTask(), bandwidth.AsTask(), virusScan.AsTask(), uploader.AsTask());
if (meta.Result == default) return default;
var user = uploader.Result.HasValue ? await _userStore.Get<PublicVoidUser>(uploader.Result.Value) : null;
return new TFile()
{
Id = id,
Metadata = meta.Result,
Paywall = paywall.Result,
Bandwidth = bandwidth.Result,
Uploader = user?.Flags.HasFlag(VoidUserFlags.PublicProfile) == true ? user : null,
VirusScan = virusScan.Result
};
}
2022-06-06 21:51:25 +00:00
}