예제 #1
0
        /// <summary>
        /// 重写以实现将提取到的模块信息同步到数据库中
        /// </summary>
        /// <param name="provider">局部服务提供者</param>
        /// <param name="moduleInfos">从程序集中提取到的模块信息</param>
        protected virtual void SyncToDatabase(IServiceProvider provider, ModuleInfo[] moduleInfos)
        {
            Check.NotNull(moduleInfos, nameof(moduleInfos));
            if (moduleInfos.Length == 0)
            {
                return;
            }
            IModuleStore <TModule, TModuleInputDto, TModuleKey> moduleStore =
                provider.GetService <IModuleStore <TModule, TModuleInputDto, TModuleKey> >();
            IModuleFunctionStore <TModuleFunction, TModuleKey> moduleFunctionStore =
                provider.GetService <IModuleFunctionStore <TModuleFunction, TModuleKey> >();

            foreach (ModuleInfo info in moduleInfos)
            {
                TModule parent = GetModule(moduleStore, info.Position);
                if (parent == null)
                {
                    throw new OsharpException($"路径为“{info.Position}”的模块信息无法找到");
                }
                OperationResult result;
                TModule         module = moduleStore.Modules.FirstOrDefault(m => m.ParentId.Equals(parent.Id) && m.Code == info.Code);
                if (module == null)
                {
                    TModuleInputDto dto = GetDto(info, parent.Id, null);
                    result = moduleStore.CreateModule(dto).Result;
                    if (result.Errored)
                    {
                        throw new OsharpException(result.Message);
                    }
                    module = moduleStore.Modules.First(m => m.ParentId.Equals(parent.Id) && m.Code == info.Code);
                }
                else
                {
                    TModuleInputDto dto = GetDto(info, parent.Id, module);
                    result = moduleStore.UpdateModule(dto).Result;
                    if (result.Errored)
                    {
                        throw new OsharpException(result.Message);
                    }
                }
                if (info.DependOnFunctions.Length > 0)
                {
                    Guid[] functionIds = info.DependOnFunctions.Select(m => m.Id).ToArray();
                    result = moduleFunctionStore.SetModuleFunctions(module.Id, functionIds).Result;
                    if (result.Errored)
                    {
                        throw new OsharpException(result.Message);
                    }
                }
            }
            IUnitOfWork unitOfWork = provider.GetService <IUnitOfWork>();

            unitOfWork.Commit();
        }
예제 #2
0
        /// <summary>
        /// 重写以实现将提取到的模块信息同步到数据库中
        /// </summary>
        /// <param name="provider">局部服务提供者</param>
        /// <param name="moduleInfos">从程序集中提取到的模块信息</param>
        protected virtual void SyncToDatabase(IServiceProvider provider, ModuleInfo[] moduleInfos)
        {
            Check.NotNull(moduleInfos, nameof(moduleInfos));
            if (moduleInfos.Length == 0)
            {
                return;
            }

            IModuleStore <TModule, TModuleInputDto, TModuleKey> moduleStore =
                provider.GetService <IModuleStore <TModule, TModuleInputDto, TModuleKey> >();

            if (moduleStore == null)
            {
                Logger.LogWarning("初始化模块数据时,IRepository<,>的服务未找到,请初始化 EntityFrameworkCoreModule 模块");
                return;
            }

            IModuleFunctionStore <TModuleFunction, TModuleKey> moduleFunctionStore =
                provider.GetService <IModuleFunctionStore <TModuleFunction, TModuleKey> >();

            if (moduleFunctionStore == null)
            {
                Logger.LogWarning("初始化模块功能数据时,IRepository<,>的服务未找到,请初始化 EntityFrameworkCoreModule 模块");
                return;
            }

            IUnitOfWork unitOfWork = provider.GetUnitOfWork(true);

            if (!moduleInfos.CheckSyncByHash(provider, Logger))
            {
                Logger.LogInformation("同步模块数据时,数据签名与上次相同,取消同步");
                return;
            }

            //删除数据库中多余的模块
            TModule[] modules         = moduleStore.Modules.ToArray();
            var       positionModules = modules.Select(m => new { m.Id, Position = GetModulePosition(modules, m) })
                                        .OrderByDescending(m => m.Position.Length).ToArray();

            string[] deletePositions = positionModules.Select(m => m.Position)
                                       .Except(moduleInfos.Select(n => $"{n.Position}.{n.Code}"))
                                       .Except(new[] { "Root" })
                                       .ToArray();
            TModuleKey[] deleteModuleIds = positionModules.Where(m => deletePositions.Contains(m.Position)).Select(m => m.Id).ToArray();
            foreach (TModuleKey id in deleteModuleIds)
            {
                OperationResult result = moduleStore.DeleteModule(id).GetAwaiter().GetResult();
                if (result.Error)
                {
                    throw new OsharpException(result.Message);
                }
                Logger.LogDebug($"删除模块:{result.Message}");
            }

            //新增或更新传入的模块
            foreach (ModuleInfo info in moduleInfos)
            {
                TModule parent = GetModule(moduleStore, info.Position);
                //插入父级分类
                if (parent == null)
                {
                    int     lastIndex       = info.Position.LastIndexOf('.');
                    string  parent1Position = info.Position.Substring(0, lastIndex);
                    TModule parent1         = GetModule(moduleStore, parent1Position);
                    if (parent1 == null)
                    {
                        throw new OsharpException($"路径为“{parent1Position}”的模块信息无法找到");
                    }
                    string     parentCode = info.Position.Substring(lastIndex + 1, info.Position.Length - lastIndex - 1);
                    ModuleInfo parentInfo = new ModuleInfo()
                    {
                        Code = parentCode, Name = info.PositionName ?? parentCode, Position = parent1Position
                    };
                    TModuleInputDto dto    = GetDto(parentInfo, parent1, null);
                    OperationResult result = moduleStore.CreateModule(dto).GetAwaiter().GetResult();
                    if (result.Error)
                    {
                        throw new OsharpException(result.Message);
                    }
                    parent = moduleStore.Modules.First(m => m.ParentId.Equals(parent1.Id) && m.Code == parentCode);
                }
                TModule module = moduleStore.Modules.FirstOrDefault(m => m.ParentId.Equals(parent.Id) && m.Code == info.Code);
                //新建模块
                if (module == null)
                {
                    TModuleInputDto dto    = GetDto(info, parent, null);
                    OperationResult result = moduleStore.CreateModule(dto).GetAwaiter().GetResult();
                    if (result.Error)
                    {
                        throw new OsharpException(result.Message);
                    }
                    module = moduleStore.Modules.First(m => m.ParentId.Equals(parent.Id) && m.Code == info.Code);
                }
                else //更新模块
                {
                    TModuleInputDto dto    = GetDto(info, parent, module);
                    OperationResult result = moduleStore.UpdateModule(dto).GetAwaiter().GetResult();
                    if (result.Error)
                    {
                        throw new OsharpException(result.Message);
                    }
                }
                if (info.DependOnFunctions.Length > 0)
                {
                    Guid[]          functionIds = info.DependOnFunctions.Select(m => m.Id).ToArray();
                    OperationResult result      = moduleFunctionStore.SetModuleFunctions(module.Id, functionIds).GetAwaiter().GetResult();
                    if (result.Error)
                    {
                        throw new OsharpException(result.Message);
                    }
                }
            }

            unitOfWork.Commit();
        }
예제 #3
0
        public async Task <int> SubmitConfiguration(IOperation operation, ModuleConfigurationSubmitEntity entity)
        {
            var file = await fileStore.Download(operation, entity.FileId);

            if (file == null)
            {
                throw CommonExceptions.FileWasNotFound(operation, entity.FileId);
            }

            var configuration = ModuleConfigurationUtils.Parse(operation, file);

            if (!configuration.IsValid())
            {
                throw CommonExceptions.ModuleConfigurationIsInvalid(operation);
            }

            var module = await moduleStore.GetModuleByAlias(operation, configuration.Alias);

            if (module == null)
            {
                if (entity.ModuleId != null)
                {
                    throw CommonExceptions.FailedToDefineModuleForSubmission(operation);
                }

                if (!await userDataStore.IsUserExist(operation, entity.UserId))
                {
                    throw CommonExceptions.UserWasNotFound(operation, entity.UserId);
                }

                if (!await portalSettingsStore.IsHostExist(operation, entity.HostId))
                {
                    throw CommonExceptions.HostWasNotFound(operation, entity.HostId);
                }

                // Module is new for the system
                var moduleIdForCreate = await moduleStore.CreateModule(operation, entity.UserId, entity.HostId, entity.FileId, configuration);

                await new ProcessDefinition.StartProcessInstanceByKeyRequest(CamundaWorkerKey.ModuleInstallationProcess)
                {
                    BusinessKey = moduleIdForCreate.ToString(),
                    Variables   = new CamundaVariables
                    {
                        { CamundaWorkerKey.ModuleId, moduleIdForCreate },
                        { CamundaWorkerKey.Action, ActionType.NoChanges }
                    }
                }.SendRequest(operation, camundaClient, true);
                return(moduleIdForCreate);
            }

            var operatingSystems = configuration.Instructions.Where(item => item.OperatingSystem.HasValue).Select(item => item.OperatingSystem.Value);

            if (!operatingSystems.Contains(module.HostOperatingSystem))
            {
                // Configuration doesn't have instructions for OS which used on current host
                throw CommonExceptions.FailedToSubmitModuleConfiguration(operation, ModuleConfigurationVerdict.BrokenChanges);
            }

            if (module.Status == ModuleStatus.Run || module.Status == ModuleStatus.Stopped || module.Status == ModuleStatus.FailedToRun || module.Status == ModuleStatus.FailedToStop)
            {
                if (!await userDataStore.IsUserExist(operation, entity.UserId))
                {
                    throw CommonExceptions.UserWasNotFound(operation, entity.UserId);
                }

                // Module in stable mode: run or stopped
                var moduleIdForUpgrade = ValidateToUpgradeModule(operation, entity.ModuleId, module, configuration);

                var fullModule = await moduleStore.GetModule(operation, module.Id);

                var historicalConfiguration = fullModule.Configurations.FirstOrDefault(config => config.Version == configuration.Version);
                if (historicalConfiguration != null)
                {
                    await moduleStore.UpgradeModule(operation, module.Id, entity.UserId, historicalConfiguration.Id);
                }
                else
                {
                    await moduleStore.UpgradeModule(operation, moduleIdForUpgrade, entity.UserId, entity.FileId, configuration);
                }

                await new ProcessDefinition.StartProcessInstanceByKeyRequest(CamundaWorkerKey.ModuleUpgradeProcess)
                {
                    BusinessKey = moduleIdForUpgrade.ToString(),
                    Variables   = new CamundaVariables
                    {
                        { CamundaWorkerKey.ModuleId, moduleIdForUpgrade },
                        { CamundaWorkerKey.ComponentsStopRequired, module.Status == ModuleStatus.Run },
                        { CamundaWorkerKey.Action, ActionType.Upgrade }
                    }
                }.SendRequest(operation, camundaClient, true);
                return(moduleIdForUpgrade);
            }

            throw CommonExceptions.FailedToSubmitModuleConfiguration(operation, ModuleConfigurationVerdict.Updating);
        }
예제 #4
0
        /// <summary>
        /// 重写以实现将提取到的模块信息同步到数据库中
        /// </summary>
        /// <param name="provider">局部服务提供者</param>
        /// <param name="moduleInfos">从程序集中提取到的模块信息</param>
        protected virtual void SyncToDatabase(IServiceProvider provider, ModuleInfo[] moduleInfos)
        {
            Check.NotNull(moduleInfos, nameof(moduleInfos));
            if (moduleInfos.Length == 0)
            {
                return;
            }
            IModuleStore <TModule, TModuleInputDto, TModuleKey> moduleStore =
                provider.GetService <IModuleStore <TModule, TModuleInputDto, TModuleKey> >();
            IModuleFunctionStore <TModuleFunction, TModuleKey> moduleFunctionStore =
                provider.GetService <IModuleFunctionStore <TModuleFunction, TModuleKey> >();

            //删除数据库中多余的模块
            TModule[] modules         = moduleStore.Modules.ToArray();
            var       positionModules = modules.Select(m => new { m.Id, Position = GetModulePosition(modules, m) })
                                        .OrderByDescending(m => m.Position.Length).ToArray();

            string[] deletePositions = positionModules.Select(m => m.Position)
                                       .Except(moduleInfos.Select(n => $"{n.Position}.{n.Code}"))
                                       .Except("Root,Root.Site,Root.Admin,Root.Admin.Identity,Root.Admin.Security,Root.Admin.System".Split(','))
                                       .ToArray();
            TModuleKey[]    deleteModuleIds = positionModules.Where(m => deletePositions.Contains(m.Position)).Select(m => m.Id).ToArray();
            OperationResult result;

            foreach (TModuleKey id in deleteModuleIds)
            {
                result = moduleStore.DeleteModule(id).Result;
                if (result.Errored)
                {
                    throw new OsharpException(result.Message);
                }
            }

            //新增或更新传入的模块
            foreach (ModuleInfo info in moduleInfos)
            {
                TModule parent = GetModule(moduleStore, info.Position);
                if (parent == null)
                {
                    throw new OsharpException($"路径为“{info.Position}”的模块信息无法找到");
                }
                TModule module = moduleStore.Modules.FirstOrDefault(m => m.ParentId.Equals(parent.Id) && m.Code == info.Code);
                if (module == null)
                {
                    TModuleInputDto dto = GetDto(info, parent, null);
                    result = moduleStore.CreateModule(dto).Result;
                    if (result.Errored)
                    {
                        throw new OsharpException(result.Message);
                    }
                    module = moduleStore.Modules.First(m => m.ParentId.Equals(parent.Id) && m.Code == info.Code);
                }
                else
                {
                    TModuleInputDto dto = GetDto(info, parent, module);
                    result = moduleStore.UpdateModule(dto).Result;
                    if (result.Errored)
                    {
                        throw new OsharpException(result.Message);
                    }
                }
                if (info.DependOnFunctions.Length > 0)
                {
                    Guid[] functionIds = info.DependOnFunctions.Select(m => m.Id).ToArray();
                    result = moduleFunctionStore.SetModuleFunctions(module.Id, functionIds).Result;
                    if (result.Errored)
                    {
                        throw new OsharpException(result.Message);
                    }
                }
            }
            IUnitOfWork unitOfWork = provider.GetService <IUnitOfWork>();

            unitOfWork.Commit();
        }