Exemple #1
0
        /// <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);
        }
Exemple #2
0
        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);
        }
Exemple #3
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);
        }