public async Task <bool> UpdateAsync(BookPutDto bookDto)
        {
            var book    = _mapper.Map <Book>(bookDto);
            var oldBook = await _bookRepository.GetAll().AsNoTracking().FirstOrDefaultAsync(a => a.Id == book.Id);

            if (oldBook == null)
            {
                return(false);
            }
            if (bookDto.FieldMasks.Contains("Image"))
            {
                string imagePath;
                bookDto.FieldMasks.Remove("Image");
                bookDto.FieldMasks.Add("ImagePath");
                if (oldBook.ImagePath != null)
                {
                    _imageService.DeleteImage(oldBook.ImagePath);
                }
                if (bookDto.Image != null)
                {
                    imagePath = await _imageService.UploadImage(bookDto.Image);
                }
                else
                {
                    imagePath = null;
                }
                book.ImagePath = imagePath;
            }
            await _bookRepository.Update(book, bookDto.FieldMasks);

            if (bookDto.UserId != oldBook.UserId)
            {
                var user = await _userLocationRepository.FindByIdAsync(oldBook.UserId.Value);

                string emailMessageForUser = $" Administrator has successfully received your book '{oldBook.Name}'";
                SendMailForOwnership(book, user, emailMessageForUser);
                SendNotificationToUser(oldBook.UserId.Value, book.Id, emailMessageForUser);

                var userId = _userResolverService.GetUserId();
                var admin  = await _userLocationRepository.FindByIdAsync(userId);

                string emailMessageForAdmin = $"You became the current owner of the book '{oldBook.Name}'";
                SendMailForOwnership(book, admin, emailMessageForAdmin);
                SendNotificationToUser(userId, book.Id, emailMessageForAdmin);
            }
            var affectedRows = await _bookRepository.SaveChangesAsync();

            var isDatabaseUpdated = affectedRows > 0;

            if (isDatabaseUpdated &&
                bookDto.FieldMasks.Contains("State") &&
                bookDto.State == BookState.Available)
            {
                await _wishListService.NotifyAboutAvailableBookAsync(book.Id);
            }
            return(true);
        }
Example #2
0
        /// <inheritdoc />
        public async Task <bool> RemoveAsync(int requestId)
        {
            var request = await _requestRepository.GetAll()
                          .Include(x => x.Book)
                          .Include(x => x.Owner)
                          .Include(x => x.User)
                          .FirstOrDefaultAsync(x => x.Id == requestId);

            if (request == null)
            {
                return(false);
            }

            await _hangfireJobScheduleService.DeleteRequestScheduleJob(requestId);

            if (request.Owner.IsEmailAllowed)
            {
                var emailMessage = new RequestMessage()
                {
                    UserName     = request.User.FirstName + " " + request.User.LastName,
                    OwnerName    = request.Owner.FirstName + " " + request.Owner.LastName,
                    BookName     = request.Book.Name,
                    RequestId    = request.Id,
                    OwnerAddress = new MailboxAddress($"{request.Owner.Email}")
                };
                await _emailSenderService.SendForCanceledRequestAsync(emailMessage);
            }

            await _notificationsService.NotifyAsync(
                request.Owner.Id,
                $"Your book '{request.Book.Name}' request was canceled.",
                request.BookId,
                NotificationAction.Open);

            await _notificationsService.NotifyAsync(
                request.User.Id,
                $"Your request for book '{request.Book.Name}' was canceled.",
                request.BookId,
                NotificationAction.Open);

            var book = await _bookRepository.FindByIdAsync(request.BookId);

            book.State = BookState.Available;
            var isBookUpdated = await _bookRepository.SaveChangesAsync() > 0;

            if (isBookUpdated)
            {
                await _wishListService.NotifyAboutAvailableBookAsync(book.Id);
            }

            _requestRepository.Remove(request);

            var affectedRows = await _requestRepository.SaveChangesAsync();

            return(affectedRows > 0);
        }