void.cat/VoidCat/Services/Users/UserStore.cs

67 lines
2.0 KiB
C#
Raw Normal View History

2022-02-21 22:35:06 +00:00
using VoidCat.Model;
using VoidCat.Services.Abstractions;
namespace VoidCat.Services.Users;
public class UserStore : IUserStore
{
private const string UserList = "users";
private readonly ICache _cache;
public UserStore(ICache cache)
{
_cache = cache;
}
public async ValueTask<Guid?> LookupUser(string email)
{
return await _cache.Get<Guid>(MapKey(email));
}
2022-02-24 12:00:28 +00:00
public async ValueTask<T?> Get<T>(Guid id) where T : VoidUser
2022-02-21 22:35:06 +00:00
{
2022-02-24 12:00:28 +00:00
return await _cache.Get<T>(MapKey(id));
2022-02-21 22:35:06 +00:00
}
2022-02-27 13:54:25 +00:00
public async ValueTask Set(InternalVoidUser user)
2022-02-21 22:35:06 +00:00
{
await _cache.Set(MapKey(user.Id), user);
await _cache.AddToList(UserList, user.Id.ToString());
await _cache.Set(MapKey(user.Email), user.Id.ToString());
}
2022-02-27 13:54:25 +00:00
public async ValueTask<PagedResult<PrivateVoidUser>> ListUsers(PagedRequest request)
2022-02-21 22:35:06 +00:00
{
var users = (await _cache.GetList(UserList))?.Select(Guid.Parse);
2022-02-24 12:00:28 +00:00
users = (request.SortBy, request.SortOrder) switch
2022-02-21 22:35:06 +00:00
{
2022-02-24 12:00:28 +00:00
(PagedSortBy.Id, PageSortOrder.Asc) => users?.OrderBy(a => a),
(PagedSortBy.Id, PageSortOrder.Dsc) => users?.OrderByDescending(a => a),
_ => users
};
2022-02-27 13:54:25 +00:00
async IAsyncEnumerable<PrivateVoidUser> EnumerateUsers(IEnumerable<Guid> ids)
2022-02-24 12:00:28 +00:00
{
2022-02-27 13:54:25 +00:00
var usersLoaded = await Task.WhenAll(ids.Select(async a => await Get<PrivateVoidUser>(a)));
2022-02-24 12:00:28 +00:00
foreach (var user in usersLoaded)
2022-02-21 22:35:06 +00:00
{
2022-02-24 12:00:28 +00:00
if (user != default)
2022-02-21 22:35:06 +00:00
{
2022-02-24 12:00:28 +00:00
yield return user;
2022-02-21 22:35:06 +00:00
}
}
}
2022-02-24 12:00:28 +00:00
return new()
{
Page = request.Page,
PageSize = request.PageSize,
TotalResults = users?.Count() ?? 0,
Results = EnumerateUsers(users?.Skip(request.PageSize * request.Page).Take(request.PageSize))
};
2022-02-21 22:35:06 +00:00
}
private static string MapKey(Guid id) => $"user:{id}";
private static string MapKey(string email) => $"user:email:{email}";
}