public async Task <IActionResult> SubmitRequest(int id) { var request = _requestService.GetRequest(id); var authResult = await _authService.AuthorizeAsync(User, request, "CanEditRequest"); if (!authResult.Succeeded) { return(new ForbidResult()); } request.RequestStatus = RequestStatus.UnderReview; request.SubmittedOn = DateTime.Now; _requestService.SaveChanges(); var identity = (ClaimsIdentity)User.Identity; await _auditLog.Append(identity.GetClaimAsInt("EmployeeId"), LogActionType.Submit, LogResourceType.Request, id, $"{identity.GetClaim(ClaimTypes.Name)} submitted request with id {id}"); if (request.Reviews.Count > 0) { Employee reviewer = request.OrderedReviews[0].Reviewer; string receipient = reviewer.Email; string emailName = "ReviewRequest"; var model = new { _emailHelper.AppUrl, _emailHelper.AppEmail, Request = request }; string subject = _emailHelper.GetSubjectFromTemplate(emailName, model, _email.Renderer); await _email.To(receipient) .Subject(subject) .UsingTemplateFromFile(_emailHelper.GetBodyTemplateFile(emailName), model) .SendAsync(); } else { request.RequestStatus = RequestStatus.Approved; request.CompletedOn = DateTime.Now; _requestService.SaveChanges(); foreach (var requestedSystem in request.Systems) { var systemAccess = new SystemAccess(request, requestedSystem); _systemService.AddSystemAccess(systemAccess); } string emailName = "ProcessRequest"; var model = new { _emailHelper.AppUrl, _emailHelper.AppEmail, Request = request }; _email.Subject(_emailHelper.GetSubjectFromTemplate(emailName, model, _email.Renderer)) .UsingTemplateFromFile(_emailHelper.GetBodyTemplateFile(emailName), model); _email.Data.ToAddresses.Clear(); var supportUnitIds = request.Systems.GroupBy(s => s.System.SupportUnitId, s => s).Select(g => g.Key).ToList(); foreach (var supportUnitId in supportUnitIds) { var supportUnit = _organizationService.GetSupportUnit((int)supportUnitId); _email.To(supportUnit.Email); } await _email.SendAsync(); } return(RedirectToAction("MyRequests")); }
private static IFluentEmail FillFluentEmail(ITemplate template, IFluentEmail fluentEmail, object htmlModel = null, object plainModel = null) { if (!string.IsNullOrEmpty(template.HtmlBodyTemplate)) { if (htmlModel != null) { fluentEmail.UsingTemplate(template.HtmlBodyTemplate, htmlModel); } else { fluentEmail.Body(template.HtmlBodyTemplate, true); } } if (!string.IsNullOrEmpty(template.PlainBodyTemplate)) { if (plainModel != null) { fluentEmail.PlaintextAlternativeUsingTemplate(template.PlainBodyTemplate, plainModel); } else { fluentEmail.PlaintextAlternativeBody(template.PlainBodyTemplate); } } if (!string.IsNullOrEmpty(template.Subject)) { fluentEmail.Subject(template.Subject); } if (!string.IsNullOrEmpty(template.FromAddress)) { fluentEmail.SetFrom(template.FromAddress); } fluentEmail.Data.Priority = template.Priority; if (!string.IsNullOrEmpty(template.Tag)) { fluentEmail.Tag(template.Tag); } return(fluentEmail); }
public async Task <IActionResult> Approve(int id, string password, string comments) { string username = ((ClaimsIdentity)User.Identity).GetClaim(ClaimTypes.NameIdentifier); if (!_adService.Authenticate(username, password)) { RedirectToAction(nameof(EditReview), new { id }); } Review review = _requestService.GetReview(id); var authResult = await _authService.AuthorizeAsync(User, review, "CanEnterReview"); if (!authResult.Succeeded) { return(new ForbidResult()); } Request request = _requestService.GetRequest(review.RequestId); review.Approve(comments); request.UpdatedOn = DateTime.Now; _requestService.SaveChanges(); var identity = (ClaimsIdentity)User.Identity; await _auditLog.Append(identity.GetClaimAsInt("EmployeeId"), LogActionType.Approve, LogResourceType.Request, request.RequestId, $"{identity.GetClaim(ClaimTypes.Name)} approved request with id {request.RequestId}"); if (review.ReviewOrder < request.Reviews.Count - 1) { Review nextReview = request.OrderedReviews[review.ReviewOrder + 1]; string emailName = "ReviewRequest"; var model = new { _emailHelper.AppUrl, _emailHelper.AppEmail, Request = request }; string subject = _emailHelper.GetSubjectFromTemplate(emailName, model, _email.Renderer); string receipient = nextReview.Reviewer.Email; _email.To(receipient) .Subject(subject) .UsingTemplateFromFile(_emailHelper.GetBodyTemplateFile(emailName), model) .Send(); emailName = "RequestUpdated"; subject = _emailHelper.GetSubjectFromTemplate(emailName, model, _email.Renderer); receipient = request.RequestedBy.Email; _email.To(receipient) .Subject(subject) .UsingTemplateFromFile(_emailHelper.GetBodyTemplateFile(emailName), model) .Send(); } else // last review { request.RequestStatus = RequestStatus.Approved; request.CompletedOn = DateTime.Now; _requestService.SaveChanges(); foreach (var requestedSystem in request.Systems) { var systemAccess = new SystemAccess(request, requestedSystem); _systemService.AddSystemAccess(systemAccess); } string emailName = "RequestApproved"; var model = new { _emailHelper.AppUrl, _emailHelper.AppEmail, Request = request }; string subject = _emailHelper.GetSubjectFromTemplate(emailName, model, _email.Renderer); string receipient = request.RequestedBy.Email; _email.To(receipient) .Subject(subject) .UsingTemplateFromFile(_emailHelper.GetBodyTemplateFile(emailName), model) .Send(); emailName = "ProcessRequest"; _email.Subject(_emailHelper.GetSubjectFromTemplate(emailName, model, _email.Renderer)) .UsingTemplateFromFile(_emailHelper.GetBodyTemplateFile(emailName), model); _email.Data.ToAddresses.Clear(); var supportUnitIds = request.Systems.GroupBy(s => s.System.SupportUnitId, s => s).Select(g => g.Key).ToList(); foreach (var supportUnitId in supportUnitIds) { var supportUnit = _organizationService.GetSupportUnit((int)supportUnitId); _email.To(supportUnit.Email); } await _email.SendAsync(); } return(RedirectToAction(nameof(MyReviews))); }