private async Task SendEmailAsync(JumpStart jumpStart) { var company = await _dbContext.Companies.FirstOrDefaultAsync(item => item.Name == VolkswagenCompany.Name); var pdfUrl = await _jumpStartPdfService.CreatePdfUrlAsync(jumpStart); var emailTemplate = _jumpStartEmailTemplateService.GetEmailHtml(jumpStart.DateTime, jumpStart.Posts); var recipients = await GetRecipients(jumpStart.Id); var subject = $"Project Blue Delta - {jumpStart.DateTime.InZone(VolkswagenCompany.TimeZoneId, "MMMM d, yyyy")}"; foreach (var batch in recipients.Batch(SendGridService.BatchSize)) { var subjects = Enumerable.Repeat(subject, batch.Count).ToList(); var substitutions = Enumerable.Repeat(new Dictionary <string, string> { { "{{print_url}}", pdfUrl } }, batch.Count).ToList(); await _sendGridService.SendEmail(company.Id, batch, subjects, emailTemplate, emailTemplate, substitutions, jumpStart.DateTime); foreach (var recipient in batch) { recipient.Status = EmailStatus.Sent; } await _dbContext.SaveChangesAsync(); } }
private string GetTemplate(JumpStart jumpStart, List <Article> articles, string templateName, int maxMiddleCount, string?pdfUrl) { var data = GetData(jumpStart, articles, pdfUrl, maxMiddleCount); return(Compile(templateName, data)); }
private async Task SendEmailAsync(JumpStart jumpStart) { var company = await _dbContext.Companies.FirstOrDefaultAsync(item => item.Name == VolkswagenCompany.Name); var pdfUrl = await _jumpStartPdfService.CreatePdfUrlAsync(jumpStart); var emailTemplate = _jumpStartEmailTemplateService.GetEmailHtml(jumpStart, jumpStart.Articles, pdfUrl); var recipients = await GetRecipients(jumpStart.Id); var subject = $"Project Blue Delta - {jumpStart.DateTime.InZone(VolkswagenCompany.TimeZoneId, "MMMM d, yyyy")}"; foreach (var batch in recipients.Batch(SendGridService.BatchSize)) { await _sendGridService.SendEmail(company.Id, batch, subject, emailTemplate, emailTemplate, jumpStart.DateTime); foreach (var recipient in batch) { recipient.Status = EmailStatus.Sent; } await _dbContext.SaveChangesAsync(); } }
public async Task CreateAsync(DateTime dateTime, List <string> distributionGroups, List <int> postIds) { var posts = await _dbContext.Posts.Where(item => postIds.Contains(item.Id)) .ToListAsync(); var isValid = posts.All(item => item.Date.Date <= dateTime.Date && item.JumpStartId == null) && posts.Count == postIds.Count; if (!isValid) { throw new InvalidActionException("Invalid posts"); } var jumpStart = new JumpStart { DateTime = dateTime, DistributionGroups = string.Join(',', distributionGroups), Status = JumpStartStatus.ReadyToSend, Posts = posts }; foreach (var post in posts) { post.JumpStart = jumpStart; post.Order = postIds.IndexOf(post.Id); } _dbContext.UpdateRange(posts); await _dbContext.SaveChangesAsync(); _backgroundJobClient.Enqueue <JumpStartPdfService>(service => service.CreatePdfAsync(jumpStart.Id)); }
protected override void ExecuteCombo(int id) { switch (id) { case 10: JumpStart?.Invoke(); break; case 11: JumpEnd?.Invoke(); break; case 20: DashStart?.Invoke(); break; case 21: DashEnd?.Invoke(); break; case 30: ShootHold?.Invoke(); break; case 31: ShootRelease?.Invoke(); break; } }
private async Task SendEmailAsync(JumpStart jumpStart, List <Article> articles) { var company = await _dbContext.Companies.FirstOrDefaultAsync(item => item.Name == VolkswagenCompany.Slug); var pdfUrl = await _jumpStartPdfJob.CreatePdfUrlAsync(jumpStart); var emailTemplate = _jumpStartEmailTemplateService.GetEmailHtml(jumpStart.DateTime.Date, articles, pdfUrl); var recipients = await GetRecipients(jumpStart.Id); var subject = $"Project Blue Delta - {jumpStart.DateTime:MMMM d, yyyy}"; foreach (var batch in recipients.Batch(SendGridService.BatchSize)) { await _sendGridService.SendEmail(company.Id, batch, subject, emailTemplate, emailTemplate, nameof(EmailRecipient.MemoId), jumpStart.Id.ToString(), jumpStart.DateTime); foreach (var recipient in batch) { recipient.Status = EmailStatus.Sent; } await _dbContext.SaveChangesAsync(); } }
private Dictionary <string, object> GetData(JumpStart jumpStart, List <Article> articles, string?pdfUrl, int maxMiddleCount) { var result = new Dictionary <string, object>(); AddGeneralData(result, jumpStart.DateTime, pdfUrl); var remainingArticles = articles.ToList(); var(answer, remains) = PickArticle(remainingArticles, item => item.Category.Slug == AnswersCategorySlug); remainingArticles = remains; AddArticleToData("article0", result, answer); var(top, remaining) = PickArticles(remainingArticles, item => item.Category.Slug == PriorityCategorySlug); remainingArticles = remaining; AddArticlesToData("articlesTop", result, top); var middle = remainingArticles.Take(maxMiddleCount); AddArticlesToData("articlesMiddle", result, middle); var bottom = remainingArticles.Skip(maxMiddleCount); AddArticlesToData("articlesBottom", result, bottom); return(result); }
public JumpStartResult(JumpStart jumpStart) { Id = jumpStart.Id; DateTime = jumpStart.DateTime; DistributionGroups = jumpStart.DistributionGroups.Split(',').ToList(); Articles = jumpStart.Articles.Select(item => new ArticleResult(item)).ToList(); }
private async Task <EmailInfo> GetEmailInfoAsync(JumpStart jumpStart, List <Data.Entity.Models.Email> emails, List <Article> articles) { var company = await _dbContext.Companies.FirstOrDefaultAsync(item => item.Name == VolkswagenCompany.Slug); var pdfUrl = await _jumpStartPdfJob.CreatePdfUrlAsync(jumpStart); var emailTemplate = _jumpStartEmailTemplateService.GetEmailHtml(jumpStart.DateTime.Date, articles, pdfUrl); return(new EmailInfo(company.Id, emails) { Subject = $"Project Blue Delta - {jumpStart.DateTime:MMMM d, yyyy}", HtmlContent = emailTemplate, PlainTextContent = emailTemplate, SendAt = jumpStart.DateTime }); }
public async Task <byte[]> BuildPdfAsync(JumpStart jumpStart) { var emailTemplate = _jumpStartEmailTemplateService.GetPdfHtml(jumpStart); await using var browser = await GetBrowser(); await using var page = await browser.NewPageAsync(); await page.SetContentAsync(emailTemplate); var pdfData = await page.PdfDataAsync(new PdfOptions { PrintBackground = true }); return(pdfData); }
private async Task SendEmailAsync(JumpStart jumpStart, List <Article> articles) { var emails = await GetRecipientsAsync(jumpStart.Id); //var recipients = emails.Select(item => Tuple.Create(item.EmailAddress, (string?) null)).ToList(); var emailInfo = await GetEmailInfoAsync(jumpStart, emails, articles); await _sendGridService.SendEmailAsync(emailInfo); foreach (var emailRecipient in emails) { emailRecipient.Status = EmailStatus.Sent; } await _dbContext.SaveChangesAsync(); }
public async Task <byte[]> BuildScreenshotAsync(JumpStart jumpStart, List <Article> articles) { var emailTemplate = _jumpStartEmailTemplateService.GetEmailHtml(jumpStart, articles, null); await using var browser = await GetBrowser(); await using var page = await browser.NewPageAsync(); await page.SetContentAsync(emailTemplate); var screenShotData = await page.ScreenshotDataAsync(new ScreenshotOptions { FullPage = true }); return(screenShotData); }
private async Task <JumpStart> CreateAsync(DateTime dateTime, List <string> distributionGroups, List <Article> articles) { var jumpStart = new JumpStart { DateTime = dateTime, Status = JumpStartStatus.Preview, DistributionGroups = distributionGroups }; _dbContext.JumpStarts.Add(jumpStart); Rearrange(articles); await _dbContext.SaveChangesAsync(); return(jumpStart); }
private async Task EnsureJumpStartExistAsync(DateTime date) { var jumpStart = await _dbContext.JumpStarts.FirstOrDefaultAsync(item => item.DateTime.Date == date); if (jumpStart != null) { if (jumpStart.Status != JumpStartStatus.Preview) { // This should never happen throw new Exception(); } return; } // TODO: Get default distribution group var emailRecipient = await _dbContext.Recipients.FirstOrDefaultAsync(); var distributionGroup = emailRecipient?.DistributionGroup; if (distributionGroup is null) { throw new InvalidActionException( "Cannot find any distribution group. Please import your recipients first."); } jumpStart = new JumpStart { // TODO: Get default send time DateTime = date.AddHours(10).AddMinutes(14), Status = JumpStartStatus.Preview, DistributionGroups = distributionGroup }; _dbContext.JumpStarts.Add(jumpStart); }
public JumpStartInfo(JumpStart jumpStart, List <string> articles, ListStats listStats) { JumpStart = jumpStart; Articles = articles; ListStats = listStats; }
public string GetEmailHtml(JumpStart jumpStart, List <Article> articles, string?pdfUrl) { var(templateName, maxMiddleCount) = GetTemplateName(articles, false); return(GetTemplate(jumpStart, articles, templateName, maxMiddleCount, pdfUrl)); }
public string GetPdfHtml(JumpStart jumpStart) { var(templateName, maxMiddleCount) = GetTemplateName(jumpStart.Articles, true); return(GetTemplate(jumpStart, jumpStart.Articles, templateName, maxMiddleCount, null)); }
private string GetName(JumpStart jumpStart) { return($"volkswagen_pdf/{jumpStart.DateTime.Date:yyyy_MM_dd}.pdf"); }
private async Task UploadPdfAsync(JumpStart jumpStart, byte[] pdfData) { await _googleStorageService.UploadPdfAsync(GetName(jumpStart), pdfData); }
public Task <string> CreatePdfUrlAsync(JumpStart jumpStart) { return(_googleStorageService.CreateSignedUrlAsync(GetName(jumpStart), 24)); }
private async Task UploadPdfAsync(JumpStart jumpStart, byte[] pdfData) { await _googleStorageService.UploadFileAsync(GetName(jumpStart), "application/pdf", new MemoryStream(pdfData)); }