using VoidCat.Model;
using VoidCat.Services.Abstractions;
namespace VoidCat.Services.Users;
///
public class CacheUserUploadStore : IUserUploadsStore
{
private readonly ICache _cache;
public CacheUserUploadStore(ICache cache)
{
_cache = cache;
}
///
public async ValueTask> ListFiles(Guid user, PagedRequest request)
{
var ids = (await _cache.GetList(MapKey(user))).Select(Guid.Parse);
ids = (request.SortBy, request.SortOrder) switch
{
(PagedSortBy.Id, PageSortOrder.Asc) => ids.OrderBy(a => a),
(PagedSortBy.Id, PageSortOrder.Dsc) => ids.OrderByDescending(a => a),
_ => ids
};
var idsRendered = ids.ToList();
async IAsyncEnumerable EnumerateResults(IEnumerable page)
{
foreach (var id in page)
{
yield return id;
}
}
return new()
{
Page = request.Page,
PageSize = request.PageSize,
TotalResults = idsRendered.Count,
Data = EnumerateResults(idsRendered.Skip(request.Page * request.PageSize).Take(request.PageSize))
};
}
///
public async ValueTask AddFile(Guid user, Guid file)
{
await _cache.AddToList(MapKey(user), file.ToString());
await _cache.Set(MapUploader(file), user);
}
///
public ValueTask Uploader(Guid file)
{
return _cache.Get(MapUploader(file));
}
private static string MapKey(Guid id) => $"user:{id}:uploads";
private static string MapUploader(Guid file) => $"file:{file}:uploader";
}