Example #1
0
        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 });
        }
Example #2
0
        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);
            }
        }