public ActionResult History(int page = 0, int resultsPerPage = 20)
 {
     using (var session = RavenDocStore.GetStore().OpenSession())
     {
         RavenQueryStatistics stats;
         var pagedResults = session.Query <CoordinatorTrackingData, CoordinatorTrackingDataByDate>()
                            .Statistics(out stats)
                            .Skip(page * resultsPerPage)
                            .Take(resultsPerPage)
                            .OrderByDescending(c => c.CreationDateUtc)
                            .ToList()
                            .Select(c => new CoordinatorOverview
         {
             CurrentStatus     = c.CurrentStatus,
             MessageCount      = c.GetCountOfSchedules(RavenDocStore.GetStore()), // TODO : Use of GetListOfCoordinatedSchedules can be done differently
             CoordinatorId     = c.CoordinatorId,
             CreationDateUtc   = c.CreationDateUtc,
             CompletionDateUtc = c.CompletionDateUtc,
             Tags  = c.MetaData != null && c.MetaData.Tags != null ? c.MetaData.Tags : new List <string>(),
             Topic = c.MetaData != null ? c.MetaData.Topic : string.Empty
         })
                            .OrderByDescending(c => c.CreationDateUtc)
                            .ToList();
         var totalResults            = stats.TotalResults;
         var coordinatorPagedResults = new CoordinatorPagedResults
         {
             CoordinatorOverviews = pagedResults,
             Page           = page,
             ResultsPerPage = resultsPerPage,
             TotalResults   = totalResults,
             TotalPages     = (int)Math.Ceiling((double)totalResults / (double)resultsPerPage)
         };
         return(View("CoordinatorPagedOverview", coordinatorPagedResults));
     }
 }
        public PartialViewResult ScheduleFailedDetails(Guid coordinatorId, int page = 0, int pageSize = 20)
        {
            using (var session = RavenDocStore.GetStore().OpenSession())
            {
                RavenQueryStatistics stats;
                var pagedResults = session.Query <ScheduleTrackingData>("ScheduleMessagesInCoordinatorIndex")
                                   .Statistics(out stats)
                                   .Skip(page * pageSize)
                                   .Take(pageSize)
                                   .Where(s => s.CoordinatorId == coordinatorId)
                                   .Where(s => s.MessageStatus == MessageStatus.Failed)
                                   .Select(s => new ScheduleFailedModel
                {
                    ScheduleId    = s.ScheduleId,
                    Number        = s.SmsData.Mobile,
                    ErrorMessage  = s.SmsFailureData.Message,
                    ErrorMoreInfo = s.SmsFailureData.MoreInfo,
                    ErrorCode     = s.SmsFailureData.Code
                })
                                   .ToList();

                var pages       = (int)Math.Ceiling((double)stats.TotalResults / (double)pageSize);
                var pagedResult = new PagedResult <ScheduleFailedModel> {
                    CurrentPage = page, TotalPages = pages, ResultsPerPage = pageSize, ResultsList = pagedResults, CoordinatorId = coordinatorId
                };
                return(PartialView("CoordinatorSchedulesFailed", pagedResult));
            }
        }
Пример #3
0
        public void Handle(CoordinatorCreatedEmail created)
        {
            var message = created.CoordinatorCreated;

            using (var session = RavenDocStore.GetStore().OpenSession("Configuration"))
            {
                var emailDefaultNotification = session.Load <EmailDefaultNotification>("EmailDefaultConfig");
                if (message.ConfirmationEmailAddresses.Count == 0 && (emailDefaultNotification == null || emailDefaultNotification.EmailAddresses.Count == 0))
                {
                    return;
                }

                var mailgunConfiguration = session.Load <MailgunConfiguration>("MailgunConfig");
                if (mailgunConfiguration == null || string.IsNullOrWhiteSpace(mailgunConfiguration.DefaultFrom))
                {
                    throw new ArgumentException("Could not find the default 'From' sender.");
                }
                var subject = "Coordinator " + message.MetaData.Topic + " (" + message.CoordinatorId + ") created.";

                var creationDateUserZone = DateTimeOlsenFromUtcMapping.DateTimeUtcToLocalWithOlsenZone(message.CreationDateUtc, message.UserOlsenTimeZone);

                var startTimeUserZone =
                    DateTimeOlsenFromUtcMapping.DateTimeUtcToLocalWithOlsenZone(
                        message.ScheduledMessages.Select(s => s.ScheduledTimeUtc).Min(), message.UserOlsenTimeZone);

                var endTimeUserZone =
                    DateTimeOlsenFromUtcMapping.DateTimeUtcToLocalWithOlsenZone(
                        message.ScheduledMessages.Select(s => s.ScheduledTimeUtc).Max(), message.UserOlsenTimeZone);

                var body = EmailTemplateResolver.GetEmailBody(@"Email\Templates\CoordinatorCreated.cshtml", new
                {
                    CoordinatorId        = message.CoordinatorId,
                    CreationDateUserZone = creationDateUserZone,
                    MessageCount         = message.ScheduledMessages.Count,
                    StartTimeUserZone    = startTimeUserZone,
                    EndTimeUserZone      = endTimeUserZone,
                    UserTimeZone         = message.UserOlsenTimeZone,
                    Topic = message.MetaData.Topic
                });

                var mailMessage = new MailMessage();
                mailMessage.From         = new MailAddress(mailgunConfiguration.DefaultFrom);
                mailMessage.Body         = body;
                mailMessage.BodyEncoding = Encoding.UTF8;
                mailMessage.IsBodyHtml   = true;
                mailMessage.Subject      = subject;

                foreach (var emailAddress in message.ConfirmationEmailAddresses)
                {
                    mailMessage.To.Add(emailAddress);
                }

                if (emailDefaultNotification != null)
                {
                    emailDefaultNotification.EmailAddresses.ForEach(e => mailMessage.To.Add(e));
                }
                MailActioner.Send(mailgunConfiguration, mailMessage);
            }
        }
 private string CoordinatorToExcludeText(CoordinatorTrackingData coordinatorTrackingData)
 {
     return(string.Format(
                "'{0}', {1} Sent, Started {2}",
                coordinatorTrackingData.MetaData.Topic,
                coordinatorTrackingData.GetListOfCoordinatedSchedules(RavenDocStore.GetStore()).Count(c => c.Status == MessageStatusTracking.CompletedSuccess).ToString(),
                coordinatorTrackingData.CreationDateUtc.ToLocalTime().ToShortDateString()));
 }
 public ActionResult Index()
 {
     using (var session = RavenDocStore.GetStore().OpenSession())
     {
         var coordinatorTrackingData = session.Query <CoordinatorTrackingData>()
                                       .Where(c => c.CurrentStatus != CoordinatorStatusTracking.Completed)
                                       .ToList();
         return(View("Index", coordinatorTrackingData));
     }
 }
        public ActionResult Create()
        {
            List <SelectListItem> selectListItems;

            using (var session = RavenDocStore.GetStore().OpenSession("SmsTracking"))
            {
                var thing = session.Query <CoordinatorTrackingData>().OrderByDescending(c => c.CreationDateUtc).Take(10).ToList();
                selectListItems = thing.Select(c => new SelectListItem {
                    Selected = false, Text = CoordinatorToExcludeText(c), Value = c.CoordinatorId.ToString()
                }).ToList();
            }
            ViewData.Add("CoordinatorExcludeList", selectListItems);
            return(View("Create"));
        }
Пример #7
0
        public void Handle(CoordinatorCompleteEmailWithSummary message)
        {
            using (var session = RavenDocStore.GetStore().OpenSession("Configuration"))
            {
                var emailDefaultNotification = session.Load <EmailDefaultNotification>("EmailDefaultConfig");
                if (message.EmailAddresses.Count == 0 && (emailDefaultNotification == null || emailDefaultNotification.EmailAddresses.Count == 0))
                {
                    return;
                }

                var mailgunConfiguration = session.Load <MailgunConfiguration>("MailgunConfig");
                if (mailgunConfiguration == null || string.IsNullOrWhiteSpace(mailgunConfiguration.DefaultFrom))
                {
                    throw new ArgumentException("Could not find the default 'From' sender.");
                }
                var subject = "Coordinator " + message.Topic + " (" + message.CoordinatorId + ") complete.";

                var finishTimeUserZone = DateTimeOlsenFromUtcMapping.DateTimeUtcToLocalWithOlsenZone(message.FinishTimeUtc, message.UserOlsenTimeZone);

                var body = EmailTemplateResolver.GetEmailBody(@"Email\Templates\CoordinatorFinishedWithSummary.cshtml", new
                {
                    message.CoordinatorId,
                    FinishTimeUserZone       = finishTimeUserZone,
                    UserTimeZone             = message.UserOlsenTimeZone,
                    MessageCount             = message.SuccessCount + message.FailedCount,
                    SuccessfulMessageCount   = message.SuccessCount,
                    UnsuccessfulMessageCount = message.FailedCount,
                    TotalCost = message.Cost,
                    Topic     = message.Topic
                });

                var mailMessage = new MailMessage();
                mailMessage.From         = new MailAddress(mailgunConfiguration.DefaultFrom);
                mailMessage.Body         = body;
                mailMessage.BodyEncoding = Encoding.UTF8;
                mailMessage.IsBodyHtml   = true;
                mailMessage.Subject      = subject;
                foreach (var emailAddress in message.EmailAddresses)
                {
                    mailMessage.To.Add(emailAddress);
                }
                if (emailDefaultNotification != null)
                {
                    emailDefaultNotification.EmailAddresses.ForEach(e => mailMessage.To.Add(e));
                }
                MailActioner.Send(mailgunConfiguration, mailMessage);
            }
        }
        public ActionResult Details(string coordinatorid)
        {
            using (var session = RavenDocStore.GetStore().OpenSession())
            {
                var coordinatorSummary = session.Query <ScheduledMessagesStatusCountInCoordinatorIndex.ReduceResult, ScheduledMessagesStatusCountInCoordinatorIndex>()
                                         .Where(s => s.CoordinatorId == coordinatorid)
                                         .ToList();
                var coordinatorTrackingData = session.Load <CoordinatorTrackingData>(coordinatorid);
                if (coordinatorSummary.Count == 0 || coordinatorTrackingData == null)
                {
                    return(View("DetailsNotCreated", model: coordinatorid));
                }

                DateTime?nextSmsDateUtc = session.Query <ScheduleTrackingData, ScheduleMessagesInCoordinatorIndex>()
                                          .Where(s => s.CoordinatorId == Guid.Parse(coordinatorid) && s.MessageStatus == MessageStatus.Scheduled)
                                          .OrderBy(s => s.ScheduleTimeUtc)
                                          .Select(s => s.ScheduleTimeUtc)
                                          .FirstOrDefault();
                if (nextSmsDateUtc == DateTime.MinValue)
                {
                    nextSmsDateUtc = null;
                }

                DateTime?finalSmsDateUtc = session.Query <ScheduleTrackingData, ScheduleMessagesInCoordinatorIndex>()
                                           .Where(s => s.CoordinatorId == Guid.Parse(coordinatorid) && s.MessageStatus == MessageStatus.Scheduled)
                                           .OrderByDescending(s => s.ScheduleTimeUtc)
                                           .Select(s => s.ScheduleTimeUtc)
                                           .FirstOrDefault();
                if (finalSmsDateUtc == DateTime.MinValue)
                {
                    finalSmsDateUtc = null;
                }

                var overview = new CoordinatorOverview(coordinatorTrackingData, coordinatorSummary);
                overview.NextScheduledMessageDate  = nextSmsDateUtc;
                overview.FinalScheduledMessageDate = finalSmsDateUtc;
                if (HttpContext.Session != null && HttpContext.Session["CoordinatorState_" + coordinatorid] != null && HttpContext.Session["CoordinatorState_" + coordinatorid] is CoordinatorStatusTracking)
                {
                    overview.CurrentStatus = (CoordinatorStatusTracking)HttpContext.Session["CoordinatorState_" + coordinatorid];
                }
                return(View("Details3", overview));
            }
        }
Пример #9
0
        public override object OnGet(Coordinator request)
        {
            using (var session = RavenDocStore.GetStore().OpenSession())
            {
                var trackingData = session.Load <CoordinatorTrackingData>(request.RequestId.ToString());
                var response     = new CoordinatorResponse {
                    RequestId = request.RequestId
                };
                if (trackingData == null)
                {
                    response.ResponseStatus = new ResponseStatus("NotFound");
                    return(response);
                }

                response.Messages          = trackingData.GetListOfCoordinatedSchedules(RavenDocStore.GetStore());
                response.CoordinatorStatus = trackingData.CurrentStatus.ToString();
                return(response);
            }
        }
        public ActionResult Resume(FormCollection collection)
        {
            var coordinatorid      = collection["CoordinatorId"];
            var timeToResume       = DateTime.Now;
            var timeToResumeParsed = DateTime.TryParse(collection["timeToResume"], out timeToResume);
            var userTimeZone       = collection["UserTimeZone"];
            var finishTime         = DateTime.Now;
            var finishTimeParsed   = DateTime.TryParse(collection["finishTime"], out finishTime);

            // validate
            if (!timeToResumeParsed)
            {
                ModelState.AddModelError("timeToResume", "Time to resume must be set");
            }
            if (timeToResume < DateTime.Now.AddMinutes(-5))
            {
                ModelState.AddModelError("timeToResume", "Time to resume must be in the future");
            }
            if (finishTimeParsed && finishTime <= timeToResume)
            {
                ModelState.AddModelError("finishTime", "Finish time must be after time to resume");
            }

            if (!ModelState.IsValid)
            {
                using (var session = RavenDocStore.GetStore().OpenSession())
                {
                    var coordinatorSummary = session.Query <ScheduledMessagesStatusCountInCoordinatorIndex.ReduceResult, ScheduledMessagesStatusCountInCoordinatorIndex>()
                                             .Where(s => s.CoordinatorId == coordinatorid)
                                             .ToList();
                    var coordinatorTrackingData = session.Load <CoordinatorTrackingData>(coordinatorid);
                    if (coordinatorTrackingData == null)
                    {
                        return(View("DetailsNotCreated", model: coordinatorid));
                    }

                    if (HttpContext.Session != null && HttpContext.Session["CoordinatorState_" + coordinatorid] != null && HttpContext.Session["CoordinatorState_" + coordinatorid] is CoordinatorStatusTracking)
                    {
                        coordinatorTrackingData.CurrentStatus = (CoordinatorStatusTracking)HttpContext.Session["CoordinatorState_" + coordinatorid];
                    }
                    ViewData.Add("timeToResume", collection["timeToResume"]);
                    ViewData.Add("finishTime", collection["finishTime"]);
                    var overview = new CoordinatorOverview(coordinatorTrackingData, coordinatorSummary);
                    return(View("Details3", overview));
                }
            }

            var dateTimeToResumeUtc = DateTimeOlsenMapping.DateTimeWithOlsenZoneToUtc(timeToResume, userTimeZone);

            if (finishTimeParsed)
            {
                var dateTimeToFinishUtc = DateTimeOlsenMapping.DateTimeWithOlsenZoneToUtc(finishTime, userTimeZone);
                Bus.Send(new RescheduleTrickledMessages {
                    CoordinatorId = Guid.Parse(coordinatorid), ResumeTimeUtc = dateTimeToResumeUtc, FinishTimeUtc = dateTimeToFinishUtc, MessageRequestTimeUtc = DateTime.UtcNow
                });
            }
            else
            {
                Bus.Send(new ResumeTrickledMessages {
                    CoordinatorId = Guid.Parse(coordinatorid), ResumeTimeUtc = dateTimeToResumeUtc, MessageRequestTimeUtc = DateTime.UtcNow
                });
            }

            HttpContext.Session.Add("CoordinatorState_" + coordinatorid, CoordinatorStatusTracking.Started);
            return(RedirectToAction("Details", new { coordinatorid }));
        }
        public ActionResult Create(CoordinatedSharedMessageModel coordinatedMessages)
        {
            var isValid = TryValidateModel(coordinatedMessages);

            SecondaryValidation(coordinatedMessages);
            if (isValid && ModelState.IsValid)
            {
                CountryCodeReplacement countryCodeReplacement;
                using (var session = RavenDocStore.GetStore().OpenSession("Configuration"))
                {
                    countryCodeReplacement = session.Load <CountryCodeReplacement>("CountryCodeConfig");
                }

                var excludeList = new List <string>();
                using (var session = RavenDocStore.GetStore().OpenSession("SmsTracking"))
                {
                    foreach (var previousCoordinatorId in coordinatedMessages.CoordinatorsToExclude)
                    {
                        var previousCoordinator = session.Load <CoordinatorTrackingData>(previousCoordinatorId.ToString());
                        excludeList.AddRange(previousCoordinator.GetListOfCoordinatedSchedules(RavenDocStore.GetStore()).Select(p => p.Number).ToList());
                    }
                }

                var cleanExcludeList = excludeList.Distinct().ToList();

                var coordinatorId = Guid.NewGuid();
                if (coordinatedMessages.Message.Length > 160)
                {
                    coordinatedMessages.Message = coordinatedMessages.Message.Substring(0, 160);
                }
                var messageTypeRequired = coordinatedMessages.GetMessageTypeFromModel();
                if (messageTypeRequired == typeof(TrickleSmsOverCalculatedIntervalsBetweenSetDates))
                {
                    var trickleSmsOverTimePeriod = Mapper.MapToTrickleOverPeriod(coordinatedMessages, countryCodeReplacement, cleanExcludeList, CurrentUser.Name());
                    trickleSmsOverTimePeriod.CoordinatorId = coordinatorId;
                    Bus.Send(trickleSmsOverTimePeriod);
                }
                else if (messageTypeRequired == typeof(SendAllMessagesAtOnce))
                {
                    var sendAllAtOnce = Mapper.MapToSendAllAtOnce(coordinatedMessages, countryCodeReplacement, cleanExcludeList, CurrentUser.Name());
                    sendAllAtOnce.CoordinatorId = coordinatorId;
                    Bus.Send(sendAllAtOnce);
                }
                else
                {
                    throw new NotImplementedException("This option has been removed");
                }

                return(RedirectToAction("Details", "Coordinator", new { coordinatorId = coordinatorId.ToString() }));
            }

            var selectListItems = new List <SelectListItem>();

            using (var session = RavenDocStore.GetStore().OpenSession("SmsTracking"))
            {
                var last10Coordinators = session.Query <CoordinatorTrackingData>().OrderByDescending(c => c.CreationDateUtc).Take(10).ToList();
                selectListItems = last10Coordinators.Select(c => new SelectListItem {
                    Selected = false, Text = CoordinatorToExcludeText(c), Value = c.CoordinatorId.ToString()
                }).ToList();
                foreach (var previousCoordinatorId in coordinatedMessages.CoordinatorsToExclude)
                {
                    if (last10Coordinators.Any(c => c.CoordinatorId == previousCoordinatorId))
                    {
                        selectListItems.First(s => Guid.Parse(s.Value) == previousCoordinatorId).Selected = true;
                    }
                    else
                    {
                        var coordinatorTrackingData = session.Load <CoordinatorTrackingData>(previousCoordinatorId.ToString());
                        selectListItems.Add(new SelectListItem {
                            Selected = true, Text = coordinatorTrackingData.MetaData.Topic, Value = coordinatorTrackingData.CoordinatorId.ToString()
                        });
                    }
                }
            }
            ViewData.Add("CoordinatorExcludeList", selectListItems);
            return(View("Create", coordinatedMessages));
        }