/// <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(); }
/// <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(); }
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); }
/// <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(); }