예제 #1
0
        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();
        }
예제 #2
0
        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);
        }