Ejemplo n.º 1
0
        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
                }));
            }
        }
Ejemplo n.º 2
0
        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
                }));
            }
        }