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)); } }
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")); }
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)); } }
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)); }