/// <summary>
/// Описывает сервис для обработки действий модератора.
/// </summary>
public interface IModeratorActionsService
{
}
/// <summary>
/// Представляет сервис для обработки действий модератора.
/// </summary>
/// <remarks>
/// На каждый метод будет выполнять проверку наличия у пользователя модераторства
/// - и будем прокидывать ошибку в случае их отсутствия.
/// </remarks>
public sealed class ModeratorActionsService : IModeratorActionsService
{
public ModeratorActionsService(
IBooksHubUnitOfWork unitOfWork,
ILogger<ModeratorActionsService> logger)
{
_unitOfWork = unitOfWork ?? throw new ArgumentNullException(nameof(unitOfWork));
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
}
private async Task ValidateModeratorOptionsExistenseAsync(
Id<User> userId,
CancellationToken token)
{
_logger.LogInformation(
"Validating moderator options existense for user {UserId}",
userId.Value);
var existense = await _unitOfWork.Users.HasModeratorOptions(userId, token);
if (!existense)
{
_logger.LogInformation(
"Moderator options not existed for user {UserId}",
userId.Value);
throw new InvalidOperationException(
$"Moderator options not existed for user {userId.Value}.");
}
}
private readonly IBooksHubUnitOfWork _unitOfWork;
private readonly ILogger<ModeratorActionsService> _logger;
}
/// <summary>
/// Для пользователя выясняет, является ли он модератором в системе.
/// </summary>
/// <param name="userId">
/// Идентификатор пользователя.
/// </param>
/// <param name="token">
/// Токен отмены.
/// <exception cref="ArgumentNullException">
/// Если <paramref name="userId"/> был <see langword="null"/>.
/// </exception>
/// <exception cref="InvalidOperationException">
/// Если пользователя с таким идентификатом не существует в хранилище.
/// </exception>
public Task<bool> HasModeratorOptions(Id<User> userId, CancellationToken token);
public async Task<bool> HasModeratorOptions(Id<User> userId, CancellationToken token)
{
ArgumentNullException.ThrowIfNull(userId);
var storageUser = await Context.Users
.AsNoTracking()
.SingleOrDefaultAsync(x => x.Id == userId.Value, token)
?? throw new InvalidOperationException(NOT_EXISTS_MESSAGE);
return storageUser.Role == UserRole.Moderator;
}