Ejemplo n.º 1
0
        public async Task <GroupInvite> CreateInviteAsync(NaheulbookExecutionContext executionContext, int groupId, CreateInviteRequest request)
        {
            using (var uow = _unitOfWorkFactory.CreateUnitOfWork())
            {
                var group = await uow.Groups.GetAsync(groupId);

                if (group == null)
                {
                    throw new GroupNotFoundException(groupId);
                }

                var character = await uow.Characters.GetWithOriginWithJobsAsync(request.CharacterId);

                if (character == null)
                {
                    throw new CharacterNotFoundException(request.CharacterId);
                }

                if (character.GroupId != null)
                {
                    throw new CharacterAlreadyInAGroupException(request.CharacterId);
                }

                if (request.FromGroup)
                {
                    _authorizationUtil.EnsureIsGroupOwner(executionContext, group);
                }
                else
                {
                    _authorizationUtil.EnsureIsCharacterOwner(executionContext, character);
                }

                var groupInvite = new GroupInvite
                {
                    Character = character,
                    Group     = group,
                    FromGroup = request.FromGroup,
                };

                uow.GroupInvites.Add(groupInvite);

                await uow.SaveChangesAsync();

                var session = _notificationSessionFactory.CreateSession();
                session.NotifyCharacterGroupInvite(request.CharacterId, groupInvite);
                session.NotifyGroupCharacterInvite(groupId, groupInvite);
                await session.CommitAsync();

                return(groupInvite);
            }
        }