public async Task <CreateBookCommandResult> Handle(CreateBookManualCommand request, CancellationToken cancellationToken)
        {
            var categories = await _categoryRepository.GetAllByIdAsync(request.CategoriesIds);

            if (!categories.Any())
            {
                return(new CreateBookCommandResult(false, new[] { "Requested category/s not found" }));
            }

            var authors = await _authorRepository.GetAllByIdAsync(request.AuthorsIds);

            if (!authors.Any())
            {
                return(new CreateBookCommandResult(false, new[] { "Requested category/s not found" }));
            }

            var book = new Domain.Book(request.Title,
                                       request.Description, request.Isbn10,
                                       request.Isbn13, request.LanguageId,
                                       request.PublisherId, request.PageCount,
                                       request.Visibility, request.PublishedDate);

            foreach (var category in categories)
            {
                book.AddCategory(category);
            }

            foreach (var author in authors)
            {
                book.AddAuthor(author);
            }

            var result = _bookRepository.Add(book);

            if (await _bookRepository.UnitOfWork.SaveChangesAsync(cancellationToken) < 1)
            {
                return(new CreateBookCommandResult(false, new[] { "Error occured during saving Book" }));
            }


            var bookResult = _mapper.Map <CommandBookDto>(result);

            var bookResultEvent = _mapper.Map <CreateBook>(result);

            bookResultEvent.Language = result.LanguageId > 0
                ? _mapper.Map <LanguageDto>(await _languageRepository.FindByIdAsync(result.LanguageId ?? 0))
                : null;
            bookResultEvent.Publisher = result.LanguageId > 0
                ? _mapper.Map <PublisherDto>(await _publisherRepository.FindByIdAsync(result.PublisherId ?? 0))
                : null;


            var endpoint = await _sendEndpointProvider.GetSendEndpoint(new Uri($"queue:{EventBusConstants.CreateBookQueue}"));

            await endpoint.Send(bookResultEvent, cancellationToken);

            return(new CreateBookCommandResult(true, bookResult));
        }
Example #2
0
        public CreateBookManualCommandValidator(IAuthorRepository authorRepository,
                                                ICategoryRepository categoryRepository,
                                                ILanguageRepository languageRepository,
                                                IPublisherRepository publisherRepository)
        {
            _authorRepository    = authorRepository;
            _categoryRepository  = categoryRepository;
            _languageRepository  = languageRepository;
            _publisherRepository = publisherRepository;

            RuleFor(b => b.Title)
            .MinimumLength(3)
            .MaximumLength(100);

            RuleFor(b => b.Description)
            .MinimumLength(3)
            .MaximumLength(5000);

            RuleFor(b => b.Isbn10)
            .Length(10)
            .Matches("^[0-9]+$").WithMessage("ISBN10 Field must contain only digits");
            RuleFor(b => b.Isbn13)
            .Length(13)
            .Matches("^[0-9]+$").WithMessage("ISBN13 Field must contain only digits");

            RuleFor(b => b.PageCount)
            .GreaterThanOrEqualTo((ushort)1);

            const int authorIdMinValue = 1;

            RuleFor(b => b.AuthorsIds)
            .NotEmpty()
            .ForEach(a =>
                     a.GreaterThanOrEqualTo(authorIdMinValue)
                     .WithMessage($"Author id must be greater then {authorIdMinValue - 1}"))
            .AllValuesMustExistsInDb(nameof(Author.Id), _authorRepository.GetAllAsync());

            RuleFor(b => b.LanguageId)
            .GreaterThanOrEqualTo(1)
            .ValueMustExistsInDb(id => _languageRepository.FindByIdAsync(id ?? 0));


            RuleFor(b => b.PublisherId)
            .GreaterThanOrEqualTo(1)
            .ValueMustExistsInDb(id => _publisherRepository.FindByIdAsync(id ?? 0));

            const int categoryIdMinValue = 1;

            RuleFor(b => b.CategoriesIds)
            .ForEach(c =>
                     c.GreaterThanOrEqualTo(categoryIdMinValue)
                     .WithMessage($"Category id must be greater than {categoryIdMinValue - 1}"))
            .AllValuesMustExistsInDb(nameof(Category.Id), _categoryRepository.GetAllAsync());
        }
        public async Task <LanguageDto> Handle(FindLanguageByIdQuery request, CancellationToken cancellationToken)
        {
            var language = await _languageRepository.FindByIdAsync(request.Id);

            return(language is not null
                ? new LanguageDto()
            {
                Id = language.Id,
                Name = language.Name
            } : null);
        }
Example #4
0
        public async Task <Language> FindByIdAsync(int id)
        {
            _logger.LogInfoCreateMethodStarted <Language>(LanguageRepositoryType, nameof(FindByIdAsync), new object[] { id });


            var result = await _languageRepository.FindByIdAsync(id);

            if (result is null)
            {
                _logger.LogWarningNotFound <Language>(LanguageRepositoryType, nameof(FindByIdAsync), new object[] { id });
            }


            _logger.LogInfoMethodEnded(LanguageRepositoryType, nameof(FindByIdAsync), result);
            return(result);
        }