private void ProcessInferenceForUser(IUser user, IDocumentStore store, IInferenceType inferenceType) { using (var session = store.OpenSession()) { //check if this inference has already been made (e.g. last time the procesor ran) //if it has move on if (session.Query<Inference>() .Any(inf => inf.InferenceTypeName == inferenceType.Name && inf.MadeAt >= inferenceType.CheckTime && inf.UserId == user.Id)) return; //check if this inference type has been triggered if (!inferenceType.HasTriggered(user, session)) return; //if it has create and store a new inference _log.Info(string.Format("Found an inference of type {0} for {1}",inferenceType.Name,user.Name)); var newInference = new Inference { Id = IlluminateDatabase.GenerateId<Inference>(), InferenceTypeName = inferenceType.Name, MadeAt = DateTime.Now, UserId = user.Id }; session.Store(newInference); session.SaveChanges(); //now invoke each associated action for the new inference foreach (var action in inferenceType.Actions) { _log.Info(string.Format("Invoking action {0} for {1} inference",action.GetType(),inferenceType.Name)); action.Invoke(user, inferenceType, session); } } }
public void Invoke(IUser user,IInferenceType inferenceType,IDocumentSession session) { //create a new notification and save it var notification = new Notification { About = user.ToSimpleUser(), Id = IlluminateDatabase.GenerateId<Notification>(), SendDate = DateTime.Now, From = EmailRecipient.GetIlluminateRecipient(), Title = "Illuminate Inference", Body = inferenceType.GetDescription(user), NotificationRecipients = new NotificationRecipient[] { new NotificationRecipient { NotificationDeliveryTypes = NotificationDeliveryTypes .Toast | NotificationDeliveryTypes .Email, Users = user.Relationships .Where( r => r.RelationshipName == Role.BuiltInRole .LineManager .ToString()) } } }; session.Store(notification); session.SaveChanges(); }
public ScheduleRegistry() { XmlConfigurator.Configure(); //configure logging _logger = LogManager.GetLogger(typeof(ScheduleRegistry)); var numSecondsBackoff = 3600; var numSecondsBackoffStr = ConfigurationManager.AppSettings["UNSENT_NOTIFICATION_BACKOFF_SECONDS"]; if (!string.IsNullOrEmpty(numSecondsBackoffStr)) numSecondsBackoff = int.Parse(numSecondsBackoffStr); Initialise(); //Run notification processor every 30 seconds var mailgunSender = new MailGunEmailSender(); Schedule(() => new NotificationProcessor( new EmailNotificationDispatcher(_logger, mailgunSender), new ToastDispatcher(_database.MasterStore, _logger), _database.GetAllOrgStores(), new SmsDispatcher(_logger, new TxtLocalSmsSender()), _logger, numSecondsBackoff ) .Process()) .ToRunNow().AndEvery(30).Seconds(); Schedule(() => new TrialProcessor(_database,_logger) .Process()) .ToRunNow().AndEvery(2).Minutes(); //inference engine schedule var inferenceTypes= new IInferenceType[] { new PoorHigInferenceType(new InferenceTypeConfig{CheckForOtherInferencesPeriodDays = 10,NumberInPeriod = 3,PeriodDays = 10}) { Actions = new IInferenceAction[] { new NotifyManagerAction() }}, new ManyConcernsInferenceType(new InferenceTypeConfig{CheckForOtherInferencesPeriodDays = 10,NumberInPeriod = 2,PeriodDays = 10}) { Actions = new IInferenceAction[] { new NotifyManagerAction() }}, new PraiseInferenceType(new InferenceTypeConfig{CheckForOtherInferencesPeriodDays = 10,NumberInPeriod = 3,PeriodDays = 10}) { Actions = new IInferenceAction[] { new NotifyManagerAction() }}, new NoPraiseInferenceType(new InferenceTypeConfig{CheckForOtherInferencesPeriodDays = 180,NumberInPeriod = 0,PeriodDays = 180}) { Actions = new IInferenceAction[] { new NotifyManagerAction() }}, new RepeatedSicknessReasonInferenceType(new InferenceTypeConfig{CheckForOtherInferencesPeriodDays = 365,NumberInPeriod = 2,PeriodDays = 365}) { Actions = new IInferenceAction[] { new NotifyManagerAction() }}, }; Schedule(() => new InferenceProcessor( _database.GetAllOrgStores(), inferenceTypes, _logger) .Process()) .ToRunNow().AndEvery(10).Minutes(); //Run daily email task at 3am Schedule(() => new Tasks.EmailDailyTasks().DoWork(_database, mailgunSender)).ToRunEvery(1).Days().At(3, 0); //Run Open task updates at 6am? Schedule(() => new Tasks.ConsolidateEndDates().DoWork(_database)).ToRunEvery(1).Days().At(6, 0); //one off update of ALL tasks etc. Schedule(() => new Tasks.ConsolidateEndDates(true).DoWork(_database)).ToRunNow(); //Update Assignees occsionally. !. Schedule(() => new Tasks.RefreshAssignees().DoWork(_database)).ToRunNow().AndEvery(1).Hours(); //Update Users occsionally. !. Schedule(() => new Tasks.RefreshUserState().DoWork(_database)) .ToRunNow().AndEvery(4).Hours(); Schedule(()=>new Tasks.UpdateGraphite().DoWork(_database)) .ToRunNow().AndEvery(1).Minutes(); }