private WorkItemTransition DoMove(WorkItemTransition transition) { var movedWorkItem = transition.WorkItem.MoveTo(transition.WorkStep, _timeSource.GetTime()); WorkflowRepository.UpdateWorkItem(movedWorkItem); return(new WorkItemTransition(movedWorkItem, transition.WorkStep)); }
private void TryUpdatingExpandLockOnParent(WorkItem item) { var parent = WorkflowRepository.GetWorkItem(item.Parent.Id); if (WorkflowRepository.GetChildWorkItems(item.Parent).All(WorkflowRepository.IsDone)) { parent = parent.UpdateStatus(WorkItemStatus.Normal); } else { parent = parent.UpdateStatus(WorkItemStatus.ExpandLocked); } WorkflowRepository.UpdateWorkItem(parent); }
private void LockAndMoveToParallelRoot(WorkItemTransition transition) { ThrowIfMovingToStepWithWrongClass(transition); var lockedAndMovedItem = transition.WorkItem .MoveTo(transition.WorkStep, _timeSource.GetTime()) .UpdateStatus(WorkItemStatus.ParallelLocked); WorkflowRepository.UpdateWorkItem(lockedAndMovedItem); if (WorkflowRepository.IsInExpandStep(transition.WorkItem)) { CleanUpIfMovingFromExpandStep(transition); } }
private WorkItem MergeParallelWorkItems(WorkItemTransition transition) { var unlockedParentWorkItem = WorkflowRepository.GetWorkItem(transition.WorkItem.Parent.Id).UpdateStatus(WorkItemStatus.Normal); WorkflowRepository.UpdateWorkItem(unlockedParentWorkItem); foreach (var childWorkItem in WorkflowRepository.GetChildWorkItems(transition.WorkItem.Parent).ToList()) { if (WorkflowRepository.IsExpandStep(transition.WorkStep)) { CleanUpIfMovingFromExpandStep(new WorkItemTransition(childWorkItem, transition.WorkStep)); } WorkflowRepository.DeleteWorkItem(childWorkItem.Id); } return(unlockedParentWorkItem); }
private void Create(WorkItem newWorkItem) { var leafStep = WorkflowRepository.GetLeafStep(newWorkItem.Path); if (leafStep.Type != WorkStepType.Begin) { throw new InvalidOperationException("Can only create work items in begin step"); } var classes = WorkflowRepository.GetWorkItemClasses(leafStep); newWorkItem = newWorkItem.MoveTo(leafStep, _timeSource.GetTime()).UpdateClasses(classes); WorkStep transientStep; if (WorkflowRepository.IsWithinTransientStep(leafStep, out transientStep)) { var parentItem = GetTransientParentWorkItem(transientStep); WorkflowRepository.UpdateWorkItem(parentItem.UpdateStatus(WorkItemStatus.ExpandLocked)); newWorkItem = newWorkItem.MoveTo(leafStep, _timeSource.GetTime()).UpdateParent(parentItem, WorkItemParentType.Expanded); foreach (var workItemClass in newWorkItem.Classes) { foreach (var rootClass in WorkItemClass.FindRootClasses(workItemClass)) { newWorkItem = newWorkItem.AddClass(rootClass); } } } else if (WorkflowRepository.IsWithinExpandStep(leafStep)) { throw new InvalidOperationException("Cannot create item directly under expand step"); } if (!newWorkItem.Ordinal.HasValue) { newWorkItem = newWorkItem.UpdateOrdinal(WorkflowRepository.GetNextOrdinal(newWorkItem)); } WorkflowRepository.CreateWorkItem(newWorkItem); }
public void UpdateWorkItem(WorkItem changedWorkItem) { var currentWorkItem = GetWorkItemOrThrow(changedWorkItem.Id); ThrowIfConflictingTimestamp(currentWorkItem, changedWorkItem); currentWorkItem = currentWorkItem.UpdatePropertiesAndOrdinalFrom(changedWorkItem).UpdateTimestamp(TimeSource.GetTime()); var leafStep = WorkflowRepository.GetLeafStep(changedWorkItem.Path); if (changedWorkItem.Path == currentWorkItem.Path || currentWorkItem.Path == leafStep.Path) { WorkflowRepository.UpdateWorkItem(currentWorkItem); } else { var mover = new WorkItemMover(WorkflowRepository, TimeSource); mover.MoveWorkItem(currentWorkItem, leafStep); } }