Beispiel #1
0
        public async Task <IActionResult> Put([FromBody] ApplicationUpdateDTO dto)
        {
            // Only allow updates from local communicaton. And allow status locking and opening from everywhere,
            if (!HttpContext.Request.IsLocal())
            {
                if (!(dto.Status == ApplicationStatusEnum.Locked || dto.Status == ApplicationStatusEnum.Open))
                {
                    return(Forbid());
                }
            }

            var(result, (emailSent, emailError)) = await _applicationRepository.UpdateAsync(dto);

            if (!result)
            {
                _logger.LogError($"Updating status of application with id {dto.ApplicationId} failed. Application not found.");

                return(NotFound());
            }

            _logger.LogInformation($"Status of application with id {dto.ApplicationId} was updated to: {dto.Status.ToString()}.");

            if (dto.Status == ApplicationStatusEnum.Pending)
            {
                _logger.LogInformation($"Email donation received to receiver, sent to localhost:25. Status: {emailSent}");

                if (emailError != null)
                {
                    _logger.LogError($"Email error on donation received with applicationId: {dto.ApplicationId} with error message: {emailError}");
                }
            }
            if (dto.Status == ApplicationStatusEnum.Completed)
            {
                _logger.LogInformation($"Email thank you, sent to localhost:25. Status: {emailSent}");

                if (emailError != null)
                {
                    _logger.LogError($"Email error on thank you with applicationId: {dto.ApplicationId} with error message: {emailError}");
                }
            }



            return(NoContent());
        }
Beispiel #2
0
        public async Task <ActionResult <bool> > ConfirmReceival(int userId, int Id)
        {
            // Check if the user is the correct usertype
            var claimRole = User.Claims.First(c => c.Type == ClaimTypes.Role);

            if (!claimRole.Value.Equals(UserRoleEnum.Receiver.ToString()))
            {
                return(Unauthorized());
            }

            var claimId = User.Claims.First(c => c.Type == ClaimTypes.NameIdentifier);

            // Identity check of current user
            // if id does not match, it is forbidden to interact
            if (!claimId.Value.Equals(userId.ToString()))
            {
                return(Forbid());
            }

            var application = await _applicationRepository.FindAsync(Id);

            if (application == null)
            {
                _logger.LogError($"Confirmation was attempted but failed for application with id {Id} by user with id {userId}. Application not found.");

                return(NotFound());
            }

            if (application.ReceiverId != userId)
            {
                return(Forbid());
            }

            if (application.Status != ApplicationStatusEnum.Pending)
            {
                return(StatusCode(StatusCodes.Status422UnprocessableEntity));
            }

            _logger.LogInformation($"Confirmation was attempted for application with id {Id} by user with id {userId}.");

            var receiver = await _userRepository.FindAsync(application.ReceiverId);

            var producer = await _userRepository.FindAsync(application.ProducerId);

            var product = await _productRepository.FindAsync(application.ProductId);

            var(result, statusCode) = await _walletRepository.ConfirmReceival(Id, receiver, product, producer);

            if (result)
            {
                _logger.LogInformation($"The chatbot was called with application id {Id}. Response: {statusCode.ToString()}.");

                var dto = new ApplicationUpdateDTO
                {
                    ApplicationId = Id,
                    Status        = ApplicationStatusEnum.Completed
                };

                await _applicationRepository.UpdateAsync(dto);

                return(NoContent());
            }
            else
            {
                _logger.LogError($"The chatbot was called with application id {Id}. Response: {statusCode.ToString()}.");

                return(StatusCode(StatusCodes.Status500InternalServerError));
            }
        }
        /// <summary>
        /// Update state of application
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public async Task <(bool status, (bool emailSent, string emailError))> UpdateAsync(ApplicationUpdateDTO dto)
        {
            var application = await _context.Applications.
                              FirstOrDefaultAsync(p => p.Id == dto.ApplicationId);

            (bool emailSent, string emailError) = (false, null);

            if (application == null)
            {
                return(false, (emailSent, emailError));
            }

            application.Status       = dto.Status;
            application.LastModified = DateTime.UtcNow;

            if (dto.Status == ApplicationStatusEnum.Pending)
            {
                application.DateOfDonation = DateTime.UtcNow;

                // Send mail to receiver that product can be picked up
                var receiver = await _context.Users.FirstOrDefaultAsync(u => u.Id == application.UserId);

                var product = await _context.Products.FirstOrDefaultAsync(p => p.Id == application.ProductId);

                var producerId = product.UserId;
                var producer   = await _context.Producers.FirstOrDefaultAsync(p => p.UserId == producerId);

                var producerAddress = producer.Zipcode != null
                                        ? producer.Street + " " + producer.StreetNumber + ", " + producer.Zipcode + " " + producer.City
                                        : producer.Street + " " + producer.StreetNumber + ", " + producer.City;
                (emailSent, emailError) = SendDonationEmail(receiver.Email, product.Title, producerAddress);
            }
            else if (dto.Status == ApplicationStatusEnum.Completed)
            {
                var receiver = await _context.Users.FirstOrDefaultAsync(u => u.Id == application.UserId);

                if (receiver != null)
                {
                    (emailSent, emailError) = SendThankYouEmail(receiver.Email);
                }

                /*
                 * var mailInfo = await (from p in _context.Products
                 *                    where p.Id == application.ProductId
                 *                    select new
                 *                    {
                 *                        producerEmail = p.User.Email,
                 *                        receiverEmail = p.Applications.Where(
                 *                          a => a.ProductId == p.Id).FirstOrDefault()
                 *                          .User.Email,
                 *                        receiverFirstName = p.Applications.Where(
                 *                          a => a.ProductId == p.Id).FirstOrDefault()
                 *                          .User.FirstName,
                 *                        receiverSurName = p.Applications.Where(
                 *                          a => a.ProductId == p.Id).FirstOrDefault()
                 *                          .User.SurName,
                 *                        productTitle = p.Title,
                 *                        productPrice = p.Price,
                 *                        exchangeRate = (from c in _context.ByteExchangeRate
                 *                                        where c.Id == 1
                 *                                        select c.GBYTE_USD
                 *                                        ).FirstOrDefault(),
                 *                        sharedAddress = (from c in _context.Contracts
                 *                                         where c.ApplicationId == application.Id
                 *                                         select c.SharedAddress
                 *                                          ).FirstOrDefault(),
                 *                        bytes = (from c in _context.Contracts
                 *                                 where c.ApplicationId == application.Id
                 *                                 select c.Bytes
                 *                                  ).FirstOrDefault(),
                 *                    }).FirstOrDefaultAsync();
                 * if (mailInfo == null)
                 * {
                 *  return (true, (false, "Product for application not found"));
                 * }
                 *
                 * var bytesInUSD = BytesToUSDConverter.BytesToUSD(mailInfo.bytes, mailInfo.exchangeRate);
                 *
                 * // Send thank you email to receiver
                 * (emailSent, emailError) = SendThankYouEmail(mailInfo.receiverEmail, mailInfo.productTitle, dto.ApplicationId, mailInfo.bytes, bytesInUSD, mailInfo.sharedAddress);
                 *
                 * // Send confirmation mail to producer
                 *
                 * (emailSent, emailError) = SendProducerConfirmation(mailInfo.producerEmail, mailInfo.receiverFirstName, mailInfo.receiverSurName, dto.ApplicationId, mailInfo.productTitle, mailInfo.productPrice, mailInfo.bytes, bytesInUSD, mailInfo.sharedAddress);
                 */
            }
            else if (dto.Status == ApplicationStatusEnum.Open)
            {
                application.DateOfDonation = DateTime.MinValue;
                application.DonationDate   = null;
            }

            await _context.SaveChangesAsync();

            return(true, (emailSent, emailError));
        }