/// <summary> /// !!! Calls SaveChanges on <see cref="IRLSRepository{Entity, ACLEntity}"/> /// </summary> /// <typeparam name="T">Entity</typeparam> /// <typeparam name="C">State</typeparam> /// <typeparam name="K">Task entity</typeparam> /// <param name="change"></param> public K[] ManageTransition <T, C, K, AclEntity>(IStateChange <T, C> change, C newState, IRLSRepository <K, AclEntity> RlsRepository) where T : class, IStateChangeEntityBase <C> where C : Enum where K : TaskEntity, new() where AclEntity : class, IACLEntity, new() { CheckCorrectOverloadForViewModel(change); BasicWorkFlowManage(change, newState); change.IsValid(); change.StateAction(); var tasks = TaskCreationManage <T, C, K, AclEntity>(change, RlsRepository); ChangeStatus(change, newState); return(tasks); }
public K[] ManageTransition <T, C, K, L, AclEntity>(IStateChange <T, C, L> change, C newState, L model, IRLSRepository <K, AclEntity> RlsRepository) where T : class, IStateChangeEntityBase <C> where C : Enum where K : TaskEntity, new() where L : class where AclEntity : class, IACLEntity, new() { BasicWorkFlowManage(change, newState); change.IsValid(model); change.StateAction(model); var tasks = TaskCreationManage <T, C, K, AclEntity>(change, RlsRepository); ChangeStatus(change, newState); return(tasks); }
private K[] TaskCreationManage <T, C, K, AclEntity>(IStateChange <T, C> change, IRLSRepository <K, AclEntity> RlsRepository) where T : class, IStateChangeEntityBase <C> where C : Enum where K : TaskEntity, new() where AclEntity : class, IACLEntity, new() { K[] CreateTasksIfNeeded() { if (change is IProducesTask <K> taskChange) { var config = change.GetConfiguration(); var tasksAdded = new List <K>(); var acls = new List <AclEntity>(); var secObjectsToAssignTasksTo = taskChange.AssignTaskToSecurityObjects(); if (config.TaskAssignType == TaskAssignType.Default) { throw new Exception($"{nameof(config.TaskAssignType)} is default! Please set up the setting correctly!"); } if (config.TaskAssignType != TaskAssignType.Default) { if (config.TaskAssignType == TaskAssignType.AssignMany) { foreach (var securityObject in secObjectsToAssignTasksTo) { var task = new K { EntityId = change.Entity.Id, Status = TaskStatus.Pending, UniqueID = change.GetType().FullName }; tasksAdded.Add(task); } } else { var task = new K { EntityId = change.Entity.Id, Status = TaskStatus.Pending, UniqueID = change.GetType().FullName }; tasksAdded.Add(task); } } foreach (var task in tasksAdded) { RlsRepository.Add(task); } // Must call this, to let the tasks have a generated id RlsRepository.SaveChanges(); foreach (var task in tasksAdded) { if (config.TaskAssignType == TaskAssignType.AssignMany) { foreach (var user in secObjectsToAssignTasksTo) { acls.Add(new AclEntity { EntityID = task.Id, Permission = PermissionEnum.Full, SecurityObjectID = user }); } } else { acls.Add(new AclEntity { EntityID = task.Id, Permission = PermissionEnum.Full, SecurityObjectID = secObjectsToAssignTasksTo.First() }); } } RlsRepository.AddAcls(acls.ToArray()); RlsRepository.SaveChanges(); return(tasksAdded.ToArray()); } return(null); } void CheckForTasksIfNeeded() { if (change is IHasTaskPrerequity changeHasTasks) { var tasksToCheck = changeHasTasks.getCreatedTask(); if (tasksToCheck.Any(x => x.Status == TaskStatus.Pending)) { throw new StateTransitionException($"Can't performe state transition because there are tasks to be finished! " + $"{string.Join(", ", tasksToCheck.Where(x => x.Status == TaskStatus.Pending).Select(x => x.Id))}"); } } } void CallAlterTasks(K[] tasks2) { if (change is IValidateTasks <K> validateTask && (tasks2 != null)) { foreach (var task in tasks2) { validateTask.AlterTasks(task); } } } var tasks = CreateTasksIfNeeded(); CheckForTasksIfNeeded(); CallAlterTasks(tasks); return(tasks); }