public async Task <IActionResult> PutAsync([FromBody] Item item) { _logger.LogDebug("Executing PutAsync"); var yearMonth = DateTime.Now.ToString("yyyy-MM"); var getMonthsItemsTask = _contentService.GetMonthsItemsAsync(yearMonth); var sitemapIndexCreateTask = CreateSiteMapIndex(); var sitemapXmlCreateTask = CreateSitemapXml(await getMonthsItemsTask); var renderItemHtmlTask = _viewRenderer.RenderViewAsync(this, "~/Views/ContentView.cshtml", item, false); // Generate the HTML/XML in parallel var sitemapIndexStream = await sitemapIndexCreateTask; var sitemapXmlStream = await sitemapXmlCreateTask; var itemHtmlString = await renderItemHtmlTask; var itemXmlStream = await SerializeItemToXml(item); try { // Write the HTML/XML to S3 in parallel var writeContentResult = await _staticWebsiteService.WriteFilesAsync( new StaticContentRequest { FilePath = "sitemapindex.xml", ContentStream = sitemapIndexStream }, new StaticContentRequest { FilePath = yearMonth + "-sitemap.xml", ContentStream = sitemapXmlStream }, new StaticContentRequest { FilePath = item.Slug + ".html", ContentBody = itemHtmlString }, new StaticContentRequest { FilePath = item.Slug + ".xml", ContentStream = itemXmlStream }); return(Validate(writeContentResult, _logger)); } catch (Exception e) { _logger.LogError(e, $"Failed to write item content to the static file store: {e.Message}"); return(StatusCode(500, new ProblemDetails { Status = 500, Title = e.Message, Detail = e.InnerException?.Message, Instance = Request.Path })); } }
public async Task <IActionResult> PutDailyMailAsync(DateTime?date = null) { var sendDate = date ?? DateTime.Today; // Load all the required data in parallel var itemsTask = _contentService.GetDailyItemsAsync(sendDate); var specialitiesCategoryTask = _mailChimpManager.InterestCategories.GetAsync(_mailChimpConfig.ListId, _mailChimpConfig.SpecialityCategoryId); var specialitiesGroupsTask = _mailChimpManager.Interests.GetAllAsync(_mailChimpConfig.ListId, _mailChimpConfig.SpecialityCategoryId); var receiveEverythingCategoryTask = _mailChimpManager.InterestCategories.GetAsync(_mailChimpConfig.ListId, _mailChimpConfig.ReceiveEverythingCategoryId); var receiveEverythingGroupsTask = _mailChimpManager.Interests.GetAllAsync(_mailChimpConfig.ListId, _mailChimpConfig.ReceiveEverythingCategoryId); // Wait for all the data to be loaded var items = await itemsTask; var specialitiesCategory = await specialitiesCategoryTask; var specialitiesGroups = await specialitiesGroupsTask; var receiveEverythingCategory = await receiveEverythingCategoryTask; var receiveEverythingGroups = await receiveEverythingGroupsTask; // Validate all the data is present and correct if (!items.Any()) { var message = $"Not sending email for {sendDate}, no items returned from the CMS"; _logger.LogWarning(message); return(Content(message)); } else if (specialitiesCategory == null) { var message = $"Couldn't find specialities group category with id {_mailChimpConfig.SpecialityCategoryId}"; _logger.LogError(message); return(StatusCode(500, message)); } else if (receiveEverythingCategory == null) { var message = $"Couldn't find 'send me everything' category with id {_mailChimpConfig.ReceiveEverythingCategoryId}"; _logger.LogError(message); return(StatusCode(500, message)); } else if (receiveEverythingGroups.Count() != 1) { var message = $"There should only be 1 group within the 'send me everything' group category but found {receiveEverythingGroups.Count()}"; _logger.LogError(message); return(StatusCode(500, message)); } var viewModel = new DailyEmailViewModel { Items = items.ToList(), SpecialitiesGroupCategoryName = specialitiesCategory.Title, EverythingGroupCategoryName = receiveEverythingCategory.Title, EverythingGroupName = receiveEverythingGroups.Single().Name, AllSpecialities = string.Join(",", specialitiesGroups.Select(y => y.Name).ToList()) }; var body = await _viewRenderer.RenderViewAsync(this, "~/Views/Mail/Daily.cshtml", viewModel); var previewText = "The very latest current awareness and evidence-based medicines information"; try { var campaign = await _mailService.CreateAndSendDailyAsync( sendDate, previewText, body, items.SelectMany(x => x.Specialities).Select(y => y.Title).ToList(), specialitiesGroups, receiveEverythingGroups.Single().Id); return(Json(campaign)); } catch (Exception e) { _logger.LogError(e, $"Failed to send daily email - exception: {e.Message}"); return(StatusCode(500, new ProblemDetails { Status = 500, Title = e.Message, Detail = e.InnerException?.Message })); } }