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)));
        }
Example #3
0
 public async Task <IActionResult> PutAsync(Guid id, [FromBody] UpdateGuildCommand command, CancellationToken cancellationToken)
 {
     command.Id = id;
     return(await _mediator.Send(command, cancellationToken));
 }