Пример #1
0
        /// <summary>
        /// Executes this instance.
        /// </summary>
        /// <returns>Task.</returns>
        private async Task Execute()
        {
            try
            {
                lock (syncLock)
                {
                    DateTime offset = DateTime.UtcNow.AddYears(-1);

                    var key   = context.JobDetail.Key.Name;
                    var group = context.JobDetail.Key.Group;
                    var users = emailRepository.GetScheduleById(group);

                    if (users == null)
                    {
                        return; //no one to send this to
                    }
                    if (users.Count > 0)
                    {
                        offset = users.Last().LastSent;
                    }

                    var stories = newsRepository.GetStoriesByDate(offset.AddDays(0)).ToList();
                    if (stories.Count == 0)
                    {
                        return;
                    }

                    var userList = emailRepository.GetUsers(group);
                    var config   = emailRepository.CloneConfiguration(group);

                    var mail = Map.MailConfiguration(config, w => w.Enabled);
                    mail.Body    = Map.StoryView(stories).MailMessage();
                    mail.Subject = "Crypto News Alert";

                    logger.LogInformation("Executing job {0} - Last Scan: {1} - Users: {2} - Stories: {3}",
                                          CronExprs.GetDescription(context.JobDetail.Key.Name), offset, users.Count, stories.Count);

                    logger.LogInformation("Emailing {0} stories {1}", stories.Count, userList);

                    if (config.SmtpClient == "RestSmtp")
                    {
                        var response = RestEmail.SendEmail(mail, config.RestSmtp);
                        logger.LogInformation($"Rest Call ResponseCode: {response?.StatusCode}");
                    }
                    else
                    {
                        using (SmtpClient client = Map.SmtpClient(config.Smtp))
                        {
                            logger.LogInformation("Emailing {0} stories {1}", stories.Count, userList);
                            client.Send(mail);
                            logger.LogInformation("Email Sent!");
                        }
                    }
                    logger.LogInformation("Email Sent!");

                    users.ForEach(user => user.LastSent = DateTime.UtcNow);
                    emailRepository.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                logger.LogError(1, ex, "An error occurred during execution of scheduled job");
            }
            await Task.FromResult(0);
        }