public async Task <ActionResult <CharacterAddJobResponse> > PostCharacterAddJobAsync(
            [FromServices] NaheulbookExecutionContext executionContext,
            [FromRoute] int characterId,
            CharacterAddJobRequest request
            )
        {
            try
            {
                await _characterService.AddJobAsync(executionContext, characterId, request);

                return(new CharacterAddJobResponse {
                    JobId = request.JobId
                });
            }
            catch (CharacterAlreadyKnowThisJobException ex)
            {
                throw new HttpErrorException(StatusCodes.Status409Conflict, ex);
            }
            catch (JobNotFoundException ex)
            {
                throw new HttpErrorException(StatusCodes.Status400BadRequest, ex);
            }
            catch (ForbiddenAccessException ex)
            {
                throw new HttpErrorException(StatusCodes.Status403Forbidden, ex);
            }
            catch (CharacterNotFoundException ex)
            {
                throw new HttpErrorException(StatusCodes.Status404NotFound, ex);
            }
        }
        public void AddJobAsync_AddNewJobToCharacterJobsAndNotifyIt()
        {
            const int characterId      = 5;
            var       jobId            = Guid.NewGuid();
            var       executionContext = new NaheulbookExecutionContext();
            var       request          = new CharacterAddJobRequest {
                JobId = jobId
            };
            var character = new Character {
                Jobs = new List <CharacterJob>(), Id = characterId
            };
            var job = new Job {
                Id = jobId
            };

            _unitOfWorkFactory.GetUnitOfWork().Characters.GetWithOriginWithJobsAsync(characterId)
            .Returns(character);
            _unitOfWorkFactory.GetUnitOfWork().Jobs.GetAsync(jobId)
            .Returns(job);
            _unitOfWorkFactory.GetUnitOfWork().When(x => x.SaveChangesAsync())
            .Do(_ =>
            {
                character.Jobs.Should().HaveCount(1);
                character.Jobs.First().Job.Should().BeSameAs(job);
            });

            _service.AddJobAsync(executionContext, characterId, request);

            Received.InOrder(() =>
            {
                _notificationSessionFactory.NotificationSession.NotifyCharacterAddJob(characterId, jobId);
                _unitOfWorkFactory.GetUnitOfWork().SaveChangesAsync();
                _notificationSessionFactory.NotificationSession.Received().CommitAsync();
            });
        }
        public void AddJobAsync_WhenCharacterNotFound_Throw()
        {
            var       jobId            = Guid.NewGuid();
            const int characterId      = 5;
            var       executionContext = new NaheulbookExecutionContext();
            var       request          = new CharacterAddJobRequest {
                JobId = jobId
            };

            _unitOfWorkFactory.GetUnitOfWork().Characters.GetWithOriginWithJobsAsync(characterId)
            .Returns((Character)null);

            Func <Task> act = () => _service.AddJobAsync(executionContext, characterId, request);

            act.Should().Throw <CharacterNotFoundException>();
        }
        public void AddJobAsync_EnsureCanAccessCharacter()
        {
            var       jobId            = Guid.NewGuid();
            const int characterId      = 5;
            var       executionContext = new NaheulbookExecutionContext();
            var       request          = new CharacterAddJobRequest {
                JobId = jobId
            };
            var character = new Character {
                Jobs = new List <CharacterJob>(), Id = characterId
            };

            _unitOfWorkFactory.GetUnitOfWork().Characters.GetWithOriginWithJobsAsync(characterId)
            .Returns(character);

            _authorizationUtil.When(x => x.EnsureCharacterAccess(executionContext, character))
            .Throw(new TestException());

            Func <Task> act = () => _service.AddJobAsync(executionContext, characterId, request);

            act.Should().Throw <TestException>();
        }
        public void AddJobAsync_WhenCharacterAlreadyKnowTheJob_Throw()
        {
            const int characterId      = 5;
            var       jobId            = Guid.NewGuid();
            var       executionContext = new NaheulbookExecutionContext();
            var       request          = new CharacterAddJobRequest {
                JobId = jobId
            };
            var character = new Character {
                Jobs = new List <CharacterJob> {
                    new CharacterJob {
                        JobId = jobId
                    }
                }, Id = characterId
            };

            _unitOfWorkFactory.GetUnitOfWork().Characters.GetWithOriginWithJobsAsync(characterId)
            .Returns(character);

            Func <Task> act = () => _service.AddJobAsync(executionContext, characterId, request);

            act.Should().Throw <CharacterAlreadyKnowThisJobException>();
        }
Example #6
0
        public async Task AddJobAsync(NaheulbookExecutionContext executionContext, int characterId, CharacterAddJobRequest request)
        {
            using (var uow = _unitOfWorkFactory.CreateUnitOfWork())
            {
                var character = await uow.Characters.GetWithOriginWithJobsAsync(characterId);

                if (character == null)
                {
                    throw new CharacterNotFoundException(characterId);
                }

                _authorizationUtil.EnsureCharacterAccess(executionContext, character);

                if (character.Jobs.Any(x => x.JobId == request.JobId))
                {
                    throw new CharacterAlreadyKnowThisJobException(character.Id, request.JobId);
                }

                var job = await uow.Jobs.GetAsync(request.JobId);

                if (job == null)
                {
                    throw new JobNotFoundException(request.JobId);
                }

                character.Jobs.Add(new CharacterJob
                {
                    Job = job
                });

                var notificationSession = _notificationSessionFactory.CreateSession();
                notificationSession.NotifyCharacterAddJob(character.Id, job.Id);

                await uow.SaveChangesAsync();

                await notificationSession.CommitAsync();
            }
        }