public async Task <IActionResult> PutAsync([FromBody] UpdateGuildCommand command, CancellationToken cancellationToken) { var result = await _mediator.Send(command, cancellationToken); return(result.Failures.Any() ? BadRequest(result.GenerateFailuresOutput()) as IActionResult : Ok(result.Data)); }
public async Task <ApiResponse <Guild> > Handle(UpdateGuildCommand request, CancellationToken cancellationToken) { var guild = await _guildRepository.GetForMemberHandlingAsync(request.Id, cancellationToken); var master = await _memberRepository.GetForGuildOperationsAsync(request.MasterId, cancellationToken); var currentMemberIds = guild.Members.Select(x => x.Id).ToArray(); var receivedAlreadyMemberIds = request.MemberIds.Intersect(currentMemberIds).ToArray(); var idsToInvite = request.MemberIds.Except(receivedAlreadyMemberIds).ToArray(); var idsToKick = currentMemberIds.Except(receivedAlreadyMemberIds).ToArray(); // invite and accept new members await _memberRepository.Query(x => !x.Disabled) .Join(idsToInvite, x => x.Id, id => id, (member, _) => member).AsQueryable() .ForEachAsync(memberToInvite => guild.Invite(memberToInvite)?.BeAccepted(), cancellationToken); // kick members not received from the request await guild.Members .Join(idsToKick, x => x.Id, id => id, (member, _) => member).AsQueryable() .ForEachAsync(memberToKick => memberToKick.LeaveGuild(), cancellationToken); guild.ChangeName(request.Name); guild.Promote(master); return(new ApiResponse <Guild>(_guildRepository.Update(guild))); }
public async Task <IActionResult> PutAsync(Guid id, [FromBody] UpdateGuildCommand command, CancellationToken cancellationToken) { command.Id = id; return(await _mediator.Send(command, cancellationToken)); }