Esempio n. 1
0
        public ActionResult Details(string coordinatorId)
        {
            using (var session = Raven.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)
                {
                    throw new NotImplementedException("need to have some data...");
                    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("Details", overview));
            }
        }
        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 }));
        }