book-hub-umsp / book-hub-api

1 stars 0 forks source link

[Moderator] Add moderator actions controller #84

Open Tigeroff2002 opened 2 weeks ago

Tigeroff2002 commented 2 weeks ago
/// <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;
    }
AlexBimlnk commented 2 weeks ago

Это что и для чего?