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); } }