private void CheckCorrectOverloadForViewModel <T, C>(IStateChange <T, C> change) where T : class, IStateChangeEntityBase <C> where C : Enum { if (change.GetType().BaseType.GenericTypeArguments.Length == 3) { throw new Exception($"Wront overload method! Change has a third ViewModel generic type! Use the other overload method of {nameof(BasicWorkFlowManage)} " + $"or remove the view model from the generic type arguments of change basetype"); } }
private void CheckCorrectOverloadForTasks <T, C>(IStateChange <T, C> change) where T : class, IStateChangeEntityBase <C> where C : Enum { var implementedInterfaces = change.GetType().GetInterfaces().Select(x => x.Name); if (implementedInterfaces.Any(x => x.IndexOf("IProducesTask") == 0)) { throw new Exception($"Change implements {nameof(IProducesTask<TaskEntity>)} interface! Use the other overload method of {nameof(BasicWorkFlowManage)} " + $"or remove interface from change!"); } if (implementedInterfaces.Any(x => x.IndexOf("IHasTaskPrerequity") == 0)) { throw new Exception($"Change implements {nameof(IHasTaskPrerequity)} interface! Use the other overload method of {nameof(BasicWorkFlowManage)} " + $"or remove interface from change!"); } }
private void BasicWorkFlowManage <T, C>(IStateChange <T, C> change, C newState) where T : class, IStateChangeEntityBase <C> where C : Enum { void HasSufficentPermission() { var changeConfiguration = change.GetConfiguration(); if (changeConfiguration != null && changeConfiguration.HasPermissionToFullfillChange != null && changeConfiguration.HasPermissionToFullfillChange.Length > 0) { if (changeConfiguration.HasPermissionToFullfillChange.Any(x => CurrentUserGoups.Contains(x.Id))) { return; } else { throw new StateTransitionException($"User has no permission to perform this transition. Change type: {change.GetType().Name}"); } } else { throw new Exception($"Invalid {nameof(StateChangeConfiguration)}. Override {nameof(change.GetConfiguration)} properly!"); } } void StateTransitionValid() { var changeConfiguration = change.GetConfiguration(); if (changeConfiguration == null) { throw new Exception($"Invalid {nameof(StateChangeConfiguration)} object!"); } if (changeConfiguration.AllowedStartStates != null && changeConfiguration.AllowedStartStates.Length > 0) { if (!changeConfiguration.AllowedStartStates.Contains(change.Entity.CurrentState)) { throw new StateTransitionException($"Tried transition from {change.Entity.CurrentState} to {newState}, which is disallowed! " + $"(possible state change outside of {nameof(StateManagger)}"); } } if (changeConfiguration.AllowedEndStates != null && changeConfiguration.AllowedEndStates.Length > 0) { if (!changeConfiguration.AllowedEndStates.Contains(newState)) { throw new StateTransitionException($"Tried transition to '{newState}', which is disallowed end state!"); } } } void TestChangeRule() { change.IsValid(); } HasSufficentPermission(); StateTransitionValid(); TestChangeRule(); }
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); }