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