async Task IBackgroundTasks.EmailReport(string[] recipients, string subjectTemplate, string bodyTemplate, string htmlBodyTemplate, object model, string reportName, IDictionary <string, string> paramValueByParamName) { var res = await ReportRunner.ExecuteAsync(reportName, paramValueByParamName); await EmailAsync(recipients, subjectTemplate, bodyTemplate, htmlBodyTemplate, model, new[] { res }); }
public async Task <ActionResult> ExecuteReport(string name, string frequency) { var report = (await PortalHelpers.GetReportsAsync(name)).FirstOrDefault(); if (report == null) { return(NotFound()); } var paramValueByParamName = new Dictionary <string, string>(); foreach (string k in Request.Form.Keys) { if (!k.StartsWith(ReportParameterNamePrefix)) { continue; } paramValueByParamName[k.RightOf(ReportParameterNamePrefix)] = Request.Form[k].FirstOrDefault(); } var config = ConfigOptions.Value; var template = PortalHelpers.GetEmailTemplate(config.ReportEmailTemplateId); switch (frequency) { case "": case null: case ReportFrequencies.Synchronous: { var res = await ReportRunner.ExecuteAsync(name, paramValueByParamName); var cd = new System.Net.Mime.ContentDisposition { FileName = res.Name, Inline = false, }; Response.Headers.Add("Content-Disposition", cd.ToString()); return(File(res.ContentStream, res.ContentType.MediaType)); } case ReportFrequencies.EmailMeOnce: { if (template == null) { throw new UloException(UloExceptionCodes.NoEmailTemplate, $"templateId={config.ReportEmailTemplateId} for report={report.Name}"); } var recipients = new[] { CurrentUser.Email }; var o = new ReportEmailViewModel(User.Identity.Name) { Report = report }; var jobId = BackgroundJobClient.Enqueue <IBackgroundTasks>(b => b.EmailReport(recipients, template.EmailSubject, template.EmailBody, template.EmailHtmlBody, o, name, paramValueByParamName)); AddPageAlert(new PageAlert($"Scheduled immediate execution of report \"{report.Title}\" for email to {recipients.FirstOrDefault()} with jobId={jobId}", false)); return(RedirectToAction(ActionNames.ListReports)); } case ReportFrequencies.Recurring: { if (template == null) { throw new UloException(UloExceptionCodes.NoEmailTemplate, $"templateId={config.ReportEmailTemplateId} for report={report.Name}"); } var domains = CSV.ParseLine(config.ReportRecipientEmailDomains).ToCaseInsensitiveSet(); var recipients = Request.Form["recipients"].FirstOrDefault().Split(';', ',', '\t', ' ', '\r', '\n').Select(z => z.TrimOrNull()).WhereNotNull().Where(z => domains.Contains(z.RightOf("@"))).ToArray(); var now = DateTime.UtcNow; var recurringJobId = $"{User.Identity.Name}.Report.{report.Name}.{now.ToYYYYMMDD()}.{now.ToHHMMSS()}"; var o = new ReportEmailViewModel(User.Identity.Name) { JobId = recurringJobId, Report = report, UserNote = Request.Form["userNote"].FirstOrDefault() }; var job = Hangfire.Common.Job.FromExpression <IBackgroundTasks>(b => b.EmailReport(recipients, template.EmailSubject, template.EmailBody, template.EmailHtmlBody, o, name, paramValueByParamName)); var cron = Request.Form["cron"].FirstOrDefault().TrimOrNull(); if (cron == null) { var time = DateTime.Parse(Request.Form["time"]); time = TimeZoneInfo.ConvertTimeToUtc(time, PortalHelpers.DisplayTimeZone); cron = Hangfire.Cron.Daily(time.Hour, time.Minute); } RJM.AddOrUpdate(recurringJobId, job, cron); AddPageAlert(new PageAlert($"Scheduled recurring report \"{report.Title}\" for email to {recipients.Length} recipients with recurringJobId={recurringJobId}", false)); return(RedirectToAction(ActionNames.ListReports)); } default: throw new UnexpectedSwitchValueException(frequency); } }