39 lines
1.0 KiB
C#
39 lines
1.0 KiB
C#
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using HN.Domain;
|
|
using MediatR;
|
|
|
|
namespace HN.Application
|
|
{
|
|
public sealed class VoteForLinkCommandHandler : IRequestHandler<VoteForLinkCommand>
|
|
{
|
|
private readonly ILinkRepository _linkRepository;
|
|
private readonly IExecutingUserProvider _executingUserProvider;
|
|
|
|
public VoteForLinkCommandHandler(ILinkRepository linkRepository, IExecutingUserProvider executingUserProvider)
|
|
{
|
|
_linkRepository = linkRepository;
|
|
_executingUserProvider = executingUserProvider;
|
|
}
|
|
|
|
public async Task<Unit> Handle(VoteForLinkCommand request, CancellationToken cancellationToken)
|
|
{
|
|
var link = await _linkRepository.GetByIdAsync(request.LinkId);
|
|
var userId = _executingUserProvider.GetCurrentUserId();
|
|
|
|
switch (request.Type)
|
|
{
|
|
case VoteType.Up:
|
|
link.Upvote(userId);
|
|
break;
|
|
case VoteType.Down:
|
|
link.Downvote(userId);
|
|
break;
|
|
}
|
|
|
|
await _linkRepository.UpdateAsync(link);
|
|
|
|
return Unit.Value;
|
|
}
|
|
}
|
|
} |