using System.Threading; using System.Threading.Tasks; using HN.Domain; using MediatR; namespace HN.Application { public sealed class VoteForLinkCommandHandler : IRequestHandler { private readonly ILinkRepository _linkRepository; private readonly IExecutingUserProvider _executingUserProvider; public VoteForLinkCommandHandler(ILinkRepository linkRepository, IExecutingUserProvider executingUserProvider) { _linkRepository = linkRepository; _executingUserProvider = executingUserProvider; } public async Task Handle(VoteForLinkCommand request, CancellationToken cancellationToken) { var link = await _linkRepository.GetByIdAsync(request.LinkId); var userId = _executingUserProvider.GetCurrentUserId(); switch (request.Type) { case VoteType.Up: link.UpvoteBy(userId); break; case VoteType.Down: link.DownvoteBy(userId); break; } return Unit.Value; } } }