public void Deserialise() { //ARRANGE var obj = new SerialiseTest { IntProperty = 1, StringProperty = "Two", ListProperty = new List<string> {"Three", "Four"} }; var action = new WorkflowHandlerAction { Action = "Test", NewObject = JsonConvert.SerializeObject(obj), ObjectType = "SerialiseTest" }; //ACT var result = action.DeserialiseObject<SerialiseTest>(); //ASSERT //are they equivalent? Assert.AreEqual(obj.IntProperty, result.IntProperty); Assert.AreEqual(obj.StringProperty, result.StringProperty); Assert.AreEqual(obj.ListProperty.Count, result.ListProperty.Count); Assert.AreEqual(obj.ListProperty[0], result.ListProperty[0]); }
/// <summary> /// perform an action on the leave process /// </summary> /// <param name="documentStore">The RavenDB document store to be used</param> /// <param name="triggerprocess">The initiator process - e.g. leave or sickness</param> /// <param name="action">The action to be performed</param> public override void PerformAction(IDocumentStore documentStore, WorkflowInitiator triggerprocess, WorkflowHandlerAction action) { //we know its a Leave so cast it to the correct type var leave = (Leave) triggerprocess; switch (action.Action) //depending on the type of action do different things { case WorkflowHandlerAction.Actions.AddTask: //add a task //what am I creating? var actionmodel = action.DeserialiseObject<CreateProcessTaskActionModel>(); //need to convert the actionmodel into an event. var newtask = new Task { Id = IlluminateDatabase.GenerateId<Task>(), Type = new TaskType {Name = actionmodel.TaskName}, AssignedRoles = (from role in actionmodel.AssignedRoles select Role.GetRole(role)).ToList(), DueDate = actionmodel.DueDate, ConsolidatedCompletionDate = actionmodel.DueDate, CreatedBy = leave.UserCreatedProcess, Title = actionmodel.Title, Description = actionmodel.Description, ParentItemId = leave.Id }; using (var session = documentStore.OpenSession()) { session.Store(newtask); newtask.UpdateAssignees(session, leave.Subject.UserId); session.SaveChanges(); } break; case WorkflowHandlerAction.Actions.AddMeeting: //add a meeting var meetingactionmodel = action.DeserialiseObject<CreateProcessMeetingActionModel>(); //need to convert the actionmodel into an event. but problem is looking up user? var newMeeting = new Meeting { Id = IlluminateDatabase.GenerateId<Meeting>(), Type = new TaskType {Name = meetingactionmodel.TaskName}, AssignedRoles = (from role in meetingactionmodel.AssignedRoles select Role.GetRole(role)).ToList(), Invitees = new List<Invitee> {Invitee.FromSimpleUser(leave.Subject)}, DueDate = meetingactionmodel.DueDate, ConsolidatedCompletionDate = meetingactionmodel.DueDate, CreatedBy = leave.UserCreatedProcess, Title = meetingactionmodel.Title, Description = meetingactionmodel.Description, ParentItemId = leave.Id, DurationMinutes = 30 }; //now save the new mmeeting using (var session = documentStore.OpenSession()) { session.Store(newMeeting); newMeeting.UpdateAssignees(session, leave.Subject.UserId); session.SaveChanges(); } break; case WorkflowHandlerAction.Actions.DeleteTask: //delete scheduled a task using (var session = documentStore.OpenSession()) { var task = session.Load<Task>(action.Value); session.Delete(task); session.SaveChanges(); } break; case WorkflowHandlerAction.Actions.DeleteMeeting: //delete a scheduled meeting using (var session = documentStore.OpenSession()) { var meeting = session.Load<Meeting>(action.Value); session.Delete(meeting); session.SaveChanges(); } break; } }
/// <summary> /// Perform an action on the default sickness workflow /// </summary> /// <param name="documentStore">The document store to use</param> /// <param name="triggerprocess">The workflow initiator that triggered this</param> /// <param name="action">The action to be performed</param> public override void PerformAction(IDocumentStore documentStore, WorkflowInitiator triggerprocess, WorkflowHandlerAction action) { var sickness = (Sickness) triggerprocess; //we know its a sickness so cast to it switch (action.Action) //depending on the action type act accordingly { case WorkflowHandlerAction.Actions.AddTask: //what am I creating? - deserialise the contents of the action var actionModel = action.DeserialiseObject<CreateProcessTaskActionModel>(); //need to convert the actionmodel into an event - in this case a task var newtask = new Task { Id = IlluminateDatabase.GenerateId<Task>(), Type = new TaskType {Name = actionModel.TaskName}, AssignedRoles = (from role in actionModel.AssignedRoles select Role.GetRole(role)).ToList(), DueDate = actionModel.DueDate, ConsolidatedCompletionDate = actionModel.DueDate>=DateTime.Now ? actionModel.DueDate : DateTime.Now, CreatedBy = sickness.UserCreatedProcess, Title =string.Format( actionModel.Title,sickness.Subject.FullName), Description = string.Format( actionModel.Description,sickness.Subject.FullName), ParentItemId = sickness.Id }; //store the task in the db using (var session = documentStore.OpenSession()) { session.Store(newtask); newtask.UpdateAssignees(session, sickness.Subject.UserId); session.SaveChanges(); } break; case WorkflowHandlerAction.Actions.AddMeeting: var meetingactionmodel = action.DeserialiseObject<CreateProcessMeetingActionModel>(); //need to convert the actionmodel into an event. but problem is looking up user? var newmeeting = new Meeting { Id = IlluminateDatabase.GenerateId<Meeting>(), Type = new TaskType { Name = meetingactionmodel.TaskName }, AssignedRoles = (from role in meetingactionmodel.AssignedRoles select Role.GetRole(role)).ToList(), Invitees = new List<Invitee> { Invitee.FromSimpleUser(sickness.Subject)}, DueDate = meetingactionmodel.DueDate, ConsolidatedCompletionDate = meetingactionmodel.DueDate >= DateTime.Now ? meetingactionmodel.DueDate : DateTime.Now, CreatedBy = sickness.UserCreatedProcess, Title = meetingactionmodel.Title, Description = meetingactionmodel.Description, ParentItemId = sickness.Id }; //save the meeting in the DB using (var session = documentStore.OpenSession()) { session.Store(newmeeting); newmeeting.UpdateAssignees(session, sickness.Subject.UserId); session.SaveChanges(); } break; case WorkflowHandlerAction.Actions.DeleteTask: //delete the task from the DB using (var session = documentStore.OpenSession()) { var task = session.Load<Task>(action.Value); session.Delete(task); session.SaveChanges(); } break; case WorkflowHandlerAction.Actions.DeleteMeeting: //delete the meeting from the DB using (var session = documentStore.OpenSession()) { var meeting = session.Load<Meeting>(action.Value); session.Delete(meeting); session.SaveChanges(); } break; case WorkflowHandlerAction.Actions.NotifyActorsOfCreation: using (var session = documentStore.OpenSession()) { var managerCreatedSickness=sickness.UserCreatedProcess.UserId==sickness.CurrentProcessOwner.UserId; //if the manager created the sickness notify the employee Notification notification; if (managerCreatedSickness) { notification = new Notification { NotificationRecipients = new[] { new NotificationRecipient { NotificationDeliveryTypes = NotificationDeliveryTypes .Email | NotificationDeliveryTypes .Toast, Users = new[] { sickness .Subject } } }, Body = string.Format( "You have been registered as off sick for {0} by {1}", sickness.SicknessReason.Name, sickness.CurrentProcessOwner.FullName) }; } else { notification = new Notification { NotificationRecipients = new[] { new NotificationRecipient { NotificationDeliveryTypes = NotificationDeliveryTypes .Email | NotificationDeliveryTypes .Toast| NotificationDeliveryTypes.Sms, Users = new[] { sickness.CurrentProcessOwner } } }, Body = string.Format( "{0} has registered themselves as off sick for {1}.", sickness.Subject.FullName, sickness.SicknessReason.Name) }; } notification.Title = string.Format("Sickness for {0}", sickness.Subject.FullName); notification.About = sickness.Subject; notification.Id = IlluminateDatabase.GenerateId<Notification>(); notification.SendDate = DateTime.Now; session.Store(notification); session.SaveChanges(); } break; } }