using System.Collections.Concurrent;
namespace Backend.Data.InMemory;
///
/// Default implementation so the skeleton runs with no database. State is per-process
/// and lost on restart.
///
public sealed class InMemoryUserRepository : IUserRepository
{
private readonly ConcurrentDictionary _users = new();
public Task> GetAllAsync(CancellationToken cancellationToken = default)
{
IReadOnlyList users = _users.Values
.OrderBy(user => user.CreatedAt)
.ToList();
return Task.FromResult(users);
}
public Task GetByIdAsync(Guid id, CancellationToken cancellationToken = default)
{
_users.TryGetValue(id, out var user);
return Task.FromResult(user);
}
public Task GetByEmailAsync(string email, CancellationToken cancellationToken = default)
{
var user = _users.Values
.FirstOrDefault(candidate => string.Equals(candidate.Email, email, StringComparison.OrdinalIgnoreCase));
return Task.FromResult(user);
}
public Task AddAsync(User user, CancellationToken cancellationToken = default)
{
_users[user.Id] = user;
return Task.FromResult(user);
}
public Task UpdateAsync(User user, CancellationToken cancellationToken = default)
{
if (!_users.ContainsKey(user.Id))
{
return Task.FromResult(null);
}
_users[user.Id] = user;
return Task.FromResult(user);
}
public Task DeleteAsync(Guid id, CancellationToken cancellationToken = default)
=> Task.FromResult(_users.TryRemove(id, out _));
}