Browse Source

Merge pull request #1565 from colinin/optimize-definition-manager

Optimize definition manager
pull/1467/merge
yx lin 1 month ago
committed by GitHub
parent
commit
35884da934
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 5
      apps/vben5/packages/@abp/ai-management/src/components/tools/AIToolDefinitionModal.vue
  2. 1
      apps/vben5/packages/@abp/ai-management/src/components/tools/AIToolDefinitionTable.vue
  3. 4
      apps/vben5/packages/@abp/ai-management/src/components/workspaces/WorkspaceDefinitionModal.vue
  4. 46
      apps/vben5/packages/@abp/ai-management/src/components/workspaces/WorkspaceDefinitionTable.vue
  5. 71
      apps/vben5/packages/@abp/ai-management/src/components/workspaces/WorkspaceResetApiKeyModal.vue
  6. 1
      apps/vben5/packages/@abp/ai-management/src/types/tools.ts
  7. 1
      apps/vben5/packages/@abp/ai-management/src/types/workspaces.ts
  8. 5
      apps/vben5/packages/@abp/components/src/vditor/Viewer.vue
  9. 13
      apps/vben5/packages/@abp/features/src/components/definitions/features/FeatureDefinitionTable.vue
  10. 16
      apps/vben5/packages/@abp/features/src/components/definitions/groups/FeatureGroupDefinitionTable.vue
  11. 91
      apps/vben5/packages/@abp/permissions/src/components/definitions/groups/PermissionGroupDefinitionTable.vue
  12. 16
      apps/vben5/packages/@abp/permissions/src/components/definitions/permissions/PermissionDefinitionModal.vue
  13. 63
      apps/vben5/packages/@abp/permissions/src/components/definitions/permissions/PermissionDefinitionTable.vue
  14. 49
      apps/vben5/packages/@abp/settings/src/components/definitions/SettingDefinitionTable.vue
  15. 4
      apps/vben5/packages/@abp/text-templating/src/components/definitions/TemplateContentModal.vue
  16. 6
      apps/vben5/packages/@abp/text-templating/src/components/definitions/TemplateDefinitionModal.vue
  17. 10
      apps/vben5/packages/@abp/text-templating/src/components/definitions/TemplateDefinitionTable.vue
  18. 2
      apps/vben5/packages/@abp/ui/src/components/properties/PropertyTable.vue
  19. 4
      aspnet-core/LINGYUN.MicroService.All.slnx
  20. 4
      aspnet-core/LINGYUN.MicroService.Aspire.slnx
  21. 4
      aspnet-core/LINGYUN.MicroService.SingleProject.slnx
  22. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/AIServiceModule.cs
  23. 1
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/LINGYUN.Abp.MicroService.AIService.csproj
  24. 277
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/Overrides/MergeFeatureDefinitionManager.cs
  25. 276
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/Overrides/MergePermissionDefinitionManager.cs
  26. 86
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/Overrides/MergeSettingDefinitionManager.cs
  27. 104
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/Overrides/MergeTemplateDefinitionManager.cs
  28. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/AdminServiceModule.cs
  29. 1
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/LINGYUN.Abp.MicroService.AdminService.csproj
  30. 277
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/Overrides/MergeFeatureDefinitionManager.cs
  31. 276
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/Overrides/MergePermissionDefinitionManager.cs
  32. 86
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/Overrides/MergeSettingDefinitionManager.cs
  33. 104
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/Overrides/MergeTemplateDefinitionManager.cs
  34. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/AuthServerModule.cs
  35. 1
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/LINGYUN.Abp.MicroService.AuthServer.csproj
  36. 277
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/Overrides/MergeFeatureDefinitionManager.cs
  37. 276
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/Overrides/MergePermissionDefinitionManager.cs
  38. 86
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/Overrides/MergeSettingDefinitionManager.cs
  39. 104
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/Overrides/MergeTemplateDefinitionManager.cs
  40. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/IdentityServiceModule.cs
  41. 1
      aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/LINGYUN.Abp.MicroService.IdentityService.csproj
  42. 277
      aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/Overrides/MergeFeatureDefinitionManager.cs
  43. 276
      aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/Overrides/MergePermissionDefinitionManager.cs
  44. 86
      aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/Overrides/MergeSettingDefinitionManager.cs
  45. 104
      aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/Overrides/MergeTemplateDefinitionManager.cs
  46. 1
      aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/LINGYUN.Abp.MicroService.LocalizationService.csproj
  47. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/LocalizationServiceModule.cs
  48. 277
      aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/Overrides/MergeFeatureDefinitionManager.cs
  49. 276
      aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/Overrides/MergePermissionDefinitionManager.cs
  50. 86
      aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/Overrides/MergeSettingDefinitionManager.cs
  51. 104
      aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/Overrides/MergeTemplateDefinitionManager.cs
  52. 1
      aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/LINGYUN.Abp.MicroService.MessageService.csproj
  53. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/MessageServiceModule.cs
  54. 277
      aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/Overrides/MergeFeatureDefinitionManager.cs
  55. 276
      aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/Overrides/MergePermissionDefinitionManager.cs
  56. 86
      aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/Overrides/MergeSettingDefinitionManager.cs
  57. 104
      aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/Overrides/MergeTemplateDefinitionManager.cs
  58. 1
      aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/LINGYUN.Abp.MicroService.PlatformService.csproj
  59. 277
      aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/Overrides/MergeFeatureDefinitionManager.cs
  60. 276
      aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/Overrides/MergePermissionDefinitionManager.cs
  61. 86
      aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/Overrides/MergeSettingDefinitionManager.cs
  62. 104
      aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/Overrides/MergeTemplateDefinitionManager.cs
  63. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/PlatformServiceModule.cs
  64. 1
      aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/LINGYUN.Abp.MicroService.TaskService.csproj
  65. 277
      aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/Overrides/MergeFeatureDefinitionManager.cs
  66. 276
      aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/Overrides/MergePermissionDefinitionManager.cs
  67. 86
      aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/Overrides/MergeSettingDefinitionManager.cs
  68. 104
      aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/Overrides/MergeTemplateDefinitionManager.cs
  69. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/TaskServiceModule.cs
  70. 1
      aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/LINGYUN.Abp.MicroService.WeChatService.csproj
  71. 277
      aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/Overrides/MergeFeatureDefinitionManager.cs
  72. 276
      aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/Overrides/MergePermissionDefinitionManager.cs
  73. 86
      aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/Overrides/MergeSettingDefinitionManager.cs
  74. 104
      aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/Overrides/MergeTemplateDefinitionManager.cs
  75. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/WeChatServiceModule.cs
  76. 1
      aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/LINGYUN.Abp.MicroService.WebhookService.csproj
  77. 277
      aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/Overrides/MergeFeatureDefinitionManager.cs
  78. 276
      aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/Overrides/MergePermissionDefinitionManager.cs
  79. 86
      aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/Overrides/MergeSettingDefinitionManager.cs
  80. 104
      aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/Overrides/MergeTemplateDefinitionManager.cs
  81. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/WebhookServiceModule.cs
  82. 1
      aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/LINGYUN.Abp.MicroService.WorkflowService.csproj
  83. 277
      aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/Overrides/MergeFeatureDefinitionManager.cs
  84. 276
      aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/Overrides/MergePermissionDefinitionManager.cs
  85. 86
      aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/Overrides/MergeSettingDefinitionManager.cs
  86. 104
      aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/Overrides/MergeTemplateDefinitionManager.cs
  87. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/WorkflowServiceModule.cs
  88. 3
      aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/FodyWeavers.xml
  89. 30
      aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/FodyWeavers.xsd
  90. 20
      aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN.Abp.Dynamic.Definitions.Core.csproj
  91. 8
      aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN/Abp/Dynamic/Definitions/AbpDynamicDefinitionsCoreModule.cs
  92. 35
      aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN/Abp/Dynamic/Definitions/AbpDynamicDefinitionsOptions.cs
  93. 240
      aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN/Abp/Dynamic/Definitions/DynamicDefinitionManager.cs
  94. 8
      aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN/Abp/Dynamic/Definitions/DynamicDefinitionStrategy.cs
  95. 3
      aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/FodyWeavers.xml
  96. 30
      aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/FodyWeavers.xsd
  97. 27
      aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN.Abp.Dynamic.Definitions.csproj
  98. 32
      aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN/Abp/Dynamic/Definitions/AbpDynamicDefinitionsModule.cs
  99. 253
      aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN/Abp/Dynamic/Definitions/FeatureDynamicDefinitionManager.cs
  100. 249
      aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN/Abp/Dynamic/Definitions/PermissionDynamicDefinitionManager.cs

5
apps/vben5/packages/@abp/ai-management/src/components/tools/AIToolDefinitionModal.vue

@ -52,6 +52,7 @@ const defaultModel: AIToolDefinitionVto = {
name: '', name: '',
isEnabled: true, isEnabled: true,
isGlobal: false, isGlobal: false,
isStatic: false,
isSystem: false, isSystem: false,
provider: '', provider: '',
extraProperties: {}, extraProperties: {},
@ -80,7 +81,7 @@ const getAIToolOptions = computed<NonNullable<SelectProps['options']>>(() => {
// 表单允许编辑 // 表单允许编辑
const getIsAllowUpdate = computed<boolean>(() => { const getIsAllowUpdate = computed<boolean>(() => {
if (formModel.value.id) { if (formModel.value.id) {
if (formModel.value.isSystem) { if (formModel.value.isSystem || formModel.value.isStatic) {
return false; return false;
} }
return isGranted(AIToolDefinitionPermissions.Update); return isGranted(AIToolDefinitionPermissions.Update);
@ -140,6 +141,7 @@ async function onInit() {
modalApi.setState({ modalApi.setState({
loading: true, loading: true,
title: $t('AIManagement.Tools:New'), title: $t('AIManagement.Tools:New'),
showConfirmButton: true,
}); });
await onInitProviderOptions(); await onInitProviderOptions();
const { id } = modalApi.getData<AIToolDefinitionVto>(); const { id } = modalApi.getData<AIToolDefinitionVto>();
@ -154,6 +156,7 @@ async function onInit() {
(p) => p.name === dto.provider, (p) => p.name === dto.provider,
); );
modalApi.setState({ modalApi.setState({
showConfirmButton: !dto.isSystem && !dto.isStatic,
title: $t('AIManagement.Tools:Edit'), title: $t('AIManagement.Tools:Edit'),
}); });
} finally { } finally {

1
apps/vben5/packages/@abp/ai-management/src/components/tools/AIToolDefinitionTable.vue

@ -220,6 +220,7 @@ async function onDelete(row: AIToolDefinitionRecordDto) {
</Button> </Button>
<Button <Button
v-access:code="[AIToolDefinitionPermissions.Delete]" v-access:code="[AIToolDefinitionPermissions.Delete]"
:disabled="row.isStatic"
:icon="h(DeleteOutlined)" :icon="h(DeleteOutlined)"
block block
danger danger

4
apps/vben5/packages/@abp/ai-management/src/components/workspaces/WorkspaceDefinitionModal.vue

@ -51,6 +51,7 @@ const defaultModel: WorkspaceDefinitionVto = {
id: '', id: '',
name: '', name: '',
isEnabled: true, isEnabled: true,
isStatic: true,
displayName: '', displayName: '',
provider: '', provider: '',
modelName: '', modelName: '',
@ -109,7 +110,8 @@ async function onInit() {
modalApi.setState({ modalApi.setState({
title: $t('AIManagement.Workspaces:Edit'), title: $t('AIManagement.Workspaces:Edit'),
}); });
isAllowUpdate.value = isGranted(WorkspaceDefinitionPermissions.Update); isAllowUpdate.value =
!dto.isStatic && isGranted(WorkspaceDefinitionPermissions.Update);
} finally { } finally {
modalApi.setState({ modalApi.setState({
loading: false, loading: false,

46
apps/vben5/packages/@abp/ai-management/src/components/workspaces/WorkspaceDefinitionTable.vue

@ -1,5 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import type { VxeGridProps } from '@abp/ui'; import type { VxeGridProps } from '@abp/ui';
import type { MenuInfo } from 'ant-design-vue/es/menu/src/interface';
import type { VbenFormProps } from '@vben/common-ui'; import type { VbenFormProps } from '@vben/common-ui';
@ -7,6 +8,7 @@ import type { WorkspaceDefinitionRecordDto } from '../../types/workspaces';
import { defineAsyncComponent, h } from 'vue'; import { defineAsyncComponent, h } from 'vue';
import { useAccess } from '@vben/access';
import { useVbenModal } from '@vben/common-ui'; import { useVbenModal } from '@vben/common-ui';
import { $t } from '@vben/locales'; import { $t } from '@vben/locales';
@ -17,9 +19,11 @@ import {
CloseOutlined, CloseOutlined,
DeleteOutlined, DeleteOutlined,
EditOutlined, EditOutlined,
EllipsisOutlined,
PlusOutlined, PlusOutlined,
RedoOutlined,
} from '@ant-design/icons-vue'; } from '@ant-design/icons-vue';
import { Button, message, Modal } from 'ant-design-vue'; import { Button, Dropdown, Menu, message, Modal } from 'ant-design-vue';
import { useWorkspaceDefinitionsApi } from '../../api/useWorkspaceDefinitionsApi'; import { useWorkspaceDefinitionsApi } from '../../api/useWorkspaceDefinitionsApi';
import { WorkspaceDefinitionPermissions } from '../../constants/permissions'; import { WorkspaceDefinitionPermissions } from '../../constants/permissions';
@ -27,7 +31,11 @@ import { WorkspaceDefinitionPermissions } from '../../constants/permissions';
defineOptions({ defineOptions({
name: 'WorkspaceDefinitionTable', name: 'WorkspaceDefinitionTable',
}); });
const MenuItem = Menu.Item;
const { Lr } = useLocalization(); const { Lr } = useLocalization();
const { hasAccessByCodes } = useAccess();
const { deserialize: deserializeLocalizableString } = const { deserialize: deserializeLocalizableString } =
useLocalizationSerializer(); useLocalizationSerializer();
const { deleteApi, getPagedListApi } = useWorkspaceDefinitionsApi(); const { deleteApi, getPagedListApi } = useWorkspaceDefinitionsApi();
@ -101,6 +109,11 @@ const gridOptions: VxeGridProps<WorkspaceDefinitionRecordDto> = {
slots: { default: 'actions' }, slots: { default: 'actions' },
title: $t('AbpUi.Actions'), title: $t('AbpUi.Actions'),
width: 220, width: 220,
visible: hasAccessByCodes([
WorkspaceDefinitionPermissions.Default,
WorkspaceDefinitionPermissions.Delete,
WorkspaceDefinitionPermissions.Update,
]),
}, },
], ],
exportConfig: {}, exportConfig: {},
@ -148,6 +161,11 @@ const [WorkspaceDefinitionModal, modalApi] = useVbenModal({
() => import('./WorkspaceDefinitionModal.vue'), () => import('./WorkspaceDefinitionModal.vue'),
), ),
}); });
const [WorkspaceResetApiKeyModal, resetApiKeyModalApi] = useVbenModal({
connectedComponent: defineAsyncComponent(
() => import('./WorkspaceResetApiKeyModal.vue'),
),
});
function onCreate() { function onCreate() {
modalApi.setData({}); modalApi.setData({});
@ -171,6 +189,16 @@ async function onDelete(row: WorkspaceDefinitionRecordDto) {
title: $t('AbpUi.AreYouSure'), title: $t('AbpUi.AreYouSure'),
}); });
} }
function onMenuClick(row: WorkspaceDefinitionRecordDto, info: MenuInfo) {
switch (info.key) {
case 'reset-api-key': {
resetApiKeyModalApi.setData(row);
resetApiKeyModalApi.open();
break;
}
}
}
</script> </script>
<template> <template>
@ -204,6 +232,7 @@ async function onDelete(row: WorkspaceDefinitionRecordDto) {
</Button> </Button>
<Button <Button
v-access:code="[WorkspaceDefinitionPermissions.Delete]" v-access:code="[WorkspaceDefinitionPermissions.Delete]"
:disabled="row.isStatic"
:icon="h(DeleteOutlined)" :icon="h(DeleteOutlined)"
block block
danger danger
@ -212,10 +241,25 @@ async function onDelete(row: WorkspaceDefinitionRecordDto) {
> >
{{ $t('AbpUi.Delete') }} {{ $t('AbpUi.Delete') }}
</Button> </Button>
<Dropdown>
<template #overlay>
<Menu @click="(info) => onMenuClick(row, info)">
<MenuItem
v-if="hasAccessByCodes([WorkspaceDefinitionPermissions.Update])"
key="reset-api-key"
:icon="h(RedoOutlined)"
>
{{ $t('AIManagement.ResetApiKey') }}
</MenuItem>
</Menu>
</template>
<Button :icon="h(EllipsisOutlined)" type="link" />
</Dropdown>
</div> </div>
</template> </template>
</Grid> </Grid>
<WorkspaceDefinitionModal @change="() => gridApi.query()" /> <WorkspaceDefinitionModal @change="() => gridApi.query()" />
<WorkspaceResetApiKeyModal @change="() => gridApi.query()" />
</template> </template>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>

71
apps/vben5/packages/@abp/ai-management/src/components/workspaces/WorkspaceResetApiKeyModal.vue

@ -0,0 +1,71 @@
<script setup lang="ts">
import type { WorkspaceDefinitionRecordDto } from '../../types/workspaces';
import { ref } from 'vue';
import { useVbenForm, useVbenModal } from '@vben/common-ui';
import { $t } from '@vben/locales';
import { useMessage } from '@abp/ui';
import { useWorkspaceDefinitionsApi } from '../../api/useWorkspaceDefinitionsApi';
const emit = defineEmits<{
(event: 'change', data: WorkspaceDefinitionRecordDto): void;
}>();
const message = useMessage();
const { getApi, updateApi } = useWorkspaceDefinitionsApi();
const formModel = ref<WorkspaceDefinitionRecordDto>();
const [Form, formApi] = useVbenForm({
schema: [
{
fieldName: 'apiKey',
component: 'InputPassword',
label: $t('AIManagement.DisplayName:ApiKey'),
rules: 'required',
},
],
showDefaultActions: false,
handleSubmit: onSubmit,
});
const [Modal, modalApi] = useVbenModal({
title: $t('AIManagement.ResetApiKey'),
async onOpenChange(isOpen) {
if (isOpen) {
const { id } = modalApi.getData<WorkspaceDefinitionRecordDto>();
const dto = await getApi(id);
formModel.value = dto;
}
},
async onConfirm() {
await formApi.validateAndSubmitForm();
},
});
async function onSubmit(values: Record<string, string>) {
try {
modalApi.lock();
const dto = await updateApi(formModel.value!.id, {
...formModel.value!,
apiKey: values.apiKey,
});
message.success($t('AbpUi.SavedSuccessfully'));
emit('change', dto);
modalApi.close();
} finally {
modalApi.unlock();
}
}
</script>
<template>
<Modal>
<Form />
</Modal>
</template>
<style scoped></style>

1
apps/vben5/packages/@abp/ai-management/src/types/tools.ts

@ -11,6 +11,7 @@ interface AIToolDefinitionRecordDto
description?: string; description?: string;
isEnabled: boolean; isEnabled: boolean;
isGlobal: boolean; isGlobal: boolean;
isStatic: boolean;
isSystem: boolean; isSystem: boolean;
name: string; name: string;
provider: string; provider: string;

1
apps/vben5/packages/@abp/ai-management/src/types/workspaces.ts

@ -13,6 +13,7 @@ interface WorkspaceDefinitionRecordDto
frequencyPenalty?: number; frequencyPenalty?: number;
instructions?: string; instructions?: string;
isEnabled: boolean; isEnabled: boolean;
isStatic: boolean;
maxOutputTokens?: number; maxOutputTokens?: number;
modelName: string; modelName: string;
name: string; name: string;

5
apps/vben5/packages/@abp/components/src/vditor/Viewer.vue

@ -21,7 +21,7 @@ const viewerRef = ref<HTMLDivElement>();
const vditorPreviewRef = ref<VditorPreview>(); const vditorPreviewRef = ref<VditorPreview>();
const skinName = computed(() => { const skinName = computed(() => {
return preferences.theme.mode === 'light' ? 'light' : 'dark'; return preferences.theme.mode === 'dark' ? 'dark' : 'light';
}); });
function init() { function init() {
@ -35,6 +35,9 @@ function init() {
theme: { theme: {
current: isDark ? 'dark' : 'light', current: isDark ? 'dark' : 'light',
}, },
transform: (html) => {
return html.replaceAll(/<a\s+/gi, '<a class="text-blue-600" target="_blank" rel="noopener noreferrer" ');
}
}); });
} }

13
apps/vben5/packages/@abp/features/src/components/definitions/features/FeatureDefinitionTable.vue

@ -10,7 +10,6 @@ import { defineAsyncComponent, h, onMounted, ref } from 'vue';
import { useAccess } from '@vben/access'; import { useAccess } from '@vben/access';
import { useVbenModal } from '@vben/common-ui'; import { useVbenModal } from '@vben/common-ui';
import { createIconifyIcon } from '@vben/icons';
import { $t } from '@vben/locales'; import { $t } from '@vben/locales';
import { import {
@ -38,7 +37,6 @@ import { FeatureDefinitionsPermissions } from '../../../constants/permissions';
defineOptions({ defineOptions({
name: 'FeatureDefinitionTable', name: 'FeatureDefinitionTable',
}); });
const FeaturesOutlined = createIconifyIcon('pajamas:feature-flag');
const MenuItem = Menu.Item; const MenuItem = Menu.Item;
interface FeatureVo { interface FeatureVo {
@ -205,6 +203,11 @@ const subGridColumns: VxeGridProps<FeatureGroupVo>['columns'] = [
slots: { default: 'action' }, slots: { default: 'action' },
title: $t('AbpUi.Actions'), title: $t('AbpUi.Actions'),
width: 220, width: 220,
visible: hasAccessByCodes([
FeatureDefinitionsPermissions.Create,
FeatureDefinitionsPermissions.Delete,
FeatureDefinitionsPermissions.Update,
]),
}, },
]; ];
@ -356,17 +359,17 @@ onMounted(onGet);
{{ $t('AbpUi.Edit') }} {{ $t('AbpUi.Edit') }}
</Button> </Button>
<Button <Button
v-if="!feature.isStatic"
:icon="h(DeleteOutlined)" :icon="h(DeleteOutlined)"
block block
danger danger
type="link" type="link"
v-access:code="[FeatureDefinitionsPermissions.Delete]" v-access:code="[FeatureDefinitionsPermissions.Delete]"
:disabled="feature.isStatic"
@click="onDelete(feature)" @click="onDelete(feature)"
> >
{{ $t('AbpUi.Delete') }} {{ $t('AbpUi.Delete') }}
</Button> </Button>
<Dropdown v-if="!feature.isStatic"> <Dropdown>
<template #overlay> <template #overlay>
<Menu @click="(info) => onMenuClick(feature, info)"> <Menu @click="(info) => onMenuClick(feature, info)">
<MenuItem <MenuItem
@ -374,7 +377,7 @@ onMounted(onGet);
hasAccessByCodes([FeatureDefinitionsPermissions.Create]) hasAccessByCodes([FeatureDefinitionsPermissions.Create])
" "
key="features" key="features"
:icon="h(FeaturesOutlined)" :icon="h(PlusOutlined)"
> >
{{ $t('AbpFeatureManagement.FeatureDefinitions:AddNew') }} {{ $t('AbpFeatureManagement.FeatureDefinitions:AddNew') }}
</MenuItem> </MenuItem>

16
apps/vben5/packages/@abp/features/src/components/definitions/groups/FeatureGroupDefinitionTable.vue

@ -10,7 +10,6 @@ import { defineAsyncComponent, h, onMounted, ref } from 'vue';
import { useAccess } from '@vben/access'; import { useAccess } from '@vben/access';
import { useVbenModal } from '@vben/common-ui'; import { useVbenModal } from '@vben/common-ui';
import { createIconifyIcon } from '@vben/icons';
import { $t } from '@vben/locales'; import { $t } from '@vben/locales';
import { sortby, useLocalization, useLocalizationSerializer } from '@abp/core'; import { sortby, useLocalization, useLocalizationSerializer } from '@abp/core';
@ -35,8 +34,6 @@ defineOptions({
const MenuItem = Menu.Item; const MenuItem = Menu.Item;
const FeaturesOutlined = createIconifyIcon('pajamas:feature-flag');
const featureGroups = ref<FeatureGroupDefinitionDto[]>([]); const featureGroups = ref<FeatureGroupDefinitionDto[]>([]);
const { Lr } = useLocalization(); const { Lr } = useLocalization();
@ -87,6 +84,11 @@ const gridOptions: VxeGridProps<FeatureGroupDefinitionDto> = {
slots: { default: 'action' }, slots: { default: 'action' },
title: $t('AbpUi.Actions'), title: $t('AbpUi.Actions'),
width: 220, width: 220,
visible: hasAccessByCodes([
FeatureDefinitionsPermissions.Create,
GroupDefinitionsPermissions.Delete,
GroupDefinitionsPermissions.Update,
]),
}, },
], ],
exportConfig: {}, exportConfig: {},
@ -231,25 +233,25 @@ onMounted(onGet);
{{ $t('AbpUi.Edit') }} {{ $t('AbpUi.Edit') }}
</Button> </Button>
<Button <Button
v-if="!row.isStatic"
:icon="h(DeleteOutlined)" :icon="h(DeleteOutlined)"
block block
danger danger
type="link" type="link"
v-access:code="[GroupDefinitionsPermissions.Delete]" v-access:code="[GroupDefinitionsPermissions.Delete]"
:disabled="row.isStatic"
@click="onDelete(row)" @click="onDelete(row)"
> >
{{ $t('AbpUi.Delete') }} {{ $t('AbpUi.Delete') }}
</Button> </Button>
<Dropdown v-if="!row.isStatic"> <Dropdown>
<template #overlay> <template #overlay>
<Menu @click="(info) => onMenuClick(row, info)"> <Menu @click="(info) => onMenuClick(row, info)">
<MenuItem <MenuItem
v-if="hasAccessByCodes([FeatureDefinitionsPermissions.Create])" v-if="hasAccessByCodes([FeatureDefinitionsPermissions.Create])"
key="features" key="features"
:icon="h(FeaturesOutlined)" :icon="h(PlusOutlined)"
> >
{{ $t('AbpFeatureManagement.GroupDefinitions:AddNew') }} {{ $t('AbpFeatureManagement.FeatureDefinitions:AddNew') }}
</MenuItem> </MenuItem>
</Menu> </Menu>
</template> </template>

91
apps/vben5/packages/@abp/permissions/src/components/definitions/groups/PermissionGroupDefinitionTable.vue

@ -10,7 +10,6 @@ import { defineAsyncComponent, h, onMounted, ref } from 'vue';
import { useAccess } from '@vben/access'; import { useAccess } from '@vben/access';
import { useVbenModal } from '@vben/common-ui'; import { useVbenModal } from '@vben/common-ui';
import { createIconifyIcon } from '@vben/icons';
import { $t } from '@vben/locales'; import { $t } from '@vben/locales';
import { sortby, useLocalization, useLocalizationSerializer } from '@abp/core'; import { sortby, useLocalization, useLocalizationSerializer } from '@abp/core';
@ -35,8 +34,6 @@ defineOptions({
const MenuItem = Menu.Item; const MenuItem = Menu.Item;
const PermissionsOutlined = createIconifyIcon('icon-park-outline:permissions');
const permissionGroups = ref<PermissionGroupDefinitionDto[]>([]); const permissionGroups = ref<PermissionGroupDefinitionDto[]>([]);
const { Lr } = useLocalization(); const { Lr } = useLocalization();
@ -87,6 +84,11 @@ const gridOptions: VxeGridProps<PermissionGroupDefinitionDto> = {
slots: { default: 'action' }, slots: { default: 'action' },
title: $t('AbpUi.Actions'), title: $t('AbpUi.Actions'),
width: 220, width: 220,
visible: hasAccessByCodes([
PermissionDefinitionsPermissions.Create,
GroupDefinitionsPermissions.Delete,
GroupDefinitionsPermissions.Update,
]),
}, },
], ],
exportConfig: {}, exportConfig: {},
@ -221,53 +223,42 @@ onMounted(onGet);
</template> </template>
<template #action="{ row }"> <template #action="{ row }">
<div class="flex flex-row"> <div class="flex flex-row">
<div :class="`${row.isStatic ? 'w-full' : 'basis-1/3'}`"> <Button
<Button :icon="h(EditOutlined)"
:icon="h(EditOutlined)" block
block type="link"
type="link" v-access:code="[GroupDefinitionsPermissions.Update]"
v-access:code="[GroupDefinitionsPermissions.Update]" @click="onUpdate(row)"
@click="onUpdate(row)" >
> {{ $t('AbpUi.Edit') }}
{{ $t('AbpUi.Edit') }} </Button>
</Button> <Button
</div> :icon="h(DeleteOutlined)"
<template v-if="!row.isStatic"> block
<div class="basis-1/3"> danger
<Button type="link"
:icon="h(DeleteOutlined)" v-access:code="[GroupDefinitionsPermissions.Delete]"
block :disabled="row.isStatic"
danger @click="onDelete(row)"
type="link" >
v-access:code="[GroupDefinitionsPermissions.Delete]" {{ $t('AbpUi.Delete') }}
@click="onDelete(row)" </Button>
> <Dropdown>
{{ $t('AbpUi.Delete') }} <template #overlay>
</Button> <Menu @click="(info) => onMenuClick(row, info)">
</div> <MenuItem
<div class="basis-1/3"> v-if="
<Dropdown> hasAccessByCodes([PermissionDefinitionsPermissions.Create])
<template #overlay> "
<Menu @click="(info) => onMenuClick(row, info)"> key="permissions"
<MenuItem :icon="h(PlusOutlined)"
v-if=" >
hasAccessByCodes([ {{ $t('AbpPermissionManagement.PermissionDefinitions:AddNew') }}
PermissionDefinitionsPermissions.Create, </MenuItem>
]) </Menu>
" </template>
key="permissions" <Button :icon="h(EllipsisOutlined)" type="link" />
:icon="h(PermissionsOutlined)" </Dropdown>
>
{{
$t('AbpPermissionManagement.PermissionDefinitions:AddNew')
}}
</MenuItem>
</Menu>
</template>
<Button :icon="h(EllipsisOutlined)" type="link" />
</Dropdown>
</div>
</template>
</div> </div>
</template> </template>
</Grid> </Grid>

16
apps/vben5/packages/@abp/permissions/src/components/definitions/permissions/PermissionDefinitionModal.vue

@ -16,6 +16,7 @@ import { useVbenModal } from '@vben/common-ui';
import { $t } from '@vben/locales'; import { $t } from '@vben/locales';
import { import {
isNullOrWhiteSpace,
listToTree, listToTree,
useLocalization, useLocalization,
useLocalizationSerializer, useLocalizationSerializer,
@ -94,9 +95,15 @@ const [Modal, modalApi] = useVbenModal({
}, },
onConfirm: async () => { onConfirm: async () => {
await form.value?.validate(); await form.value?.validate();
const input = toValue(formModel);
const api = isEditModel.value const api = isEditModel.value
? updateApi(formModel.value.name, toValue(formModel)) ? updateApi(formModel.value.name, input)
: createApi(toValue(formModel)); : createApi({
...input,
name: isNullOrWhiteSpace(input.parentName)
? input.name
: `${input.parentName}.${input.name}`,
});
modalApi.setState({ submitting: true }); modalApi.setState({ submitting: true });
api api
.then((res) => { .then((res) => {
@ -121,9 +128,11 @@ const [Modal, modalApi] = useVbenModal({
}); });
try { try {
modalApi.setState({ loading: true }); modalApi.setState({ loading: true });
const { groupName, name } = modalApi.getData<PermissionDefinitionDto>(); const { groupName, name, parentName } =
modalApi.getData<PermissionDefinitionDto>();
name && (await onGet(name)); name && (await onGet(name));
await Promise.all([onInitGroups(groupName), onInitProviders()]); await Promise.all([onInitGroups(groupName), onInitProviders()]);
formModel.value.parentName = parentName;
} finally { } finally {
modalApi.setState({ loading: false }); modalApi.setState({ loading: false });
} }
@ -251,6 +260,7 @@ function onPropDelete(prop: PropertyInfo) {
> >
<Input <Input
v-model:value="formModel.name" v-model:value="formModel.name"
:addon-before="`${formModel.parentName ?? ''}`"
:disabled="formModel.isStatic" :disabled="formModel.isStatic"
autocomplete="off" autocomplete="off"
/> />

63
apps/vben5/packages/@abp/permissions/src/components/definitions/permissions/PermissionDefinitionTable.vue

@ -1,10 +1,12 @@
<script setup lang="ts"> <script setup lang="ts">
import type { VxeGridListeners, VxeGridProps } from '@abp/ui'; import type { VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { MenuInfo } from 'ant-design-vue/es/menu/src/interface';
import type { VbenFormProps } from '@vben/common-ui'; import type { VbenFormProps } from '@vben/common-ui';
import { defineAsyncComponent, h, onMounted, ref } from 'vue'; import { defineAsyncComponent, h, onMounted, ref } from 'vue';
import { useAccess } from '@vben/access';
import { useVbenModal } from '@vben/common-ui'; import { useVbenModal } from '@vben/common-ui';
import { $t } from '@vben/locales'; import { $t } from '@vben/locales';
@ -14,24 +16,27 @@ import {
useLocalization, useLocalization,
useLocalizationSerializer, useLocalizationSerializer,
} from '@abp/core'; } from '@abp/core';
import { useVbenVxeGrid } from '@abp/ui'; import { useMessage, useVbenVxeGrid } from '@abp/ui';
import { import {
DeleteOutlined, DeleteOutlined,
EditOutlined, EditOutlined,
EllipsisOutlined,
PlusOutlined, PlusOutlined,
} from '@ant-design/icons-vue'; } from '@ant-design/icons-vue';
import { Button, message, Modal, Tag } from 'ant-design-vue'; import { Button, Dropdown, Menu, Modal, Tag } from 'ant-design-vue';
import { VxeGrid } from 'vxe-table'; import { VxeGrid } from 'vxe-table';
import { usePermissionDefinitionsApi } from '../../../api/usePermissionDefinitionsApi'; import { usePermissionDefinitionsApi } from '../../../api/usePermissionDefinitionsApi';
import { usePermissionGroupDefinitionsApi } from '../../../api/usePermissionGroupDefinitionsApi'; import { usePermissionGroupDefinitionsApi } from '../../../api/usePermissionGroupDefinitionsApi';
import { GroupDefinitionsPermissions } from '../../../constants/permissions'; import { PermissionDefinitionsPermissions } from '../../../constants/permissions';
import { useTypesMap } from './types'; import { useTypesMap } from './types';
defineOptions({ defineOptions({
name: 'PermissionDefinitionTable', name: 'PermissionDefinitionTable',
}); });
const MenuItem = Menu.Item;
interface PermissionVo { interface PermissionVo {
children: PermissionVo[]; children: PermissionVo[];
displayName: string; displayName: string;
@ -51,6 +56,8 @@ interface PermissionGroupVo {
const permissionGroups = ref<PermissionGroupVo[]>([]); const permissionGroups = ref<PermissionGroupVo[]>([]);
const message = useMessage();
const { hasAccessByCodes } = useAccess();
const { Lr } = useLocalization(); const { Lr } = useLocalization();
const { deserialize } = useLocalizationSerializer(); const { deserialize } = useLocalizationSerializer();
const { multiTenancySidesMap, providersMap } = useTypesMap(); const { multiTenancySidesMap, providersMap } = useTypesMap();
@ -193,7 +200,12 @@ const subGridColumns: VxeGridProps<PermissionVo>['columns'] = [
fixed: 'right', fixed: 'right',
slots: { default: 'action' }, slots: { default: 'action' },
title: $t('AbpUi.Actions'), title: $t('AbpUi.Actions'),
width: 180, width: 260,
visible: hasAccessByCodes([
PermissionDefinitionsPermissions.Create,
PermissionDefinitionsPermissions.Delete,
PermissionDefinitionsPermissions.Update,
]),
}, },
]; ];
@ -278,6 +290,19 @@ function onDelete(row: PermissionGroupVo) {
}); });
} }
function onMenuClick(row: PermissionVo, info: MenuInfo) {
switch (info.key) {
case 'permissions': {
modalApi.setData({
groupName: row.groupName,
parentName: row.name,
});
modalApi.open();
break;
}
}
}
onMounted(onGet); onMounted(onGet);
</script> </script>
@ -287,7 +312,7 @@ onMounted(onGet);
<Button <Button
:icon="h(PlusOutlined)" :icon="h(PlusOutlined)"
type="primary" type="primary"
v-access:code="[GroupDefinitionsPermissions.Create]" v-access:code="[PermissionDefinitionsPermissions.Create]"
@click="onCreate" @click="onCreate"
> >
{{ $t('AbpPermissionManagement.PermissionDefinitions:AddNew') }} {{ $t('AbpPermissionManagement.PermissionDefinitions:AddNew') }}
@ -321,22 +346,44 @@ onMounted(onGet);
:icon="h(EditOutlined)" :icon="h(EditOutlined)"
block block
type="link" type="link"
v-access:code="[GroupDefinitionsPermissions.Update]" v-access:code="[PermissionDefinitionsPermissions.Update]"
@click="onUpdate(permission)" @click="onUpdate(permission)"
> >
{{ $t('AbpUi.Edit') }} {{ $t('AbpUi.Edit') }}
</Button> </Button>
<Button <Button
v-if="!permission.isStatic"
:icon="h(DeleteOutlined)" :icon="h(DeleteOutlined)"
block block
danger danger
type="link" type="link"
v-access:code="[GroupDefinitionsPermissions.Delete]" v-access:code="[PermissionDefinitionsPermissions.Delete]"
:disabled="permission.isStatic"
@click="onDelete(permission)" @click="onDelete(permission)"
> >
{{ $t('AbpUi.Delete') }} {{ $t('AbpUi.Delete') }}
</Button> </Button>
<Dropdown>
<template #overlay>
<Menu
@click="(info: MenuInfo) => onMenuClick(permission, info)"
>
<MenuItem
v-if="
hasAccessByCodes([
PermissionDefinitionsPermissions.Create,
])
"
key="permissions"
:icon="h(PlusOutlined)"
>
{{
$t('AbpPermissionManagement.PermissionDefinitions:AddNew')
}}
</MenuItem>
</Menu>
</template>
<Button :icon="h(EllipsisOutlined)" type="link" />
</Dropdown>
</div> </div>
</template> </template>
</VxeGrid> </VxeGrid>

49
apps/vben5/packages/@abp/settings/src/components/definitions/SettingDefinitionTable.vue

@ -7,6 +7,7 @@ import type { SettingDefinitionDto } from '../../types/definitions';
import { defineAsyncComponent, h, onMounted, ref } from 'vue'; import { defineAsyncComponent, h, onMounted, ref } from 'vue';
import { useAccess } from '@vben/access';
import { useVbenModal } from '@vben/common-ui'; import { useVbenModal } from '@vben/common-ui';
import { $t } from '@vben/locales'; import { $t } from '@vben/locales';
@ -29,6 +30,7 @@ defineOptions({
const settingGroups = ref<SettingDefinitionDto[]>([]); const settingGroups = ref<SettingDefinitionDto[]>([]);
const { Lr } = useLocalization(); const { Lr } = useLocalization();
const { hasAccessByCodes } = useAccess();
const { deserialize } = useLocalizationSerializer(); const { deserialize } = useLocalizationSerializer();
const { deleteApi, getListApi } = useDefinitionsApi(); const { deleteApi, getListApi } = useDefinitionsApi();
@ -75,6 +77,10 @@ const gridOptions: VxeGridProps<SettingDefinitionDto> = {
slots: { default: 'action' }, slots: { default: 'action' },
title: $t('AbpUi.Actions'), title: $t('AbpUi.Actions'),
width: 180, width: 180,
visible: hasAccessByCodes([
SettingDefinitionsPermissions.Update,
SettingDefinitionsPermissions.DeleteOrRestore,
]),
}, },
], ],
exportConfig: {}, exportConfig: {},
@ -192,29 +198,26 @@ onMounted(onGet);
</template> </template>
<template #action="{ row }"> <template #action="{ row }">
<div class="flex flex-row"> <div class="flex flex-row">
<div :class="row.isStatic ? 'w-full' : 'basis-1/2'"> <Button
<Button :icon="h(EditOutlined)"
:icon="h(EditOutlined)" block
block type="link"
type="link" v-access:code="[SettingDefinitionsPermissions.Update]"
v-access:code="[SettingDefinitionsPermissions.Update]" @click="onUpdate(row)"
@click="onUpdate(row)" >
> {{ $t('AbpUi.Edit') }}
{{ $t('AbpUi.Edit') }} </Button>
</Button> <Button
</div> :icon="h(DeleteOutlined)"
<div v-if="!row.isStatic" class="basis-1/2"> block
<Button danger
:icon="h(DeleteOutlined)" type="link"
block v-access:code="[SettingDefinitionsPermissions.DeleteOrRestore]"
danger :disabled="row.isStatic"
type="link" @click="onDelete(row)"
v-access:code="[SettingDefinitionsPermissions.DeleteOrRestore]" >
@click="onDelete(row)" {{ $t('AbpUi.Delete') }}
> </Button>
{{ $t('AbpUi.Delete') }}
</Button>
</div>
</div> </div>
</template> </template>
</Grid> </Grid>

4
apps/vben5/packages/@abp/text-templating/src/components/definitions/TemplateContentModal.vue

@ -144,8 +144,8 @@ async function onSubmit(values: Record<string, string>) {
<template> <template>
<Modal :title="$t('AbpTextTemplating.EditContents')"> <Modal :title="$t('AbpTextTemplating.EditContents')">
<Alert v-if="textTemplate?.isInlineLocalized" type="warning"> <Alert v-if="textTemplate?.isInlineLocalized" type="warning" show-icon>
<template #message> <template #description>
<MarkdownViewer <MarkdownViewer
:value="$t('AbpTextTemplating.InlineContentDescription')" :value="$t('AbpTextTemplating.InlineContentDescription')"
/> />

6
apps/vben5/packages/@abp/text-templating/src/components/definitions/TemplateDefinitionModal.vue

@ -47,7 +47,7 @@ const abpStore = useAbpStore();
const { Lr } = useLocalization(); const { Lr } = useLocalization();
const { hasAccessByCodes } = useAccess(); const { hasAccessByCodes } = useAccess();
const { deserialize } = useLocalizationSerializer(); const { deserialize } = useLocalizationSerializer();
const { getListApi: getResourcesApi } = useResourcesApi(); const { getPagedListApi: getResourcesApi } = useResourcesApi();
const { cancel, createApi, getApi, getListApi, updateApi } = const { cancel, createApi, getApi, getListApi, updateApi } =
useTemplateDefinitionsApi(); useTemplateDefinitionsApi();
@ -144,7 +144,9 @@ async function onInitResources() {
if (!hasAccessByCodes(['LocalizationManagement.Resource'])) { if (!hasAccessByCodes(['LocalizationManagement.Resource'])) {
return; return;
} }
const { items } = await getResourcesApi(); const { items } = await getResourcesApi({
maxResultCount: 100,
});
textTemplateResources.value = items; textTemplateResources.value = items;
} }

10
apps/vben5/packages/@abp/text-templating/src/components/definitions/TemplateDefinitionTable.vue

@ -130,6 +130,11 @@ const gridOptions: VxeGridProps<TextTemplateDefinitionDto> = {
slots: { default: 'action' }, slots: { default: 'action' },
title: $t('AbpUi.Actions'), title: $t('AbpUi.Actions'),
width: 220, width: 220,
visible: hasAccessByCodes([
WebhookDefinitionsPermissions.Default,
WebhookDefinitionsPermissions.Delete,
WebhookDefinitionsPermissions.Update,
]),
}, },
], ],
exportConfig: {}, exportConfig: {},
@ -290,10 +295,7 @@ onMounted(onGet);
{{ $t('AbpUi.Edit') }} {{ $t('AbpUi.Edit') }}
</Button> </Button>
<Button <Button
v-if=" :disabled="row.isStatic"
!row.isStatic &&
hasAccessByCodes([WebhookDefinitionsPermissions.Delete])
"
:icon="h(DeleteOutlined)" :icon="h(DeleteOutlined)"
block block
danger danger

2
apps/vben5/packages/@abp/ui/src/components/properties/PropertyTable.vue

@ -57,7 +57,7 @@ const getTableColumns = computed((): TableColumnsType<PropertyInfo> => {
{ {
align: 'left', align: 'left',
dataIndex: 'value', dataIndex: 'value',
width: 500, width: 'auto',
ellipsis: true, ellipsis: true,
title: $t('component.extra_property_dictionary.value'), title: $t('component.extra_property_dictionary.value'),
}, },

4
aspnet-core/LINGYUN.MicroService.All.slnx

@ -146,6 +146,10 @@
<Project Path="framework/data-protection/LINGYUN.Abp.DataProtection.EntityFrameworkCore/LINGYUN.Abp.DataProtection.EntityFrameworkCore.csproj" /> <Project Path="framework/data-protection/LINGYUN.Abp.DataProtection.EntityFrameworkCore/LINGYUN.Abp.DataProtection.EntityFrameworkCore.csproj" />
<Project Path="framework/data-protection/LINGYUN.Abp.DataProtection/LINGYUN.Abp.DataProtection.csproj" /> <Project Path="framework/data-protection/LINGYUN.Abp.DataProtection/LINGYUN.Abp.DataProtection.csproj" />
</Folder> </Folder>
<Folder Name="/framework/dynamic-definition/">
<Project Path="framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN.Abp.Dynamic.Definitions.csproj" Id="6b19229f-012f-436a-b2b4-16ef943eb3fa" />
<Project Path="framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN.Abp.Dynamic.Definitions.Core.csproj" Id="4cc5fdb2-2b0b-4937-a5b5-1c2afbc0c071" />
</Folder>
<Folder Name="/framework/dynamic-queryable/"> <Folder Name="/framework/dynamic-queryable/">
<Project Path="framework/dynamic-queryable/LINGYUN.Abp.Dynamic.Queryable.Application.Contracts/LINGYUN.Abp.Dynamic.Queryable.Application.Contracts.csproj" /> <Project Path="framework/dynamic-queryable/LINGYUN.Abp.Dynamic.Queryable.Application.Contracts/LINGYUN.Abp.Dynamic.Queryable.Application.Contracts.csproj" />
<Project Path="framework/dynamic-queryable/LINGYUN.Abp.Dynamic.Queryable.Application/LINGYUN.Abp.Dynamic.Queryable.Application.csproj" /> <Project Path="framework/dynamic-queryable/LINGYUN.Abp.Dynamic.Queryable.Application/LINGYUN.Abp.Dynamic.Queryable.Application.csproj" />

4
aspnet-core/LINGYUN.MicroService.Aspire.slnx

@ -129,6 +129,10 @@
<Project Path="framework/data-protection/LINGYUN.Abp.DataProtection.EntityFrameworkCore/LINGYUN.Abp.DataProtection.EntityFrameworkCore.csproj" /> <Project Path="framework/data-protection/LINGYUN.Abp.DataProtection.EntityFrameworkCore/LINGYUN.Abp.DataProtection.EntityFrameworkCore.csproj" />
<Project Path="framework/data-protection/LINGYUN.Abp.DataProtection/LINGYUN.Abp.DataProtection.csproj" /> <Project Path="framework/data-protection/LINGYUN.Abp.DataProtection/LINGYUN.Abp.DataProtection.csproj" />
</Folder> </Folder>
<Folder Name="/framework/dynamic-definition/">
<Project Path="framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN.Abp.Dynamic.Definitions.csproj" />
<Project Path="framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN.Abp.Dynamic.Definitions.Core.csproj" />
</Folder>
<Folder Name="/framework/dynamic-queryable/"> <Folder Name="/framework/dynamic-queryable/">
<Project Path="framework/dynamic-queryable/LINGYUN.Abp.Dynamic.Queryable.Application.Contracts/LINGYUN.Abp.Dynamic.Queryable.Application.Contracts.csproj" /> <Project Path="framework/dynamic-queryable/LINGYUN.Abp.Dynamic.Queryable.Application.Contracts/LINGYUN.Abp.Dynamic.Queryable.Application.Contracts.csproj" />
<Project Path="framework/dynamic-queryable/LINGYUN.Abp.Dynamic.Queryable.Application/LINGYUN.Abp.Dynamic.Queryable.Application.csproj" /> <Project Path="framework/dynamic-queryable/LINGYUN.Abp.Dynamic.Queryable.Application/LINGYUN.Abp.Dynamic.Queryable.Application.csproj" />

4
aspnet-core/LINGYUN.MicroService.SingleProject.slnx

@ -48,6 +48,10 @@
<Project Path="framework/data-protection/LINGYUN.Abp.DataProtection.EntityFrameworkCore/LINGYUN.Abp.DataProtection.EntityFrameworkCore.csproj" /> <Project Path="framework/data-protection/LINGYUN.Abp.DataProtection.EntityFrameworkCore/LINGYUN.Abp.DataProtection.EntityFrameworkCore.csproj" />
<Project Path="framework/data-protection/LINGYUN.Abp.DataProtection/LINGYUN.Abp.DataProtection.csproj" /> <Project Path="framework/data-protection/LINGYUN.Abp.DataProtection/LINGYUN.Abp.DataProtection.csproj" />
</Folder> </Folder>
<Folder Name="/framework/dynamic-definition/">
<Project Path="framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN.Abp.Dynamic.Definitions.Core.csproj" />
<Project Path="framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN.Abp.Dynamic.Definitions.csproj" />
</Folder>
<Folder Name="/framework/dynamic-queryable/"> <Folder Name="/framework/dynamic-queryable/">
<Project Path="framework/dynamic-queryable/LINGYUN.Abp.Dynamic.Queryable.Application.Contracts/LINGYUN.Abp.Dynamic.Queryable.Application.Contracts.csproj" /> <Project Path="framework/dynamic-queryable/LINGYUN.Abp.Dynamic.Queryable.Application.Contracts/LINGYUN.Abp.Dynamic.Queryable.Application.Contracts.csproj" />
<Project Path="framework/dynamic-queryable/LINGYUN.Abp.Dynamic.Queryable.Application/LINGYUN.Abp.Dynamic.Queryable.Application.csproj" /> <Project Path="framework/dynamic-queryable/LINGYUN.Abp.Dynamic.Queryable.Application/LINGYUN.Abp.Dynamic.Queryable.Application.csproj" />

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/AIServiceModule.cs

@ -8,6 +8,7 @@ using LINGYUN.Abp.AspNetCore.Mvc.Wrapper;
using LINGYUN.Abp.AuditLogging.Elasticsearch; using LINGYUN.Abp.AuditLogging.Elasticsearch;
using LINGYUN.Abp.Claims.Mapping; using LINGYUN.Abp.Claims.Mapping;
using LINGYUN.Abp.Data.DbMigrator; using LINGYUN.Abp.Data.DbMigrator;
using LINGYUN.Abp.Dynamic.Definitions;
using LINGYUN.Abp.Emailing.Platform; using LINGYUN.Abp.Emailing.Platform;
using LINGYUN.Abp.EventBus.CAP; using LINGYUN.Abp.EventBus.CAP;
using LINGYUN.Abp.ExceptionHandling.Emailing; using LINGYUN.Abp.ExceptionHandling.Emailing;
@ -67,6 +68,7 @@ namespace LINGYUN.Abp.MicroService.AIService;
typeof(AbpLocalizationCultureMapModule), typeof(AbpLocalizationCultureMapModule),
typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpAspNetCoreMvcWrapperModule),
typeof(AbpAspNetCoreHttpOverridesModule), typeof(AbpAspNetCoreHttpOverridesModule),
typeof(AbpDynamicDefinitionsModule),
typeof(AbpClaimsMappingModule), typeof(AbpClaimsMappingModule),
typeof(AbpSwashbuckleModule), typeof(AbpSwashbuckleModule),
typeof(AbpAutofacModule) typeof(AbpAutofacModule)

1
aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/LINGYUN.Abp.MicroService.AIService.csproj

@ -45,6 +45,7 @@
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.Data.DbMigrator\LINGYUN.Abp.Data.DbMigrator.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.Data.DbMigrator\LINGYUN.Abp.Data.DbMigrator.csproj" />
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj" />
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.ExceptionHandling.Emailing\LINGYUN.Abp.ExceptionHandling.Emailing.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.ExceptionHandling.Emailing\LINGYUN.Abp.ExceptionHandling.Emailing.csproj" />
<ProjectReference Include="..\..\framework\dynamic-definition\LINGYUN.Abp.Dynamic.Definitions\LINGYUN.Abp.Dynamic.Definitions.csproj" />
<ProjectReference Include="..\..\framework\features\LINGYUN.Abp.FeatureManagement.Client\LINGYUN.Abp.FeatureManagement.Client.csproj" /> <ProjectReference Include="..\..\framework\features\LINGYUN.Abp.FeatureManagement.Client\LINGYUN.Abp.FeatureManagement.Client.csproj" />
<ProjectReference Include="..\..\framework\localization\LINGYUN.Abp.Localization.CultureMap\LINGYUN.Abp.Localization.CultureMap.csproj" /> <ProjectReference Include="..\..\framework\localization\LINGYUN.Abp.Localization.CultureMap\LINGYUN.Abp.Localization.CultureMap.csproj" />
<ProjectReference Include="..\..\framework\logging\LINGYUN.Abp.Logging.Serilog.Elasticsearch\LINGYUN.Abp.Logging.Serilog.Elasticsearch.csproj" /> <ProjectReference Include="..\..\framework\logging\LINGYUN.Abp.Logging.Serilog.Elasticsearch\LINGYUN.Abp.Logging.Serilog.Elasticsearch.csproj" />

277
aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/Overrides/MergeFeatureDefinitionManager.cs

@ -1,277 +0,0 @@
using JetBrains.Annotations;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Features;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeFeatureDefinitionManager : FeatureDefinitionManager
{
public MergeFeatureDefinitionManager(
IStaticFeatureDefinitionStore staticStore,
IDynamicFeatureDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<FeatureDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeFeatureMetadata(staticDefinition, dynamicDefinition);
foreach (var child in dynamicDefinition.Children)
{
MergeChildFeature(staticDefinition, child);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<FeatureDefinition>> GetAllAsync()
{
var staticFeatures = await StaticStore.GetFeaturesAsync();
var dynamicFeatures = await DynamicStore.GetFeaturesAsync();
var mergedFeatures = new Dictionary<string, FeatureDefinition>();
foreach (var staticFeature in staticFeatures)
{
mergedFeatures[staticFeature.Name] = staticFeature;
}
foreach (var dynamicFeature in dynamicFeatures)
{
if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature))
{
MergeFeatureMetadata(existingFeature, dynamicFeature);
foreach (var child in dynamicFeature.Children)
{
MergeChildFeature(existingFeature, child);
}
}
else
{
mergedFeatures[dynamicFeature.Name] = dynamicFeature;
}
}
return mergedFeatures.Values.ToImmutableList();
}
public async override Task<IReadOnlyList<FeatureGroupDefinition>> GetGroupsAsync()
{
var staticGroups = await StaticStore.GetGroupsAsync();
var dynamicGroups = await DynamicStore.GetGroupsAsync();
var mergedGroups = new Dictionary<string, FeatureGroupDefinition>();
foreach (var staticGroup in staticGroups)
{
mergedGroups[staticGroup.Name] = staticGroup;
}
foreach (var dynamicGroup in dynamicGroups)
{
if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup))
{
MergeGroupFeatures(existingGroup, dynamicGroup);
}
else
{
mergedGroups[dynamicGroup.Name] = dynamicGroup;
}
}
return mergedGroups.Values.ToImmutableList();
}
private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source)
{
foreach (var sourceFeature in source.Features)
{
var existingFeature = GetFeatureOrNull(target, sourceFeature.Name);
if (existingFeature == null)
{
var newFeature = target.AddFeature(
sourceFeature.Name,
sourceFeature.DefaultValue,
sourceFeature.DisplayName,
sourceFeature.Description,
sourceFeature.ValueType,
sourceFeature.IsVisibleToClients,
sourceFeature.IsAvailableToHost
);
CopyFeatureDetails(sourceFeature, newFeature);
foreach (var child in sourceFeature.Children)
{
AddChildFeatureRecursively(newFeature, child);
}
}
else
{
MergeFeatureMetadata(existingFeature, sourceFeature);
foreach (var child in sourceFeature.Children)
{
MergeChildFeature(existingFeature, child);
}
}
}
}
private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild)
{
var newChild = parent.CreateChild(
sourceChild.Name,
sourceChild.DefaultValue,
sourceChild.DisplayName,
sourceChild.Description,
sourceChild.ValueType,
sourceChild.IsVisibleToClients,
sourceChild.IsAvailableToHost
);
CopyFeatureDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildFeatureRecursively(newChild, grandchild);
}
}
private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild)
{
var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name);
if (existingChild == null)
{
var newChild = parent.CreateChild(
sourceChild.Name,
sourceChild.DefaultValue,
sourceChild.DisplayName,
sourceChild.Description,
sourceChild.ValueType,
sourceChild.IsVisibleToClients,
sourceChild.IsAvailableToHost
);
CopyFeatureDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildFeatureRecursively(newChild, grandchild);
}
}
else
{
MergeFeatureMetadata(existingChild, sourceChild);
foreach (var grandchild in sourceChild.Children)
{
MergeChildFeature(existingChild, grandchild);
}
}
}
private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target)
{
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.AllowedProviders)
{
if (!target.AllowedProviders.Contains(provider))
{
target.AllowedProviders.Add(provider);
}
}
}
private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source)
{
if (source.DisplayName != null)
{
target.DisplayName = source.DisplayName;
}
if (source.Description != null)
{
target.Description = source.Description;
}
if (source.DefaultValue != null)
{
target.DefaultValue = source.DefaultValue;
}
if (source.ValueType != null)
{
target.ValueType = source.ValueType;
}
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.AllowedProviders)
{
if (!target.AllowedProviders.Contains(provider))
{
target.AllowedProviders.Add(provider);
}
}
target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients;
target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost;
}
public static FeatureDefinition? GetFeatureOrNull(
FeatureGroupDefinition group,
[NotNull] string name)
{
Check.NotNull(name, nameof(name));
return GetFeatureOrNullRecursively(group.Features, name);
}
private static FeatureDefinition? GetFeatureOrNullRecursively(
IReadOnlyList<FeatureDefinition> features,
string name)
{
foreach (var feature in features)
{
if (feature.Name == name)
{
return feature;
}
var childFeature = GetFeatureOrNullRecursively(feature.Children, name);
if (childFeature != null)
{
return childFeature;
}
}
return null;
}
}
#nullable disable

276
aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/Overrides/MergePermissionDefinitionManager.cs

@ -1,276 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.Authorization.Permissions;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergePermissionDefinitionManager : PermissionDefinitionManager
{
private readonly IStaticPermissionDefinitionStore _staticStore;
private readonly IDynamicPermissionDefinitionStore _dynamicStore;
public MergePermissionDefinitionManager(
IStaticPermissionDefinitionStore staticStore,
IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore)
{
_staticStore = staticStore;
_dynamicStore = dynamicStore;
}
public async override Task<PermissionDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await _staticStore.GetOrNullAsync(name);
var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergePermissionMetadata(staticDefinition, dynamicDefinition);
foreach (var grandchild in dynamicDefinition.Children)
{
MergeChildPermissions(staticDefinition, grandchild);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<PermissionDefinition?> GetResourcePermissionOrNullAsync(string resourceName, string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name);
var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergePermissionMetadata(staticDefinition, dynamicDefinition);
foreach (var grandchild in dynamicDefinition.Children)
{
MergeChildPermissions(staticDefinition, grandchild);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<PermissionDefinition>> GetPermissionsAsync()
{
var staticPermissions = await _staticStore.GetPermissionsAsync();
var dynamicPermissions = await _dynamicStore.GetPermissionsAsync();
return MergePermissions(staticPermissions, dynamicPermissions);
}
public async override Task<IReadOnlyList<PermissionDefinition>> GetResourcePermissionsAsync()
{
var staticPermissions = await _staticStore.GetResourcePermissionsAsync();
var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync();
return MergePermissions(staticPermissions, dynamicPermissions);
}
public async override Task<IReadOnlyList<PermissionGroupDefinition>> GetGroupsAsync()
{
var staticGroups = await _staticStore.GetGroupsAsync();
var dynamicGroups = await _dynamicStore.GetGroupsAsync();
var mergedGroups = new Dictionary<string, PermissionGroupDefinition>();
foreach (var staticGroup in staticGroups)
{
mergedGroups[staticGroup.Name] = staticGroup;
}
foreach (var dynamicGroup in dynamicGroups)
{
if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup))
{
MergeGroupPermissions(existingGroup, dynamicGroup);
}
else
{
mergedGroups[dynamicGroup.Name] = dynamicGroup;
}
}
return mergedGroups.Values.ToImmutableList();
}
private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source)
{
foreach (var sourcePermission in source.Permissions)
{
var existingPermission = target.GetPermissionOrNull(sourcePermission.Name);
if (existingPermission == null)
{
var newPermission = target.AddPermission(
sourcePermission.Name,
sourcePermission.DisplayName,
sourcePermission.MultiTenancySide,
sourcePermission.IsEnabled
);
CopyPermissionDetails(sourcePermission, newPermission);
foreach (var child in sourcePermission.Children)
{
AddChildPermissionRecursively(newPermission, child);
}
}
else
{
MergePermissionMetadata(existingPermission, sourcePermission);
foreach (var sourceChild in sourcePermission.Children)
{
MergeChildPermissions(existingPermission, sourceChild);
}
}
}
}
private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild)
{
var newChild = parent.AddChild(
sourceChild.Name,
sourceChild.DisplayName,
sourceChild.MultiTenancySide,
sourceChild.IsEnabled
);
CopyPermissionDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildPermissionRecursively(newChild, grandchild);
}
}
private static IReadOnlyList<PermissionDefinition> MergePermissions(IReadOnlyList<PermissionDefinition> staticPermissions, IReadOnlyList<PermissionDefinition> dynamicPermissions)
{
var mergedPermissions = new Dictionary<string, PermissionDefinition>();
foreach (var staticFeature in staticPermissions)
{
mergedPermissions[staticFeature.Name] = staticFeature;
}
foreach (var dynamicPermission in dynamicPermissions)
{
if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission))
{
MergePermissionMetadata(existingPermission, dynamicPermission);
foreach (var sourceChild in dynamicPermission.Children)
{
MergeChildPermissions(existingPermission, sourceChild);
}
}
else
{
mergedPermissions[dynamicPermission.Name] = dynamicPermission;
}
}
return mergedPermissions.Values.ToImmutableList();
}
private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild)
{
var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name);
if (existingChild == null)
{
var newChild = parent.AddChild(
sourceChild.Name,
sourceChild.DisplayName,
sourceChild.MultiTenancySide,
sourceChild.IsEnabled
);
CopyPermissionDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildPermissionRecursively(newChild, grandchild);
}
}
else
{
MergePermissionMetadata(existingChild, sourceChild);
foreach (var grandchild in sourceChild.Children)
{
MergeChildPermissions(existingChild, grandchild);
}
}
}
private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target)
{
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
foreach (var checker in source.StateCheckers)
{
if (!target.StateCheckers.Contains(checker))
{
target.StateCheckers.Add(checker);
}
}
}
private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source)
{
target.DisplayName = source.DisplayName;
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
foreach (var checker in source.StateCheckers)
{
if (!target.StateCheckers.Contains(checker))
{
target.StateCheckers.Add(checker);
}
}
if (source.MultiTenancySide != MultiTenancySides.Both)
{
target.MultiTenancySide |= source.MultiTenancySide;
}
target.IsEnabled = target.IsEnabled || source.IsEnabled;
}
}
#nullable disable

86
aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/Overrides/MergeSettingDefinitionManager.cs

@ -1,86 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Settings;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeSettingDefinitionManager : SettingDefinitionManager
{
public MergeSettingDefinitionManager(
IStaticSettingDefinitionStore staticStore,
IDynamicSettingDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<SettingDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeSetting(staticDefinition, dynamicDefinition);
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<SettingDefinition>> GetAllAsync()
{
var staticSettings = await StaticStore.GetAllAsync();
var dynamicSettings = await DynamicStore.GetAllAsync();
var mergedSettings = new Dictionary<string, SettingDefinition>();
foreach (var staticSetting in staticSettings)
{
mergedSettings[staticSetting.Name] = staticSetting;
}
foreach (var dynamicSetting in dynamicSettings)
{
if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting))
{
MergeSetting(existingSetting, dynamicSetting);
}
else
{
mergedSettings[dynamicSetting.Name] = dynamicSetting;
}
}
return mergedSettings.Values.ToImmutableList();
}
private static void MergeSetting(SettingDefinition target, SettingDefinition source)
{
target.DisplayName = source.DisplayName;
target.Description = source.Description ?? target.Description;
target.DefaultValue = source.DefaultValue ?? target.DefaultValue;
target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients;
target.IsInherited = target.IsInherited || source.IsInherited;
target.IsEncrypted = target.IsEncrypted || source.IsEncrypted;
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
}
}
#nullable disable

104
aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/Overrides/MergeTemplateDefinitionManager.cs

@ -1,104 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.TextTemplating;
namespace Volo.Abp.TextTemplatin;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeTemplateDefinitionManager : TemplateDefinitionManager
{
public MergeTemplateDefinitionManager(
IStaticTemplateDefinitionStore staticStore,
IDynamicTemplateDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<TemplateDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeTemplate(staticDefinition, dynamicDefinition);
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<TemplateDefinition>> GetAllAsync()
{
var staticTemplates = await StaticStore.GetAllAsync();
var dynamicTemplates = await DynamicStore.GetAllAsync();
var mergedTemplates = new Dictionary<string, TemplateDefinition>();
foreach (var staticTemplate in staticTemplates)
{
mergedTemplates[staticTemplate.Name] = staticTemplate;
}
foreach (var dynamicTemplate in dynamicTemplates)
{
if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate))
{
MergeTemplate(existingTemplate, dynamicTemplate);
}
else
{
mergedTemplates[dynamicTemplate.Name] = dynamicTemplate;
}
}
return mergedTemplates.Values.ToImmutableList();
}
private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate)
{
var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName;
var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName;
var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName;
var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout;
var layout = dynamicTemplate.Layout ?? staticTemplate.Layout;
var mergedTemplate = new TemplateDefinition(
staticTemplate.Name,
localizationResourceName,
displayName,
isLayout,
layout,
defaultCultureName
);
foreach (var property in staticTemplate.Properties)
{
mergedTemplate.Properties[property.Key] = property.Value;
}
foreach (var property in dynamicTemplate.Properties)
{
mergedTemplate.Properties[property.Key] = property.Value;
}
if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine))
{
mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine;
}
else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine))
{
mergedTemplate.RenderEngine = staticTemplate.RenderEngine;
}
mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized;
return mergedTemplate;
}
}
#nullable disable

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/AdminServiceModule.cs

@ -9,6 +9,7 @@ using LINGYUN.Abp.CachingManagement.StackExchangeRedis;
using LINGYUN.Abp.Claims.Mapping; using LINGYUN.Abp.Claims.Mapping;
using LINGYUN.Abp.Data.DbMigrator; using LINGYUN.Abp.Data.DbMigrator;
using LINGYUN.Abp.DataProtectionManagement; using LINGYUN.Abp.DataProtectionManagement;
using LINGYUN.Abp.Dynamic.Definitions;
using LINGYUN.Abp.Emailing.Platform; using LINGYUN.Abp.Emailing.Platform;
using LINGYUN.Abp.EventBus.CAP; using LINGYUN.Abp.EventBus.CAP;
using LINGYUN.Abp.ExceptionHandling.Emailing; using LINGYUN.Abp.ExceptionHandling.Emailing;
@ -98,6 +99,7 @@ namespace LINGYUN.Abp.MicroService.AdminService;
typeof(AbpLocalizationCultureMapModule), typeof(AbpLocalizationCultureMapModule),
typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpAspNetCoreMvcWrapperModule),
typeof(AbpAspNetCoreHttpOverridesModule), typeof(AbpAspNetCoreHttpOverridesModule),
typeof(AbpDynamicDefinitionsModule),
typeof(AbpClaimsMappingModule), typeof(AbpClaimsMappingModule),
typeof(AbpSwashbuckleModule), typeof(AbpSwashbuckleModule),
typeof(AbpAutofacModule) typeof(AbpAutofacModule)

1
aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/LINGYUN.Abp.MicroService.AdminService.csproj

@ -46,6 +46,7 @@
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.Data.DbMigrator\LINGYUN.Abp.Data.DbMigrator.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.Data.DbMigrator\LINGYUN.Abp.Data.DbMigrator.csproj" />
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj" />
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.ExceptionHandling.Emailing\LINGYUN.Abp.ExceptionHandling.Emailing.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.ExceptionHandling.Emailing\LINGYUN.Abp.ExceptionHandling.Emailing.csproj" />
<ProjectReference Include="..\..\framework\dynamic-definition\LINGYUN.Abp.Dynamic.Definitions\LINGYUN.Abp.Dynamic.Definitions.csproj" />
<ProjectReference Include="..\..\framework\features\LINGYUN.Abp.FeatureManagement.Client\LINGYUN.Abp.FeatureManagement.Client.csproj" /> <ProjectReference Include="..\..\framework\features\LINGYUN.Abp.FeatureManagement.Client\LINGYUN.Abp.FeatureManagement.Client.csproj" />
<ProjectReference Include="..\..\framework\localization\LINGYUN.Abp.Localization.CultureMap\LINGYUN.Abp.Localization.CultureMap.csproj" /> <ProjectReference Include="..\..\framework\localization\LINGYUN.Abp.Localization.CultureMap\LINGYUN.Abp.Localization.CultureMap.csproj" />
<ProjectReference Include="..\..\framework\logging\LINGYUN.Abp.Logging.Serilog.Elasticsearch\LINGYUN.Abp.Logging.Serilog.Elasticsearch.csproj" /> <ProjectReference Include="..\..\framework\logging\LINGYUN.Abp.Logging.Serilog.Elasticsearch\LINGYUN.Abp.Logging.Serilog.Elasticsearch.csproj" />

277
aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/Overrides/MergeFeatureDefinitionManager.cs

@ -1,277 +0,0 @@
using JetBrains.Annotations;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Features;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeFeatureDefinitionManager : FeatureDefinitionManager
{
public MergeFeatureDefinitionManager(
IStaticFeatureDefinitionStore staticStore,
IDynamicFeatureDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<FeatureDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeFeatureMetadata(staticDefinition, dynamicDefinition);
foreach (var child in dynamicDefinition.Children)
{
MergeChildFeature(staticDefinition, child);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<FeatureDefinition>> GetAllAsync()
{
var staticFeatures = await StaticStore.GetFeaturesAsync();
var dynamicFeatures = await DynamicStore.GetFeaturesAsync();
var mergedFeatures = new Dictionary<string, FeatureDefinition>();
foreach (var staticFeature in staticFeatures)
{
mergedFeatures[staticFeature.Name] = staticFeature;
}
foreach (var dynamicFeature in dynamicFeatures)
{
if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature))
{
MergeFeatureMetadata(existingFeature, dynamicFeature);
foreach (var child in dynamicFeature.Children)
{
MergeChildFeature(existingFeature, child);
}
}
else
{
mergedFeatures[dynamicFeature.Name] = dynamicFeature;
}
}
return mergedFeatures.Values.ToImmutableList();
}
public async override Task<IReadOnlyList<FeatureGroupDefinition>> GetGroupsAsync()
{
var staticGroups = await StaticStore.GetGroupsAsync();
var dynamicGroups = await DynamicStore.GetGroupsAsync();
var mergedGroups = new Dictionary<string, FeatureGroupDefinition>();
foreach (var staticGroup in staticGroups)
{
mergedGroups[staticGroup.Name] = staticGroup;
}
foreach (var dynamicGroup in dynamicGroups)
{
if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup))
{
MergeGroupFeatures(existingGroup, dynamicGroup);
}
else
{
mergedGroups[dynamicGroup.Name] = dynamicGroup;
}
}
return mergedGroups.Values.ToImmutableList();
}
private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source)
{
foreach (var sourceFeature in source.Features)
{
var existingFeature = GetFeatureOrNull(target, sourceFeature.Name);
if (existingFeature == null)
{
var newFeature = target.AddFeature(
sourceFeature.Name,
sourceFeature.DefaultValue,
sourceFeature.DisplayName,
sourceFeature.Description,
sourceFeature.ValueType,
sourceFeature.IsVisibleToClients,
sourceFeature.IsAvailableToHost
);
CopyFeatureDetails(sourceFeature, newFeature);
foreach (var child in sourceFeature.Children)
{
AddChildFeatureRecursively(newFeature, child);
}
}
else
{
MergeFeatureMetadata(existingFeature, sourceFeature);
foreach (var child in sourceFeature.Children)
{
MergeChildFeature(existingFeature, child);
}
}
}
}
private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild)
{
var newChild = parent.CreateChild(
sourceChild.Name,
sourceChild.DefaultValue,
sourceChild.DisplayName,
sourceChild.Description,
sourceChild.ValueType,
sourceChild.IsVisibleToClients,
sourceChild.IsAvailableToHost
);
CopyFeatureDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildFeatureRecursively(newChild, grandchild);
}
}
private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild)
{
var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name);
if (existingChild == null)
{
var newChild = parent.CreateChild(
sourceChild.Name,
sourceChild.DefaultValue,
sourceChild.DisplayName,
sourceChild.Description,
sourceChild.ValueType,
sourceChild.IsVisibleToClients,
sourceChild.IsAvailableToHost
);
CopyFeatureDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildFeatureRecursively(newChild, grandchild);
}
}
else
{
MergeFeatureMetadata(existingChild, sourceChild);
foreach (var grandchild in sourceChild.Children)
{
MergeChildFeature(existingChild, grandchild);
}
}
}
private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target)
{
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.AllowedProviders)
{
if (!target.AllowedProviders.Contains(provider))
{
target.AllowedProviders.Add(provider);
}
}
}
private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source)
{
if (source.DisplayName != null)
{
target.DisplayName = source.DisplayName;
}
if (source.Description != null)
{
target.Description = source.Description;
}
if (source.DefaultValue != null)
{
target.DefaultValue = source.DefaultValue;
}
if (source.ValueType != null)
{
target.ValueType = source.ValueType;
}
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.AllowedProviders)
{
if (!target.AllowedProviders.Contains(provider))
{
target.AllowedProviders.Add(provider);
}
}
target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients;
target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost;
}
public static FeatureDefinition? GetFeatureOrNull(
FeatureGroupDefinition group,
[NotNull] string name)
{
Check.NotNull(name, nameof(name));
return GetFeatureOrNullRecursively(group.Features, name);
}
private static FeatureDefinition? GetFeatureOrNullRecursively(
IReadOnlyList<FeatureDefinition> features,
string name)
{
foreach (var feature in features)
{
if (feature.Name == name)
{
return feature;
}
var childFeature = GetFeatureOrNullRecursively(feature.Children, name);
if (childFeature != null)
{
return childFeature;
}
}
return null;
}
}
#nullable disable

276
aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/Overrides/MergePermissionDefinitionManager.cs

@ -1,276 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.Authorization.Permissions;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergePermissionDefinitionManager : PermissionDefinitionManager
{
private readonly IStaticPermissionDefinitionStore _staticStore;
private readonly IDynamicPermissionDefinitionStore _dynamicStore;
public MergePermissionDefinitionManager(
IStaticPermissionDefinitionStore staticStore,
IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore)
{
_staticStore = staticStore;
_dynamicStore = dynamicStore;
}
public async override Task<PermissionDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await _staticStore.GetOrNullAsync(name);
var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergePermissionMetadata(staticDefinition, dynamicDefinition);
foreach (var grandchild in dynamicDefinition.Children)
{
MergeChildPermissions(staticDefinition, grandchild);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<PermissionDefinition?> GetResourcePermissionOrNullAsync(string resourceName, string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name);
var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergePermissionMetadata(staticDefinition, dynamicDefinition);
foreach (var grandchild in dynamicDefinition.Children)
{
MergeChildPermissions(staticDefinition, grandchild);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<PermissionDefinition>> GetPermissionsAsync()
{
var staticPermissions = await _staticStore.GetPermissionsAsync();
var dynamicPermissions = await _dynamicStore.GetPermissionsAsync();
return MergePermissions(staticPermissions, dynamicPermissions);
}
public async override Task<IReadOnlyList<PermissionDefinition>> GetResourcePermissionsAsync()
{
var staticPermissions = await _staticStore.GetResourcePermissionsAsync();
var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync();
return MergePermissions(staticPermissions, dynamicPermissions);
}
public async override Task<IReadOnlyList<PermissionGroupDefinition>> GetGroupsAsync()
{
var staticGroups = await _staticStore.GetGroupsAsync();
var dynamicGroups = await _dynamicStore.GetGroupsAsync();
var mergedGroups = new Dictionary<string, PermissionGroupDefinition>();
foreach (var staticGroup in staticGroups)
{
mergedGroups[staticGroup.Name] = staticGroup;
}
foreach (var dynamicGroup in dynamicGroups)
{
if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup))
{
MergeGroupPermissions(existingGroup, dynamicGroup);
}
else
{
mergedGroups[dynamicGroup.Name] = dynamicGroup;
}
}
return mergedGroups.Values.ToImmutableList();
}
private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source)
{
foreach (var sourcePermission in source.Permissions)
{
var existingPermission = target.GetPermissionOrNull(sourcePermission.Name);
if (existingPermission == null)
{
var newPermission = target.AddPermission(
sourcePermission.Name,
sourcePermission.DisplayName,
sourcePermission.MultiTenancySide,
sourcePermission.IsEnabled
);
CopyPermissionDetails(sourcePermission, newPermission);
foreach (var child in sourcePermission.Children)
{
AddChildPermissionRecursively(newPermission, child);
}
}
else
{
MergePermissionMetadata(existingPermission, sourcePermission);
foreach (var sourceChild in sourcePermission.Children)
{
MergeChildPermissions(existingPermission, sourceChild);
}
}
}
}
private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild)
{
var newChild = parent.AddChild(
sourceChild.Name,
sourceChild.DisplayName,
sourceChild.MultiTenancySide,
sourceChild.IsEnabled
);
CopyPermissionDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildPermissionRecursively(newChild, grandchild);
}
}
private static IReadOnlyList<PermissionDefinition> MergePermissions(IReadOnlyList<PermissionDefinition> staticPermissions, IReadOnlyList<PermissionDefinition> dynamicPermissions)
{
var mergedPermissions = new Dictionary<string, PermissionDefinition>();
foreach (var staticFeature in staticPermissions)
{
mergedPermissions[staticFeature.Name] = staticFeature;
}
foreach (var dynamicPermission in dynamicPermissions)
{
if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission))
{
MergePermissionMetadata(existingPermission, dynamicPermission);
foreach (var sourceChild in dynamicPermission.Children)
{
MergeChildPermissions(existingPermission, sourceChild);
}
}
else
{
mergedPermissions[dynamicPermission.Name] = dynamicPermission;
}
}
return mergedPermissions.Values.ToImmutableList();
}
private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild)
{
var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name);
if (existingChild == null)
{
var newChild = parent.AddChild(
sourceChild.Name,
sourceChild.DisplayName,
sourceChild.MultiTenancySide,
sourceChild.IsEnabled
);
CopyPermissionDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildPermissionRecursively(newChild, grandchild);
}
}
else
{
MergePermissionMetadata(existingChild, sourceChild);
foreach (var grandchild in sourceChild.Children)
{
MergeChildPermissions(existingChild, grandchild);
}
}
}
private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target)
{
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
foreach (var checker in source.StateCheckers)
{
if (!target.StateCheckers.Contains(checker))
{
target.StateCheckers.Add(checker);
}
}
}
private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source)
{
target.DisplayName = source.DisplayName;
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
foreach (var checker in source.StateCheckers)
{
if (!target.StateCheckers.Contains(checker))
{
target.StateCheckers.Add(checker);
}
}
if (source.MultiTenancySide != MultiTenancySides.Both)
{
target.MultiTenancySide |= source.MultiTenancySide;
}
target.IsEnabled = target.IsEnabled || source.IsEnabled;
}
}
#nullable disable

86
aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/Overrides/MergeSettingDefinitionManager.cs

@ -1,86 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Settings;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeSettingDefinitionManager : SettingDefinitionManager
{
public MergeSettingDefinitionManager(
IStaticSettingDefinitionStore staticStore,
IDynamicSettingDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<SettingDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeSetting(staticDefinition, dynamicDefinition);
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<SettingDefinition>> GetAllAsync()
{
var staticSettings = await StaticStore.GetAllAsync();
var dynamicSettings = await DynamicStore.GetAllAsync();
var mergedSettings = new Dictionary<string, SettingDefinition>();
foreach (var staticSetting in staticSettings)
{
mergedSettings[staticSetting.Name] = staticSetting;
}
foreach (var dynamicSetting in dynamicSettings)
{
if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting))
{
MergeSetting(existingSetting, dynamicSetting);
}
else
{
mergedSettings[dynamicSetting.Name] = dynamicSetting;
}
}
return mergedSettings.Values.ToImmutableList();
}
private static void MergeSetting(SettingDefinition target, SettingDefinition source)
{
target.DisplayName = source.DisplayName;
target.Description = source.Description ?? target.Description;
target.DefaultValue = source.DefaultValue ?? target.DefaultValue;
target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients;
target.IsInherited = target.IsInherited || source.IsInherited;
target.IsEncrypted = target.IsEncrypted || source.IsEncrypted;
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
}
}
#nullable disable

104
aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/Overrides/MergeTemplateDefinitionManager.cs

@ -1,104 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.TextTemplating;
namespace Volo.Abp.TextTemplatin;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeTemplateDefinitionManager : TemplateDefinitionManager
{
public MergeTemplateDefinitionManager(
IStaticTemplateDefinitionStore staticStore,
IDynamicTemplateDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<TemplateDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeTemplate(staticDefinition, dynamicDefinition);
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<TemplateDefinition>> GetAllAsync()
{
var staticTemplates = await StaticStore.GetAllAsync();
var dynamicTemplates = await DynamicStore.GetAllAsync();
var mergedTemplates = new Dictionary<string, TemplateDefinition>();
foreach (var staticTemplate in staticTemplates)
{
mergedTemplates[staticTemplate.Name] = staticTemplate;
}
foreach (var dynamicTemplate in dynamicTemplates)
{
if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate))
{
MergeTemplate(existingTemplate, dynamicTemplate);
}
else
{
mergedTemplates[dynamicTemplate.Name] = dynamicTemplate;
}
}
return mergedTemplates.Values.ToImmutableList();
}
private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate)
{
var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName;
var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName;
var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName;
var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout;
var layout = dynamicTemplate.Layout ?? staticTemplate.Layout;
var mergedTemplate = new TemplateDefinition(
staticTemplate.Name,
localizationResourceName,
displayName,
isLayout,
layout,
defaultCultureName
);
foreach (var property in staticTemplate.Properties)
{
mergedTemplate.Properties[property.Key] = property.Value;
}
foreach (var property in dynamicTemplate.Properties)
{
mergedTemplate.Properties[property.Key] = property.Value;
}
if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine))
{
mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine;
}
else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine))
{
mergedTemplate.RenderEngine = staticTemplate.RenderEngine;
}
mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized;
return mergedTemplate;
}
}
#nullable disable

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/AuthServerModule.cs

@ -7,6 +7,7 @@ using LINGYUN.Abp.AspNetCore.Mvc.Wrapper;
using LINGYUN.Abp.AuditLogging.Elasticsearch; using LINGYUN.Abp.AuditLogging.Elasticsearch;
using LINGYUN.Abp.BlobStoring.BlobManagement; using LINGYUN.Abp.BlobStoring.BlobManagement;
using LINGYUN.Abp.Data.DbMigrator; using LINGYUN.Abp.Data.DbMigrator;
using LINGYUN.Abp.Dynamic.Definitions;
using LINGYUN.Abp.Emailing.Platform; using LINGYUN.Abp.Emailing.Platform;
using LINGYUN.Abp.EventBus.CAP; using LINGYUN.Abp.EventBus.CAP;
using LINGYUN.Abp.Exporter.MiniSoftware; using LINGYUN.Abp.Exporter.MiniSoftware;
@ -74,6 +75,7 @@ namespace LINGYUN.Abp.MicroService.AuthServer;
typeof(AbpAspNetCoreMultiTenancyModule), typeof(AbpAspNetCoreMultiTenancyModule),
typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpAspNetCoreMvcWrapperModule),
typeof(AbpAspNetCoreHttpOverridesModule), typeof(AbpAspNetCoreHttpOverridesModule),
typeof(AbpDynamicDefinitionsModule),
typeof(AbpHttpClientIdentityModelWebModule), typeof(AbpHttpClientIdentityModelWebModule),
typeof(AbpExporterMiniSoftwareModule), typeof(AbpExporterMiniSoftwareModule),
typeof(AbpEmailingPlatformModule), typeof(AbpEmailingPlatformModule),

1
aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/LINGYUN.Abp.MicroService.AuthServer.csproj

@ -42,6 +42,7 @@
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.AspNetCore.HttpOverrides\LINGYUN.Abp.AspNetCore.HttpOverrides.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.AspNetCore.HttpOverrides\LINGYUN.Abp.AspNetCore.HttpOverrides.csproj" />
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.Data.DbMigrator\LINGYUN.Abp.Data.DbMigrator.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.Data.DbMigrator\LINGYUN.Abp.Data.DbMigrator.csproj" />
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj" />
<ProjectReference Include="..\..\framework\dynamic-definition\LINGYUN.Abp.Dynamic.Definitions\LINGYUN.Abp.Dynamic.Definitions.csproj" />
<ProjectReference Include="..\..\framework\exporter\LINGYUN.Abp.Exporter.MiniSoftware\LINGYUN.Abp.Exporter.MiniSoftware.csproj" /> <ProjectReference Include="..\..\framework\exporter\LINGYUN.Abp.Exporter.MiniSoftware\LINGYUN.Abp.Exporter.MiniSoftware.csproj" />
<ProjectReference Include="..\..\framework\localization\LINGYUN.Abp.Localization.CultureMap\LINGYUN.Abp.Localization.CultureMap.csproj" /> <ProjectReference Include="..\..\framework\localization\LINGYUN.Abp.Localization.CultureMap\LINGYUN.Abp.Localization.CultureMap.csproj" />
<ProjectReference Include="..\..\framework\logging\LINGYUN.Abp.Serilog.Enrichers.Application\LINGYUN.Abp.Serilog.Enrichers.Application.csproj" /> <ProjectReference Include="..\..\framework\logging\LINGYUN.Abp.Serilog.Enrichers.Application\LINGYUN.Abp.Serilog.Enrichers.Application.csproj" />

277
aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/Overrides/MergeFeatureDefinitionManager.cs

@ -1,277 +0,0 @@
using JetBrains.Annotations;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Features;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeFeatureDefinitionManager : FeatureDefinitionManager
{
public MergeFeatureDefinitionManager(
IStaticFeatureDefinitionStore staticStore,
IDynamicFeatureDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<FeatureDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeFeatureMetadata(staticDefinition, dynamicDefinition);
foreach (var child in dynamicDefinition.Children)
{
MergeChildFeature(staticDefinition, child);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<FeatureDefinition>> GetAllAsync()
{
var staticFeatures = await StaticStore.GetFeaturesAsync();
var dynamicFeatures = await DynamicStore.GetFeaturesAsync();
var mergedFeatures = new Dictionary<string, FeatureDefinition>();
foreach (var staticFeature in staticFeatures)
{
mergedFeatures[staticFeature.Name] = staticFeature;
}
foreach (var dynamicFeature in dynamicFeatures)
{
if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature))
{
MergeFeatureMetadata(existingFeature, dynamicFeature);
foreach (var child in dynamicFeature.Children)
{
MergeChildFeature(existingFeature, child);
}
}
else
{
mergedFeatures[dynamicFeature.Name] = dynamicFeature;
}
}
return mergedFeatures.Values.ToImmutableList();
}
public async override Task<IReadOnlyList<FeatureGroupDefinition>> GetGroupsAsync()
{
var staticGroups = await StaticStore.GetGroupsAsync();
var dynamicGroups = await DynamicStore.GetGroupsAsync();
var mergedGroups = new Dictionary<string, FeatureGroupDefinition>();
foreach (var staticGroup in staticGroups)
{
mergedGroups[staticGroup.Name] = staticGroup;
}
foreach (var dynamicGroup in dynamicGroups)
{
if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup))
{
MergeGroupFeatures(existingGroup, dynamicGroup);
}
else
{
mergedGroups[dynamicGroup.Name] = dynamicGroup;
}
}
return mergedGroups.Values.ToImmutableList();
}
private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source)
{
foreach (var sourceFeature in source.Features)
{
var existingFeature = GetFeatureOrNull(target, sourceFeature.Name);
if (existingFeature == null)
{
var newFeature = target.AddFeature(
sourceFeature.Name,
sourceFeature.DefaultValue,
sourceFeature.DisplayName,
sourceFeature.Description,
sourceFeature.ValueType,
sourceFeature.IsVisibleToClients,
sourceFeature.IsAvailableToHost
);
CopyFeatureDetails(sourceFeature, newFeature);
foreach (var child in sourceFeature.Children)
{
AddChildFeatureRecursively(newFeature, child);
}
}
else
{
MergeFeatureMetadata(existingFeature, sourceFeature);
foreach (var child in sourceFeature.Children)
{
MergeChildFeature(existingFeature, child);
}
}
}
}
private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild)
{
var newChild = parent.CreateChild(
sourceChild.Name,
sourceChild.DefaultValue,
sourceChild.DisplayName,
sourceChild.Description,
sourceChild.ValueType,
sourceChild.IsVisibleToClients,
sourceChild.IsAvailableToHost
);
CopyFeatureDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildFeatureRecursively(newChild, grandchild);
}
}
private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild)
{
var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name);
if (existingChild == null)
{
var newChild = parent.CreateChild(
sourceChild.Name,
sourceChild.DefaultValue,
sourceChild.DisplayName,
sourceChild.Description,
sourceChild.ValueType,
sourceChild.IsVisibleToClients,
sourceChild.IsAvailableToHost
);
CopyFeatureDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildFeatureRecursively(newChild, grandchild);
}
}
else
{
MergeFeatureMetadata(existingChild, sourceChild);
foreach (var grandchild in sourceChild.Children)
{
MergeChildFeature(existingChild, grandchild);
}
}
}
private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target)
{
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.AllowedProviders)
{
if (!target.AllowedProviders.Contains(provider))
{
target.AllowedProviders.Add(provider);
}
}
}
private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source)
{
if (source.DisplayName != null)
{
target.DisplayName = source.DisplayName;
}
if (source.Description != null)
{
target.Description = source.Description;
}
if (source.DefaultValue != null)
{
target.DefaultValue = source.DefaultValue;
}
if (source.ValueType != null)
{
target.ValueType = source.ValueType;
}
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.AllowedProviders)
{
if (!target.AllowedProviders.Contains(provider))
{
target.AllowedProviders.Add(provider);
}
}
target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients;
target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost;
}
public static FeatureDefinition? GetFeatureOrNull(
FeatureGroupDefinition group,
[NotNull] string name)
{
Check.NotNull(name, nameof(name));
return GetFeatureOrNullRecursively(group.Features, name);
}
private static FeatureDefinition? GetFeatureOrNullRecursively(
IReadOnlyList<FeatureDefinition> features,
string name)
{
foreach (var feature in features)
{
if (feature.Name == name)
{
return feature;
}
var childFeature = GetFeatureOrNullRecursively(feature.Children, name);
if (childFeature != null)
{
return childFeature;
}
}
return null;
}
}
#nullable disable

276
aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/Overrides/MergePermissionDefinitionManager.cs

@ -1,276 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.Authorization.Permissions;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergePermissionDefinitionManager : PermissionDefinitionManager
{
private readonly IStaticPermissionDefinitionStore _staticStore;
private readonly IDynamicPermissionDefinitionStore _dynamicStore;
public MergePermissionDefinitionManager(
IStaticPermissionDefinitionStore staticStore,
IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore)
{
_staticStore = staticStore;
_dynamicStore = dynamicStore;
}
public async override Task<PermissionDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await _staticStore.GetOrNullAsync(name);
var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergePermissionMetadata(staticDefinition, dynamicDefinition);
foreach (var grandchild in dynamicDefinition.Children)
{
MergeChildPermissions(staticDefinition, grandchild);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<PermissionDefinition?> GetResourcePermissionOrNullAsync(string resourceName, string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name);
var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergePermissionMetadata(staticDefinition, dynamicDefinition);
foreach (var grandchild in dynamicDefinition.Children)
{
MergeChildPermissions(staticDefinition, grandchild);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<PermissionDefinition>> GetPermissionsAsync()
{
var staticPermissions = await _staticStore.GetPermissionsAsync();
var dynamicPermissions = await _dynamicStore.GetPermissionsAsync();
return MergePermissions(staticPermissions, dynamicPermissions);
}
public async override Task<IReadOnlyList<PermissionDefinition>> GetResourcePermissionsAsync()
{
var staticPermissions = await _staticStore.GetResourcePermissionsAsync();
var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync();
return MergePermissions(staticPermissions, dynamicPermissions);
}
public async override Task<IReadOnlyList<PermissionGroupDefinition>> GetGroupsAsync()
{
var staticGroups = await _staticStore.GetGroupsAsync();
var dynamicGroups = await _dynamicStore.GetGroupsAsync();
var mergedGroups = new Dictionary<string, PermissionGroupDefinition>();
foreach (var staticGroup in staticGroups)
{
mergedGroups[staticGroup.Name] = staticGroup;
}
foreach (var dynamicGroup in dynamicGroups)
{
if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup))
{
MergeGroupPermissions(existingGroup, dynamicGroup);
}
else
{
mergedGroups[dynamicGroup.Name] = dynamicGroup;
}
}
return mergedGroups.Values.ToImmutableList();
}
private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source)
{
foreach (var sourcePermission in source.Permissions)
{
var existingPermission = target.GetPermissionOrNull(sourcePermission.Name);
if (existingPermission == null)
{
var newPermission = target.AddPermission(
sourcePermission.Name,
sourcePermission.DisplayName,
sourcePermission.MultiTenancySide,
sourcePermission.IsEnabled
);
CopyPermissionDetails(sourcePermission, newPermission);
foreach (var child in sourcePermission.Children)
{
AddChildPermissionRecursively(newPermission, child);
}
}
else
{
MergePermissionMetadata(existingPermission, sourcePermission);
foreach (var sourceChild in sourcePermission.Children)
{
MergeChildPermissions(existingPermission, sourceChild);
}
}
}
}
private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild)
{
var newChild = parent.AddChild(
sourceChild.Name,
sourceChild.DisplayName,
sourceChild.MultiTenancySide,
sourceChild.IsEnabled
);
CopyPermissionDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildPermissionRecursively(newChild, grandchild);
}
}
private static IReadOnlyList<PermissionDefinition> MergePermissions(IReadOnlyList<PermissionDefinition> staticPermissions, IReadOnlyList<PermissionDefinition> dynamicPermissions)
{
var mergedPermissions = new Dictionary<string, PermissionDefinition>();
foreach (var staticFeature in staticPermissions)
{
mergedPermissions[staticFeature.Name] = staticFeature;
}
foreach (var dynamicPermission in dynamicPermissions)
{
if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission))
{
MergePermissionMetadata(existingPermission, dynamicPermission);
foreach (var sourceChild in dynamicPermission.Children)
{
MergeChildPermissions(existingPermission, sourceChild);
}
}
else
{
mergedPermissions[dynamicPermission.Name] = dynamicPermission;
}
}
return mergedPermissions.Values.ToImmutableList();
}
private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild)
{
var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name);
if (existingChild == null)
{
var newChild = parent.AddChild(
sourceChild.Name,
sourceChild.DisplayName,
sourceChild.MultiTenancySide,
sourceChild.IsEnabled
);
CopyPermissionDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildPermissionRecursively(newChild, grandchild);
}
}
else
{
MergePermissionMetadata(existingChild, sourceChild);
foreach (var grandchild in sourceChild.Children)
{
MergeChildPermissions(existingChild, grandchild);
}
}
}
private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target)
{
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
foreach (var checker in source.StateCheckers)
{
if (!target.StateCheckers.Contains(checker))
{
target.StateCheckers.Add(checker);
}
}
}
private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source)
{
target.DisplayName = source.DisplayName;
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
foreach (var checker in source.StateCheckers)
{
if (!target.StateCheckers.Contains(checker))
{
target.StateCheckers.Add(checker);
}
}
if (source.MultiTenancySide != MultiTenancySides.Both)
{
target.MultiTenancySide |= source.MultiTenancySide;
}
target.IsEnabled = target.IsEnabled || source.IsEnabled;
}
}
#nullable disable

86
aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/Overrides/MergeSettingDefinitionManager.cs

@ -1,86 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Settings;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeSettingDefinitionManager : SettingDefinitionManager
{
public MergeSettingDefinitionManager(
IStaticSettingDefinitionStore staticStore,
IDynamicSettingDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<SettingDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeSetting(staticDefinition, dynamicDefinition);
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<SettingDefinition>> GetAllAsync()
{
var staticSettings = await StaticStore.GetAllAsync();
var dynamicSettings = await DynamicStore.GetAllAsync();
var mergedSettings = new Dictionary<string, SettingDefinition>();
foreach (var staticSetting in staticSettings)
{
mergedSettings[staticSetting.Name] = staticSetting;
}
foreach (var dynamicSetting in dynamicSettings)
{
if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting))
{
MergeSetting(existingSetting, dynamicSetting);
}
else
{
mergedSettings[dynamicSetting.Name] = dynamicSetting;
}
}
return mergedSettings.Values.ToImmutableList();
}
private static void MergeSetting(SettingDefinition target, SettingDefinition source)
{
target.DisplayName = source.DisplayName;
target.Description = source.Description ?? target.Description;
target.DefaultValue = source.DefaultValue ?? target.DefaultValue;
target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients;
target.IsInherited = target.IsInherited || source.IsInherited;
target.IsEncrypted = target.IsEncrypted || source.IsEncrypted;
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
}
}
#nullable disable

104
aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/Overrides/MergeTemplateDefinitionManager.cs

@ -1,104 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.TextTemplating;
namespace Volo.Abp.TextTemplatin;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeTemplateDefinitionManager : TemplateDefinitionManager
{
public MergeTemplateDefinitionManager(
IStaticTemplateDefinitionStore staticStore,
IDynamicTemplateDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<TemplateDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeTemplate(staticDefinition, dynamicDefinition);
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<TemplateDefinition>> GetAllAsync()
{
var staticTemplates = await StaticStore.GetAllAsync();
var dynamicTemplates = await DynamicStore.GetAllAsync();
var mergedTemplates = new Dictionary<string, TemplateDefinition>();
foreach (var staticTemplate in staticTemplates)
{
mergedTemplates[staticTemplate.Name] = staticTemplate;
}
foreach (var dynamicTemplate in dynamicTemplates)
{
if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate))
{
MergeTemplate(existingTemplate, dynamicTemplate);
}
else
{
mergedTemplates[dynamicTemplate.Name] = dynamicTemplate;
}
}
return mergedTemplates.Values.ToImmutableList();
}
private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate)
{
var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName;
var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName;
var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName;
var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout;
var layout = dynamicTemplate.Layout ?? staticTemplate.Layout;
var mergedTemplate = new TemplateDefinition(
staticTemplate.Name,
localizationResourceName,
displayName,
isLayout,
layout,
defaultCultureName
);
foreach (var property in staticTemplate.Properties)
{
mergedTemplate.Properties[property.Key] = property.Value;
}
foreach (var property in dynamicTemplate.Properties)
{
mergedTemplate.Properties[property.Key] = property.Value;
}
if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine))
{
mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine;
}
else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine))
{
mergedTemplate.RenderEngine = staticTemplate.RenderEngine;
}
mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized;
return mergedTemplate;
}
}
#nullable disable

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/IdentityServiceModule.cs

@ -5,6 +5,7 @@ using LINGYUN.Abp.AuditLogging.Elasticsearch;
using LINGYUN.Abp.Authorization.OrganizationUnits; using LINGYUN.Abp.Authorization.OrganizationUnits;
using LINGYUN.Abp.BlobStoring.BlobManagement; using LINGYUN.Abp.BlobStoring.BlobManagement;
using LINGYUN.Abp.Claims.Mapping; using LINGYUN.Abp.Claims.Mapping;
using LINGYUN.Abp.Dynamic.Definitions;
using LINGYUN.Abp.Emailing.Platform; using LINGYUN.Abp.Emailing.Platform;
using LINGYUN.Abp.EventBus.CAP; using LINGYUN.Abp.EventBus.CAP;
using LINGYUN.Abp.ExceptionHandling.Emailing; using LINGYUN.Abp.ExceptionHandling.Emailing;
@ -81,6 +82,7 @@ namespace LINGYUN.Abp.MicroService.IdentityService;
typeof(AbpIdentitySessionAspNetCoreModule), typeof(AbpIdentitySessionAspNetCoreModule),
typeof(AbpAspNetCoreHttpOverridesModule), typeof(AbpAspNetCoreHttpOverridesModule),
typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpAspNetCoreMvcWrapperModule),
typeof(AbpDynamicDefinitionsModule),
typeof(AbpExporterMiniSoftwareModule), typeof(AbpExporterMiniSoftwareModule),
typeof(AbpClaimsMappingModule), typeof(AbpClaimsMappingModule),
typeof(AbpSwashbuckleModule), typeof(AbpSwashbuckleModule),

1
aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/LINGYUN.Abp.MicroService.IdentityService.csproj

@ -48,6 +48,7 @@
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.AspNetCore.HttpOverrides\LINGYUN.Abp.AspNetCore.HttpOverrides.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.AspNetCore.HttpOverrides\LINGYUN.Abp.AspNetCore.HttpOverrides.csproj" />
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj" />
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.ExceptionHandling.Emailing\LINGYUN.Abp.ExceptionHandling.Emailing.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.ExceptionHandling.Emailing\LINGYUN.Abp.ExceptionHandling.Emailing.csproj" />
<ProjectReference Include="..\..\framework\dynamic-definition\LINGYUN.Abp.Dynamic.Definitions\LINGYUN.Abp.Dynamic.Definitions.csproj" />
<ProjectReference Include="..\..\framework\exporter\LINGYUN.Abp.Exporter.MiniSoftware\LINGYUN.Abp.Exporter.MiniSoftware.csproj" /> <ProjectReference Include="..\..\framework\exporter\LINGYUN.Abp.Exporter.MiniSoftware\LINGYUN.Abp.Exporter.MiniSoftware.csproj" />
<ProjectReference Include="..\..\framework\localization\LINGYUN.Abp.Localization.CultureMap\LINGYUN.Abp.Localization.CultureMap.csproj" /> <ProjectReference Include="..\..\framework\localization\LINGYUN.Abp.Localization.CultureMap\LINGYUN.Abp.Localization.CultureMap.csproj" />
<ProjectReference Include="..\..\framework\logging\LINGYUN.Abp.Serilog.Enrichers.Application\LINGYUN.Abp.Serilog.Enrichers.Application.csproj" /> <ProjectReference Include="..\..\framework\logging\LINGYUN.Abp.Serilog.Enrichers.Application\LINGYUN.Abp.Serilog.Enrichers.Application.csproj" />

277
aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/Overrides/MergeFeatureDefinitionManager.cs

@ -1,277 +0,0 @@
using JetBrains.Annotations;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Features;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeFeatureDefinitionManager : FeatureDefinitionManager
{
public MergeFeatureDefinitionManager(
IStaticFeatureDefinitionStore staticStore,
IDynamicFeatureDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<FeatureDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeFeatureMetadata(staticDefinition, dynamicDefinition);
foreach (var child in dynamicDefinition.Children)
{
MergeChildFeature(staticDefinition, child);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<FeatureDefinition>> GetAllAsync()
{
var staticFeatures = await StaticStore.GetFeaturesAsync();
var dynamicFeatures = await DynamicStore.GetFeaturesAsync();
var mergedFeatures = new Dictionary<string, FeatureDefinition>();
foreach (var staticFeature in staticFeatures)
{
mergedFeatures[staticFeature.Name] = staticFeature;
}
foreach (var dynamicFeature in dynamicFeatures)
{
if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature))
{
MergeFeatureMetadata(existingFeature, dynamicFeature);
foreach (var child in dynamicFeature.Children)
{
MergeChildFeature(existingFeature, child);
}
}
else
{
mergedFeatures[dynamicFeature.Name] = dynamicFeature;
}
}
return mergedFeatures.Values.ToImmutableList();
}
public async override Task<IReadOnlyList<FeatureGroupDefinition>> GetGroupsAsync()
{
var staticGroups = await StaticStore.GetGroupsAsync();
var dynamicGroups = await DynamicStore.GetGroupsAsync();
var mergedGroups = new Dictionary<string, FeatureGroupDefinition>();
foreach (var staticGroup in staticGroups)
{
mergedGroups[staticGroup.Name] = staticGroup;
}
foreach (var dynamicGroup in dynamicGroups)
{
if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup))
{
MergeGroupFeatures(existingGroup, dynamicGroup);
}
else
{
mergedGroups[dynamicGroup.Name] = dynamicGroup;
}
}
return mergedGroups.Values.ToImmutableList();
}
private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source)
{
foreach (var sourceFeature in source.Features)
{
var existingFeature = GetFeatureOrNull(target, sourceFeature.Name);
if (existingFeature == null)
{
var newFeature = target.AddFeature(
sourceFeature.Name,
sourceFeature.DefaultValue,
sourceFeature.DisplayName,
sourceFeature.Description,
sourceFeature.ValueType,
sourceFeature.IsVisibleToClients,
sourceFeature.IsAvailableToHost
);
CopyFeatureDetails(sourceFeature, newFeature);
foreach (var child in sourceFeature.Children)
{
AddChildFeatureRecursively(newFeature, child);
}
}
else
{
MergeFeatureMetadata(existingFeature, sourceFeature);
foreach (var child in sourceFeature.Children)
{
MergeChildFeature(existingFeature, child);
}
}
}
}
private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild)
{
var newChild = parent.CreateChild(
sourceChild.Name,
sourceChild.DefaultValue,
sourceChild.DisplayName,
sourceChild.Description,
sourceChild.ValueType,
sourceChild.IsVisibleToClients,
sourceChild.IsAvailableToHost
);
CopyFeatureDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildFeatureRecursively(newChild, grandchild);
}
}
private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild)
{
var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name);
if (existingChild == null)
{
var newChild = parent.CreateChild(
sourceChild.Name,
sourceChild.DefaultValue,
sourceChild.DisplayName,
sourceChild.Description,
sourceChild.ValueType,
sourceChild.IsVisibleToClients,
sourceChild.IsAvailableToHost
);
CopyFeatureDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildFeatureRecursively(newChild, grandchild);
}
}
else
{
MergeFeatureMetadata(existingChild, sourceChild);
foreach (var grandchild in sourceChild.Children)
{
MergeChildFeature(existingChild, grandchild);
}
}
}
private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target)
{
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.AllowedProviders)
{
if (!target.AllowedProviders.Contains(provider))
{
target.AllowedProviders.Add(provider);
}
}
}
private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source)
{
if (source.DisplayName != null)
{
target.DisplayName = source.DisplayName;
}
if (source.Description != null)
{
target.Description = source.Description;
}
if (source.DefaultValue != null)
{
target.DefaultValue = source.DefaultValue;
}
if (source.ValueType != null)
{
target.ValueType = source.ValueType;
}
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.AllowedProviders)
{
if (!target.AllowedProviders.Contains(provider))
{
target.AllowedProviders.Add(provider);
}
}
target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients;
target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost;
}
public static FeatureDefinition? GetFeatureOrNull(
FeatureGroupDefinition group,
[NotNull] string name)
{
Check.NotNull(name, nameof(name));
return GetFeatureOrNullRecursively(group.Features, name);
}
private static FeatureDefinition? GetFeatureOrNullRecursively(
IReadOnlyList<FeatureDefinition> features,
string name)
{
foreach (var feature in features)
{
if (feature.Name == name)
{
return feature;
}
var childFeature = GetFeatureOrNullRecursively(feature.Children, name);
if (childFeature != null)
{
return childFeature;
}
}
return null;
}
}
#nullable disable

276
aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/Overrides/MergePermissionDefinitionManager.cs

@ -1,276 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.Authorization.Permissions;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergePermissionDefinitionManager : PermissionDefinitionManager
{
private readonly IStaticPermissionDefinitionStore _staticStore;
private readonly IDynamicPermissionDefinitionStore _dynamicStore;
public MergePermissionDefinitionManager(
IStaticPermissionDefinitionStore staticStore,
IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore)
{
_staticStore = staticStore;
_dynamicStore = dynamicStore;
}
public async override Task<PermissionDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await _staticStore.GetOrNullAsync(name);
var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergePermissionMetadata(staticDefinition, dynamicDefinition);
foreach (var grandchild in dynamicDefinition.Children)
{
MergeChildPermissions(staticDefinition, grandchild);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<PermissionDefinition?> GetResourcePermissionOrNullAsync(string resourceName, string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name);
var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergePermissionMetadata(staticDefinition, dynamicDefinition);
foreach (var grandchild in dynamicDefinition.Children)
{
MergeChildPermissions(staticDefinition, grandchild);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<PermissionDefinition>> GetPermissionsAsync()
{
var staticPermissions = await _staticStore.GetPermissionsAsync();
var dynamicPermissions = await _dynamicStore.GetPermissionsAsync();
return MergePermissions(staticPermissions, dynamicPermissions);
}
public async override Task<IReadOnlyList<PermissionDefinition>> GetResourcePermissionsAsync()
{
var staticPermissions = await _staticStore.GetResourcePermissionsAsync();
var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync();
return MergePermissions(staticPermissions, dynamicPermissions);
}
public async override Task<IReadOnlyList<PermissionGroupDefinition>> GetGroupsAsync()
{
var staticGroups = await _staticStore.GetGroupsAsync();
var dynamicGroups = await _dynamicStore.GetGroupsAsync();
var mergedGroups = new Dictionary<string, PermissionGroupDefinition>();
foreach (var staticGroup in staticGroups)
{
mergedGroups[staticGroup.Name] = staticGroup;
}
foreach (var dynamicGroup in dynamicGroups)
{
if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup))
{
MergeGroupPermissions(existingGroup, dynamicGroup);
}
else
{
mergedGroups[dynamicGroup.Name] = dynamicGroup;
}
}
return mergedGroups.Values.ToImmutableList();
}
private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source)
{
foreach (var sourcePermission in source.Permissions)
{
var existingPermission = target.GetPermissionOrNull(sourcePermission.Name);
if (existingPermission == null)
{
var newPermission = target.AddPermission(
sourcePermission.Name,
sourcePermission.DisplayName,
sourcePermission.MultiTenancySide,
sourcePermission.IsEnabled
);
CopyPermissionDetails(sourcePermission, newPermission);
foreach (var child in sourcePermission.Children)
{
AddChildPermissionRecursively(newPermission, child);
}
}
else
{
MergePermissionMetadata(existingPermission, sourcePermission);
foreach (var sourceChild in sourcePermission.Children)
{
MergeChildPermissions(existingPermission, sourceChild);
}
}
}
}
private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild)
{
var newChild = parent.AddChild(
sourceChild.Name,
sourceChild.DisplayName,
sourceChild.MultiTenancySide,
sourceChild.IsEnabled
);
CopyPermissionDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildPermissionRecursively(newChild, grandchild);
}
}
private static IReadOnlyList<PermissionDefinition> MergePermissions(IReadOnlyList<PermissionDefinition> staticPermissions, IReadOnlyList<PermissionDefinition> dynamicPermissions)
{
var mergedPermissions = new Dictionary<string, PermissionDefinition>();
foreach (var staticFeature in staticPermissions)
{
mergedPermissions[staticFeature.Name] = staticFeature;
}
foreach (var dynamicPermission in dynamicPermissions)
{
if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission))
{
MergePermissionMetadata(existingPermission, dynamicPermission);
foreach (var sourceChild in dynamicPermission.Children)
{
MergeChildPermissions(existingPermission, sourceChild);
}
}
else
{
mergedPermissions[dynamicPermission.Name] = dynamicPermission;
}
}
return mergedPermissions.Values.ToImmutableList();
}
private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild)
{
var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name);
if (existingChild == null)
{
var newChild = parent.AddChild(
sourceChild.Name,
sourceChild.DisplayName,
sourceChild.MultiTenancySide,
sourceChild.IsEnabled
);
CopyPermissionDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildPermissionRecursively(newChild, grandchild);
}
}
else
{
MergePermissionMetadata(existingChild, sourceChild);
foreach (var grandchild in sourceChild.Children)
{
MergeChildPermissions(existingChild, grandchild);
}
}
}
private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target)
{
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
foreach (var checker in source.StateCheckers)
{
if (!target.StateCheckers.Contains(checker))
{
target.StateCheckers.Add(checker);
}
}
}
private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source)
{
target.DisplayName = source.DisplayName;
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
foreach (var checker in source.StateCheckers)
{
if (!target.StateCheckers.Contains(checker))
{
target.StateCheckers.Add(checker);
}
}
if (source.MultiTenancySide != MultiTenancySides.Both)
{
target.MultiTenancySide |= source.MultiTenancySide;
}
target.IsEnabled = target.IsEnabled || source.IsEnabled;
}
}
#nullable disable

86
aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/Overrides/MergeSettingDefinitionManager.cs

@ -1,86 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Settings;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeSettingDefinitionManager : SettingDefinitionManager
{
public MergeSettingDefinitionManager(
IStaticSettingDefinitionStore staticStore,
IDynamicSettingDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<SettingDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeSetting(staticDefinition, dynamicDefinition);
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<SettingDefinition>> GetAllAsync()
{
var staticSettings = await StaticStore.GetAllAsync();
var dynamicSettings = await DynamicStore.GetAllAsync();
var mergedSettings = new Dictionary<string, SettingDefinition>();
foreach (var staticSetting in staticSettings)
{
mergedSettings[staticSetting.Name] = staticSetting;
}
foreach (var dynamicSetting in dynamicSettings)
{
if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting))
{
MergeSetting(existingSetting, dynamicSetting);
}
else
{
mergedSettings[dynamicSetting.Name] = dynamicSetting;
}
}
return mergedSettings.Values.ToImmutableList();
}
private static void MergeSetting(SettingDefinition target, SettingDefinition source)
{
target.DisplayName = source.DisplayName;
target.Description = source.Description ?? target.Description;
target.DefaultValue = source.DefaultValue ?? target.DefaultValue;
target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients;
target.IsInherited = target.IsInherited || source.IsInherited;
target.IsEncrypted = target.IsEncrypted || source.IsEncrypted;
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
}
}
#nullable disable

104
aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/Overrides/MergeTemplateDefinitionManager.cs

@ -1,104 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.TextTemplating;
namespace Volo.Abp.TextTemplatin;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeTemplateDefinitionManager : TemplateDefinitionManager
{
public MergeTemplateDefinitionManager(
IStaticTemplateDefinitionStore staticStore,
IDynamicTemplateDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<TemplateDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeTemplate(staticDefinition, dynamicDefinition);
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<TemplateDefinition>> GetAllAsync()
{
var staticTemplates = await StaticStore.GetAllAsync();
var dynamicTemplates = await DynamicStore.GetAllAsync();
var mergedTemplates = new Dictionary<string, TemplateDefinition>();
foreach (var staticTemplate in staticTemplates)
{
mergedTemplates[staticTemplate.Name] = staticTemplate;
}
foreach (var dynamicTemplate in dynamicTemplates)
{
if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate))
{
MergeTemplate(existingTemplate, dynamicTemplate);
}
else
{
mergedTemplates[dynamicTemplate.Name] = dynamicTemplate;
}
}
return mergedTemplates.Values.ToImmutableList();
}
private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate)
{
var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName;
var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName;
var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName;
var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout;
var layout = dynamicTemplate.Layout ?? staticTemplate.Layout;
var mergedTemplate = new TemplateDefinition(
staticTemplate.Name,
localizationResourceName,
displayName,
isLayout,
layout,
defaultCultureName
);
foreach (var property in staticTemplate.Properties)
{
mergedTemplate.Properties[property.Key] = property.Value;
}
foreach (var property in dynamicTemplate.Properties)
{
mergedTemplate.Properties[property.Key] = property.Value;
}
if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine))
{
mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine;
}
else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine))
{
mergedTemplate.RenderEngine = staticTemplate.RenderEngine;
}
mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized;
return mergedTemplate;
}
}
#nullable disable

1
aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/LINGYUN.Abp.MicroService.LocalizationService.csproj

@ -42,6 +42,7 @@
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.Data.DbMigrator\LINGYUN.Abp.Data.DbMigrator.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.Data.DbMigrator\LINGYUN.Abp.Data.DbMigrator.csproj" />
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj" />
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.ExceptionHandling.Emailing\LINGYUN.Abp.ExceptionHandling.Emailing.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.ExceptionHandling.Emailing\LINGYUN.Abp.ExceptionHandling.Emailing.csproj" />
<ProjectReference Include="..\..\framework\dynamic-definition\LINGYUN.Abp.Dynamic.Definitions\LINGYUN.Abp.Dynamic.Definitions.csproj" />
<ProjectReference Include="..\..\framework\localization\LINGYUN.Abp.Localization.CultureMap\LINGYUN.Abp.Localization.CultureMap.csproj" /> <ProjectReference Include="..\..\framework\localization\LINGYUN.Abp.Localization.CultureMap\LINGYUN.Abp.Localization.CultureMap.csproj" />
<ProjectReference Include="..\..\framework\logging\LINGYUN.Abp.Serilog.Enrichers.Application\LINGYUN.Abp.Serilog.Enrichers.Application.csproj" /> <ProjectReference Include="..\..\framework\logging\LINGYUN.Abp.Serilog.Enrichers.Application\LINGYUN.Abp.Serilog.Enrichers.Application.csproj" />
<ProjectReference Include="..\..\framework\logging\LINGYUN.Abp.Serilog.Enrichers.UniqueId\LINGYUN.Abp.Serilog.Enrichers.UniqueId.csproj" /> <ProjectReference Include="..\..\framework\logging\LINGYUN.Abp.Serilog.Enrichers.UniqueId\LINGYUN.Abp.Serilog.Enrichers.UniqueId.csproj" />

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/LocalizationServiceModule.cs

@ -4,6 +4,7 @@ using LINGYUN.Abp.AuditLogging.Elasticsearch;
using LINGYUN.Abp.Authorization.OrganizationUnits; using LINGYUN.Abp.Authorization.OrganizationUnits;
using LINGYUN.Abp.Claims.Mapping; using LINGYUN.Abp.Claims.Mapping;
using LINGYUN.Abp.Data.DbMigrator; using LINGYUN.Abp.Data.DbMigrator;
using LINGYUN.Abp.Dynamic.Definitions;
using LINGYUN.Abp.Emailing.Platform; using LINGYUN.Abp.Emailing.Platform;
using LINGYUN.Abp.EventBus.CAP; using LINGYUN.Abp.EventBus.CAP;
using LINGYUN.Abp.Identity.Session.AspNetCore; using LINGYUN.Abp.Identity.Session.AspNetCore;
@ -57,6 +58,7 @@ namespace LINGYUN.Abp.MicroService.LocalizationService;
typeof(AbpEmailingPlatformModule), typeof(AbpEmailingPlatformModule),
typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpAspNetCoreMvcWrapperModule),
typeof(AbpAspNetCoreHttpOverridesModule), typeof(AbpAspNetCoreHttpOverridesModule),
typeof(AbpDynamicDefinitionsModule),
typeof(AbpClaimsMappingModule), typeof(AbpClaimsMappingModule),
typeof(AbpSwashbuckleModule), typeof(AbpSwashbuckleModule),
typeof(AbpAutofacModule) typeof(AbpAutofacModule)

277
aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/Overrides/MergeFeatureDefinitionManager.cs

@ -1,277 +0,0 @@
using JetBrains.Annotations;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Features;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeFeatureDefinitionManager : FeatureDefinitionManager
{
public MergeFeatureDefinitionManager(
IStaticFeatureDefinitionStore staticStore,
IDynamicFeatureDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<FeatureDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeFeatureMetadata(staticDefinition, dynamicDefinition);
foreach (var child in dynamicDefinition.Children)
{
MergeChildFeature(staticDefinition, child);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<FeatureDefinition>> GetAllAsync()
{
var staticFeatures = await StaticStore.GetFeaturesAsync();
var dynamicFeatures = await DynamicStore.GetFeaturesAsync();
var mergedFeatures = new Dictionary<string, FeatureDefinition>();
foreach (var staticFeature in staticFeatures)
{
mergedFeatures[staticFeature.Name] = staticFeature;
}
foreach (var dynamicFeature in dynamicFeatures)
{
if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature))
{
MergeFeatureMetadata(existingFeature, dynamicFeature);
foreach (var child in dynamicFeature.Children)
{
MergeChildFeature(existingFeature, child);
}
}
else
{
mergedFeatures[dynamicFeature.Name] = dynamicFeature;
}
}
return mergedFeatures.Values.ToImmutableList();
}
public async override Task<IReadOnlyList<FeatureGroupDefinition>> GetGroupsAsync()
{
var staticGroups = await StaticStore.GetGroupsAsync();
var dynamicGroups = await DynamicStore.GetGroupsAsync();
var mergedGroups = new Dictionary<string, FeatureGroupDefinition>();
foreach (var staticGroup in staticGroups)
{
mergedGroups[staticGroup.Name] = staticGroup;
}
foreach (var dynamicGroup in dynamicGroups)
{
if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup))
{
MergeGroupFeatures(existingGroup, dynamicGroup);
}
else
{
mergedGroups[dynamicGroup.Name] = dynamicGroup;
}
}
return mergedGroups.Values.ToImmutableList();
}
private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source)
{
foreach (var sourceFeature in source.Features)
{
var existingFeature = GetFeatureOrNull(target, sourceFeature.Name);
if (existingFeature == null)
{
var newFeature = target.AddFeature(
sourceFeature.Name,
sourceFeature.DefaultValue,
sourceFeature.DisplayName,
sourceFeature.Description,
sourceFeature.ValueType,
sourceFeature.IsVisibleToClients,
sourceFeature.IsAvailableToHost
);
CopyFeatureDetails(sourceFeature, newFeature);
foreach (var child in sourceFeature.Children)
{
AddChildFeatureRecursively(newFeature, child);
}
}
else
{
MergeFeatureMetadata(existingFeature, sourceFeature);
foreach (var child in sourceFeature.Children)
{
MergeChildFeature(existingFeature, child);
}
}
}
}
private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild)
{
var newChild = parent.CreateChild(
sourceChild.Name,
sourceChild.DefaultValue,
sourceChild.DisplayName,
sourceChild.Description,
sourceChild.ValueType,
sourceChild.IsVisibleToClients,
sourceChild.IsAvailableToHost
);
CopyFeatureDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildFeatureRecursively(newChild, grandchild);
}
}
private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild)
{
var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name);
if (existingChild == null)
{
var newChild = parent.CreateChild(
sourceChild.Name,
sourceChild.DefaultValue,
sourceChild.DisplayName,
sourceChild.Description,
sourceChild.ValueType,
sourceChild.IsVisibleToClients,
sourceChild.IsAvailableToHost
);
CopyFeatureDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildFeatureRecursively(newChild, grandchild);
}
}
else
{
MergeFeatureMetadata(existingChild, sourceChild);
foreach (var grandchild in sourceChild.Children)
{
MergeChildFeature(existingChild, grandchild);
}
}
}
private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target)
{
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.AllowedProviders)
{
if (!target.AllowedProviders.Contains(provider))
{
target.AllowedProviders.Add(provider);
}
}
}
private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source)
{
if (source.DisplayName != null)
{
target.DisplayName = source.DisplayName;
}
if (source.Description != null)
{
target.Description = source.Description;
}
if (source.DefaultValue != null)
{
target.DefaultValue = source.DefaultValue;
}
if (source.ValueType != null)
{
target.ValueType = source.ValueType;
}
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.AllowedProviders)
{
if (!target.AllowedProviders.Contains(provider))
{
target.AllowedProviders.Add(provider);
}
}
target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients;
target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost;
}
public static FeatureDefinition? GetFeatureOrNull(
FeatureGroupDefinition group,
[NotNull] string name)
{
Check.NotNull(name, nameof(name));
return GetFeatureOrNullRecursively(group.Features, name);
}
private static FeatureDefinition? GetFeatureOrNullRecursively(
IReadOnlyList<FeatureDefinition> features,
string name)
{
foreach (var feature in features)
{
if (feature.Name == name)
{
return feature;
}
var childFeature = GetFeatureOrNullRecursively(feature.Children, name);
if (childFeature != null)
{
return childFeature;
}
}
return null;
}
}
#nullable disable

276
aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/Overrides/MergePermissionDefinitionManager.cs

@ -1,276 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.Authorization.Permissions;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergePermissionDefinitionManager : PermissionDefinitionManager
{
private readonly IStaticPermissionDefinitionStore _staticStore;
private readonly IDynamicPermissionDefinitionStore _dynamicStore;
public MergePermissionDefinitionManager(
IStaticPermissionDefinitionStore staticStore,
IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore)
{
_staticStore = staticStore;
_dynamicStore = dynamicStore;
}
public async override Task<PermissionDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await _staticStore.GetOrNullAsync(name);
var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergePermissionMetadata(staticDefinition, dynamicDefinition);
foreach (var grandchild in dynamicDefinition.Children)
{
MergeChildPermissions(staticDefinition, grandchild);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<PermissionDefinition?> GetResourcePermissionOrNullAsync(string resourceName, string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name);
var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergePermissionMetadata(staticDefinition, dynamicDefinition);
foreach (var grandchild in dynamicDefinition.Children)
{
MergeChildPermissions(staticDefinition, grandchild);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<PermissionDefinition>> GetPermissionsAsync()
{
var staticPermissions = await _staticStore.GetPermissionsAsync();
var dynamicPermissions = await _dynamicStore.GetPermissionsAsync();
return MergePermissions(staticPermissions, dynamicPermissions);
}
public async override Task<IReadOnlyList<PermissionDefinition>> GetResourcePermissionsAsync()
{
var staticPermissions = await _staticStore.GetResourcePermissionsAsync();
var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync();
return MergePermissions(staticPermissions, dynamicPermissions);
}
public async override Task<IReadOnlyList<PermissionGroupDefinition>> GetGroupsAsync()
{
var staticGroups = await _staticStore.GetGroupsAsync();
var dynamicGroups = await _dynamicStore.GetGroupsAsync();
var mergedGroups = new Dictionary<string, PermissionGroupDefinition>();
foreach (var staticGroup in staticGroups)
{
mergedGroups[staticGroup.Name] = staticGroup;
}
foreach (var dynamicGroup in dynamicGroups)
{
if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup))
{
MergeGroupPermissions(existingGroup, dynamicGroup);
}
else
{
mergedGroups[dynamicGroup.Name] = dynamicGroup;
}
}
return mergedGroups.Values.ToImmutableList();
}
private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source)
{
foreach (var sourcePermission in source.Permissions)
{
var existingPermission = target.GetPermissionOrNull(sourcePermission.Name);
if (existingPermission == null)
{
var newPermission = target.AddPermission(
sourcePermission.Name,
sourcePermission.DisplayName,
sourcePermission.MultiTenancySide,
sourcePermission.IsEnabled
);
CopyPermissionDetails(sourcePermission, newPermission);
foreach (var child in sourcePermission.Children)
{
AddChildPermissionRecursively(newPermission, child);
}
}
else
{
MergePermissionMetadata(existingPermission, sourcePermission);
foreach (var sourceChild in sourcePermission.Children)
{
MergeChildPermissions(existingPermission, sourceChild);
}
}
}
}
private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild)
{
var newChild = parent.AddChild(
sourceChild.Name,
sourceChild.DisplayName,
sourceChild.MultiTenancySide,
sourceChild.IsEnabled
);
CopyPermissionDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildPermissionRecursively(newChild, grandchild);
}
}
private static IReadOnlyList<PermissionDefinition> MergePermissions(IReadOnlyList<PermissionDefinition> staticPermissions, IReadOnlyList<PermissionDefinition> dynamicPermissions)
{
var mergedPermissions = new Dictionary<string, PermissionDefinition>();
foreach (var staticFeature in staticPermissions)
{
mergedPermissions[staticFeature.Name] = staticFeature;
}
foreach (var dynamicPermission in dynamicPermissions)
{
if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission))
{
MergePermissionMetadata(existingPermission, dynamicPermission);
foreach (var sourceChild in dynamicPermission.Children)
{
MergeChildPermissions(existingPermission, sourceChild);
}
}
else
{
mergedPermissions[dynamicPermission.Name] = dynamicPermission;
}
}
return mergedPermissions.Values.ToImmutableList();
}
private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild)
{
var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name);
if (existingChild == null)
{
var newChild = parent.AddChild(
sourceChild.Name,
sourceChild.DisplayName,
sourceChild.MultiTenancySide,
sourceChild.IsEnabled
);
CopyPermissionDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildPermissionRecursively(newChild, grandchild);
}
}
else
{
MergePermissionMetadata(existingChild, sourceChild);
foreach (var grandchild in sourceChild.Children)
{
MergeChildPermissions(existingChild, grandchild);
}
}
}
private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target)
{
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
foreach (var checker in source.StateCheckers)
{
if (!target.StateCheckers.Contains(checker))
{
target.StateCheckers.Add(checker);
}
}
}
private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source)
{
target.DisplayName = source.DisplayName;
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
foreach (var checker in source.StateCheckers)
{
if (!target.StateCheckers.Contains(checker))
{
target.StateCheckers.Add(checker);
}
}
if (source.MultiTenancySide != MultiTenancySides.Both)
{
target.MultiTenancySide |= source.MultiTenancySide;
}
target.IsEnabled = target.IsEnabled || source.IsEnabled;
}
}
#nullable disable

86
aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/Overrides/MergeSettingDefinitionManager.cs

@ -1,86 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Settings;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeSettingDefinitionManager : SettingDefinitionManager
{
public MergeSettingDefinitionManager(
IStaticSettingDefinitionStore staticStore,
IDynamicSettingDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<SettingDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeSetting(staticDefinition, dynamicDefinition);
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<SettingDefinition>> GetAllAsync()
{
var staticSettings = await StaticStore.GetAllAsync();
var dynamicSettings = await DynamicStore.GetAllAsync();
var mergedSettings = new Dictionary<string, SettingDefinition>();
foreach (var staticSetting in staticSettings)
{
mergedSettings[staticSetting.Name] = staticSetting;
}
foreach (var dynamicSetting in dynamicSettings)
{
if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting))
{
MergeSetting(existingSetting, dynamicSetting);
}
else
{
mergedSettings[dynamicSetting.Name] = dynamicSetting;
}
}
return mergedSettings.Values.ToImmutableList();
}
private static void MergeSetting(SettingDefinition target, SettingDefinition source)
{
target.DisplayName = source.DisplayName;
target.Description = source.Description ?? target.Description;
target.DefaultValue = source.DefaultValue ?? target.DefaultValue;
target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients;
target.IsInherited = target.IsInherited || source.IsInherited;
target.IsEncrypted = target.IsEncrypted || source.IsEncrypted;
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
}
}
#nullable disable

104
aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/Overrides/MergeTemplateDefinitionManager.cs

@ -1,104 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.TextTemplating;
namespace Volo.Abp.TextTemplatin;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeTemplateDefinitionManager : TemplateDefinitionManager
{
public MergeTemplateDefinitionManager(
IStaticTemplateDefinitionStore staticStore,
IDynamicTemplateDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<TemplateDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeTemplate(staticDefinition, dynamicDefinition);
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<TemplateDefinition>> GetAllAsync()
{
var staticTemplates = await StaticStore.GetAllAsync();
var dynamicTemplates = await DynamicStore.GetAllAsync();
var mergedTemplates = new Dictionary<string, TemplateDefinition>();
foreach (var staticTemplate in staticTemplates)
{
mergedTemplates[staticTemplate.Name] = staticTemplate;
}
foreach (var dynamicTemplate in dynamicTemplates)
{
if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate))
{
MergeTemplate(existingTemplate, dynamicTemplate);
}
else
{
mergedTemplates[dynamicTemplate.Name] = dynamicTemplate;
}
}
return mergedTemplates.Values.ToImmutableList();
}
private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate)
{
var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName;
var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName;
var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName;
var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout;
var layout = dynamicTemplate.Layout ?? staticTemplate.Layout;
var mergedTemplate = new TemplateDefinition(
staticTemplate.Name,
localizationResourceName,
displayName,
isLayout,
layout,
defaultCultureName
);
foreach (var property in staticTemplate.Properties)
{
mergedTemplate.Properties[property.Key] = property.Value;
}
foreach (var property in dynamicTemplate.Properties)
{
mergedTemplate.Properties[property.Key] = property.Value;
}
if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine))
{
mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine;
}
else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine))
{
mergedTemplate.RenderEngine = staticTemplate.RenderEngine;
}
mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized;
return mergedTemplate;
}
}
#nullable disable

1
aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/LINGYUN.Abp.MicroService.MessageService.csproj

@ -45,6 +45,7 @@
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.Data.DbMigrator\LINGYUN.Abp.Data.DbMigrator.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.Data.DbMigrator\LINGYUN.Abp.Data.DbMigrator.csproj" />
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj" />
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.Features.LimitValidation.Redis.Client\LINGYUN.Abp.Features.LimitValidation.Redis.Client.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.Features.LimitValidation.Redis.Client\LINGYUN.Abp.Features.LimitValidation.Redis.Client.csproj" />
<ProjectReference Include="..\..\framework\dynamic-definition\LINGYUN.Abp.Dynamic.Definitions\LINGYUN.Abp.Dynamic.Definitions.csproj" />
<ProjectReference Include="..\..\framework\localization\LINGYUN.Abp.Localization.CultureMap\LINGYUN.Abp.Localization.CultureMap.csproj" /> <ProjectReference Include="..\..\framework\localization\LINGYUN.Abp.Localization.CultureMap\LINGYUN.Abp.Localization.CultureMap.csproj" />
<ProjectReference Include="..\..\framework\logging\LINGYUN.Abp.Serilog.Enrichers.Application\LINGYUN.Abp.Serilog.Enrichers.Application.csproj" /> <ProjectReference Include="..\..\framework\logging\LINGYUN.Abp.Serilog.Enrichers.Application\LINGYUN.Abp.Serilog.Enrichers.Application.csproj" />
<ProjectReference Include="..\..\framework\logging\LINGYUN.Abp.Serilog.Enrichers.UniqueId\LINGYUN.Abp.Serilog.Enrichers.UniqueId.csproj" /> <ProjectReference Include="..\..\framework\logging\LINGYUN.Abp.Serilog.Enrichers.UniqueId\LINGYUN.Abp.Serilog.Enrichers.UniqueId.csproj" />

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/MessageServiceModule.cs

@ -6,6 +6,7 @@ using LINGYUN.Abp.BackgroundTasks.DistributedLocking;
using LINGYUN.Abp.BackgroundTasks.Quartz; using LINGYUN.Abp.BackgroundTasks.Quartz;
using LINGYUN.Abp.Claims.Mapping; using LINGYUN.Abp.Claims.Mapping;
using LINGYUN.Abp.Data.DbMigrator; using LINGYUN.Abp.Data.DbMigrator;
using LINGYUN.Abp.Dynamic.Definitions;
using LINGYUN.Abp.Emailing.Platform; using LINGYUN.Abp.Emailing.Platform;
using LINGYUN.Abp.EventBus.CAP; using LINGYUN.Abp.EventBus.CAP;
using LINGYUN.Abp.ExceptionHandling.Notifications; using LINGYUN.Abp.ExceptionHandling.Notifications;
@ -118,6 +119,7 @@ namespace LINGYUN.Abp.MicroService.MessageService;
typeof(AbpClaimsMappingModule), typeof(AbpClaimsMappingModule),
typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpAspNetCoreMvcWrapperModule),
typeof(AbpAspNetCoreHttpOverridesModule), typeof(AbpAspNetCoreHttpOverridesModule),
typeof(AbpDynamicDefinitionsModule),
typeof(AbpSwashbuckleModule), typeof(AbpSwashbuckleModule),
typeof(AbpAutofacModule) typeof(AbpAutofacModule)
)] )]

277
aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/Overrides/MergeFeatureDefinitionManager.cs

@ -1,277 +0,0 @@
using JetBrains.Annotations;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Features;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeFeatureDefinitionManager : FeatureDefinitionManager
{
public MergeFeatureDefinitionManager(
IStaticFeatureDefinitionStore staticStore,
IDynamicFeatureDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<FeatureDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeFeatureMetadata(staticDefinition, dynamicDefinition);
foreach (var child in dynamicDefinition.Children)
{
MergeChildFeature(staticDefinition, child);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<FeatureDefinition>> GetAllAsync()
{
var staticFeatures = await StaticStore.GetFeaturesAsync();
var dynamicFeatures = await DynamicStore.GetFeaturesAsync();
var mergedFeatures = new Dictionary<string, FeatureDefinition>();
foreach (var staticFeature in staticFeatures)
{
mergedFeatures[staticFeature.Name] = staticFeature;
}
foreach (var dynamicFeature in dynamicFeatures)
{
if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature))
{
MergeFeatureMetadata(existingFeature, dynamicFeature);
foreach (var child in dynamicFeature.Children)
{
MergeChildFeature(existingFeature, child);
}
}
else
{
mergedFeatures[dynamicFeature.Name] = dynamicFeature;
}
}
return mergedFeatures.Values.ToImmutableList();
}
public async override Task<IReadOnlyList<FeatureGroupDefinition>> GetGroupsAsync()
{
var staticGroups = await StaticStore.GetGroupsAsync();
var dynamicGroups = await DynamicStore.GetGroupsAsync();
var mergedGroups = new Dictionary<string, FeatureGroupDefinition>();
foreach (var staticGroup in staticGroups)
{
mergedGroups[staticGroup.Name] = staticGroup;
}
foreach (var dynamicGroup in dynamicGroups)
{
if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup))
{
MergeGroupFeatures(existingGroup, dynamicGroup);
}
else
{
mergedGroups[dynamicGroup.Name] = dynamicGroup;
}
}
return mergedGroups.Values.ToImmutableList();
}
private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source)
{
foreach (var sourceFeature in source.Features)
{
var existingFeature = GetFeatureOrNull(target, sourceFeature.Name);
if (existingFeature == null)
{
var newFeature = target.AddFeature(
sourceFeature.Name,
sourceFeature.DefaultValue,
sourceFeature.DisplayName,
sourceFeature.Description,
sourceFeature.ValueType,
sourceFeature.IsVisibleToClients,
sourceFeature.IsAvailableToHost
);
CopyFeatureDetails(sourceFeature, newFeature);
foreach (var child in sourceFeature.Children)
{
AddChildFeatureRecursively(newFeature, child);
}
}
else
{
MergeFeatureMetadata(existingFeature, sourceFeature);
foreach (var child in sourceFeature.Children)
{
MergeChildFeature(existingFeature, child);
}
}
}
}
private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild)
{
var newChild = parent.CreateChild(
sourceChild.Name,
sourceChild.DefaultValue,
sourceChild.DisplayName,
sourceChild.Description,
sourceChild.ValueType,
sourceChild.IsVisibleToClients,
sourceChild.IsAvailableToHost
);
CopyFeatureDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildFeatureRecursively(newChild, grandchild);
}
}
private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild)
{
var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name);
if (existingChild == null)
{
var newChild = parent.CreateChild(
sourceChild.Name,
sourceChild.DefaultValue,
sourceChild.DisplayName,
sourceChild.Description,
sourceChild.ValueType,
sourceChild.IsVisibleToClients,
sourceChild.IsAvailableToHost
);
CopyFeatureDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildFeatureRecursively(newChild, grandchild);
}
}
else
{
MergeFeatureMetadata(existingChild, sourceChild);
foreach (var grandchild in sourceChild.Children)
{
MergeChildFeature(existingChild, grandchild);
}
}
}
private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target)
{
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.AllowedProviders)
{
if (!target.AllowedProviders.Contains(provider))
{
target.AllowedProviders.Add(provider);
}
}
}
private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source)
{
if (source.DisplayName != null)
{
target.DisplayName = source.DisplayName;
}
if (source.Description != null)
{
target.Description = source.Description;
}
if (source.DefaultValue != null)
{
target.DefaultValue = source.DefaultValue;
}
if (source.ValueType != null)
{
target.ValueType = source.ValueType;
}
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.AllowedProviders)
{
if (!target.AllowedProviders.Contains(provider))
{
target.AllowedProviders.Add(provider);
}
}
target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients;
target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost;
}
public static FeatureDefinition? GetFeatureOrNull(
FeatureGroupDefinition group,
[NotNull] string name)
{
Check.NotNull(name, nameof(name));
return GetFeatureOrNullRecursively(group.Features, name);
}
private static FeatureDefinition? GetFeatureOrNullRecursively(
IReadOnlyList<FeatureDefinition> features,
string name)
{
foreach (var feature in features)
{
if (feature.Name == name)
{
return feature;
}
var childFeature = GetFeatureOrNullRecursively(feature.Children, name);
if (childFeature != null)
{
return childFeature;
}
}
return null;
}
}
#nullable disable

276
aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/Overrides/MergePermissionDefinitionManager.cs

@ -1,276 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.Authorization.Permissions;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergePermissionDefinitionManager : PermissionDefinitionManager
{
private readonly IStaticPermissionDefinitionStore _staticStore;
private readonly IDynamicPermissionDefinitionStore _dynamicStore;
public MergePermissionDefinitionManager(
IStaticPermissionDefinitionStore staticStore,
IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore)
{
_staticStore = staticStore;
_dynamicStore = dynamicStore;
}
public async override Task<PermissionDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await _staticStore.GetOrNullAsync(name);
var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergePermissionMetadata(staticDefinition, dynamicDefinition);
foreach (var grandchild in dynamicDefinition.Children)
{
MergeChildPermissions(staticDefinition, grandchild);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<PermissionDefinition?> GetResourcePermissionOrNullAsync(string resourceName, string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name);
var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergePermissionMetadata(staticDefinition, dynamicDefinition);
foreach (var grandchild in dynamicDefinition.Children)
{
MergeChildPermissions(staticDefinition, grandchild);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<PermissionDefinition>> GetPermissionsAsync()
{
var staticPermissions = await _staticStore.GetPermissionsAsync();
var dynamicPermissions = await _dynamicStore.GetPermissionsAsync();
return MergePermissions(staticPermissions, dynamicPermissions);
}
public async override Task<IReadOnlyList<PermissionDefinition>> GetResourcePermissionsAsync()
{
var staticPermissions = await _staticStore.GetResourcePermissionsAsync();
var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync();
return MergePermissions(staticPermissions, dynamicPermissions);
}
public async override Task<IReadOnlyList<PermissionGroupDefinition>> GetGroupsAsync()
{
var staticGroups = await _staticStore.GetGroupsAsync();
var dynamicGroups = await _dynamicStore.GetGroupsAsync();
var mergedGroups = new Dictionary<string, PermissionGroupDefinition>();
foreach (var staticGroup in staticGroups)
{
mergedGroups[staticGroup.Name] = staticGroup;
}
foreach (var dynamicGroup in dynamicGroups)
{
if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup))
{
MergeGroupPermissions(existingGroup, dynamicGroup);
}
else
{
mergedGroups[dynamicGroup.Name] = dynamicGroup;
}
}
return mergedGroups.Values.ToImmutableList();
}
private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source)
{
foreach (var sourcePermission in source.Permissions)
{
var existingPermission = target.GetPermissionOrNull(sourcePermission.Name);
if (existingPermission == null)
{
var newPermission = target.AddPermission(
sourcePermission.Name,
sourcePermission.DisplayName,
sourcePermission.MultiTenancySide,
sourcePermission.IsEnabled
);
CopyPermissionDetails(sourcePermission, newPermission);
foreach (var child in sourcePermission.Children)
{
AddChildPermissionRecursively(newPermission, child);
}
}
else
{
MergePermissionMetadata(existingPermission, sourcePermission);
foreach (var sourceChild in sourcePermission.Children)
{
MergeChildPermissions(existingPermission, sourceChild);
}
}
}
}
private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild)
{
var newChild = parent.AddChild(
sourceChild.Name,
sourceChild.DisplayName,
sourceChild.MultiTenancySide,
sourceChild.IsEnabled
);
CopyPermissionDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildPermissionRecursively(newChild, grandchild);
}
}
private static IReadOnlyList<PermissionDefinition> MergePermissions(IReadOnlyList<PermissionDefinition> staticPermissions, IReadOnlyList<PermissionDefinition> dynamicPermissions)
{
var mergedPermissions = new Dictionary<string, PermissionDefinition>();
foreach (var staticFeature in staticPermissions)
{
mergedPermissions[staticFeature.Name] = staticFeature;
}
foreach (var dynamicPermission in dynamicPermissions)
{
if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission))
{
MergePermissionMetadata(existingPermission, dynamicPermission);
foreach (var sourceChild in dynamicPermission.Children)
{
MergeChildPermissions(existingPermission, sourceChild);
}
}
else
{
mergedPermissions[dynamicPermission.Name] = dynamicPermission;
}
}
return mergedPermissions.Values.ToImmutableList();
}
private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild)
{
var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name);
if (existingChild == null)
{
var newChild = parent.AddChild(
sourceChild.Name,
sourceChild.DisplayName,
sourceChild.MultiTenancySide,
sourceChild.IsEnabled
);
CopyPermissionDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildPermissionRecursively(newChild, grandchild);
}
}
else
{
MergePermissionMetadata(existingChild, sourceChild);
foreach (var grandchild in sourceChild.Children)
{
MergeChildPermissions(existingChild, grandchild);
}
}
}
private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target)
{
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
foreach (var checker in source.StateCheckers)
{
if (!target.StateCheckers.Contains(checker))
{
target.StateCheckers.Add(checker);
}
}
}
private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source)
{
target.DisplayName = source.DisplayName;
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
foreach (var checker in source.StateCheckers)
{
if (!target.StateCheckers.Contains(checker))
{
target.StateCheckers.Add(checker);
}
}
if (source.MultiTenancySide != MultiTenancySides.Both)
{
target.MultiTenancySide |= source.MultiTenancySide;
}
target.IsEnabled = target.IsEnabled || source.IsEnabled;
}
}
#nullable disable

86
aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/Overrides/MergeSettingDefinitionManager.cs

@ -1,86 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Settings;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeSettingDefinitionManager : SettingDefinitionManager
{
public MergeSettingDefinitionManager(
IStaticSettingDefinitionStore staticStore,
IDynamicSettingDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<SettingDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeSetting(staticDefinition, dynamicDefinition);
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<SettingDefinition>> GetAllAsync()
{
var staticSettings = await StaticStore.GetAllAsync();
var dynamicSettings = await DynamicStore.GetAllAsync();
var mergedSettings = new Dictionary<string, SettingDefinition>();
foreach (var staticSetting in staticSettings)
{
mergedSettings[staticSetting.Name] = staticSetting;
}
foreach (var dynamicSetting in dynamicSettings)
{
if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting))
{
MergeSetting(existingSetting, dynamicSetting);
}
else
{
mergedSettings[dynamicSetting.Name] = dynamicSetting;
}
}
return mergedSettings.Values.ToImmutableList();
}
private static void MergeSetting(SettingDefinition target, SettingDefinition source)
{
target.DisplayName = source.DisplayName;
target.Description = source.Description ?? target.Description;
target.DefaultValue = source.DefaultValue ?? target.DefaultValue;
target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients;
target.IsInherited = target.IsInherited || source.IsInherited;
target.IsEncrypted = target.IsEncrypted || source.IsEncrypted;
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
}
}
#nullable disable

104
aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/Overrides/MergeTemplateDefinitionManager.cs

@ -1,104 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.TextTemplating;
namespace Volo.Abp.TextTemplatin;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeTemplateDefinitionManager : TemplateDefinitionManager
{
public MergeTemplateDefinitionManager(
IStaticTemplateDefinitionStore staticStore,
IDynamicTemplateDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<TemplateDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeTemplate(staticDefinition, dynamicDefinition);
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<TemplateDefinition>> GetAllAsync()
{
var staticTemplates = await StaticStore.GetAllAsync();
var dynamicTemplates = await DynamicStore.GetAllAsync();
var mergedTemplates = new Dictionary<string, TemplateDefinition>();
foreach (var staticTemplate in staticTemplates)
{
mergedTemplates[staticTemplate.Name] = staticTemplate;
}
foreach (var dynamicTemplate in dynamicTemplates)
{
if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate))
{
MergeTemplate(existingTemplate, dynamicTemplate);
}
else
{
mergedTemplates[dynamicTemplate.Name] = dynamicTemplate;
}
}
return mergedTemplates.Values.ToImmutableList();
}
private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate)
{
var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName;
var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName;
var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName;
var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout;
var layout = dynamicTemplate.Layout ?? staticTemplate.Layout;
var mergedTemplate = new TemplateDefinition(
staticTemplate.Name,
localizationResourceName,
displayName,
isLayout,
layout,
defaultCultureName
);
foreach (var property in staticTemplate.Properties)
{
mergedTemplate.Properties[property.Key] = property.Value;
}
foreach (var property in dynamicTemplate.Properties)
{
mergedTemplate.Properties[property.Key] = property.Value;
}
if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine))
{
mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine;
}
else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine))
{
mergedTemplate.RenderEngine = staticTemplate.RenderEngine;
}
mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized;
return mergedTemplate;
}
}
#nullable disable

1
aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/LINGYUN.Abp.MicroService.PlatformService.csproj

@ -49,6 +49,7 @@
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.ExceptionHandling.Emailing\LINGYUN.Abp.ExceptionHandling.Emailing.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.ExceptionHandling.Emailing\LINGYUN.Abp.ExceptionHandling.Emailing.csproj" />
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.Features.LimitValidation.Redis.Client\LINGYUN.Abp.Features.LimitValidation.Redis.Client.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.Features.LimitValidation.Redis.Client\LINGYUN.Abp.Features.LimitValidation.Redis.Client.csproj" />
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.Sms.Aliyun\LINGYUN.Abp.Sms.Aliyun.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.Sms.Aliyun\LINGYUN.Abp.Sms.Aliyun.csproj" />
<ProjectReference Include="..\..\framework\dynamic-definition\LINGYUN.Abp.Dynamic.Definitions\LINGYUN.Abp.Dynamic.Definitions.csproj" />
<ProjectReference Include="..\..\framework\features\LINGYUN.Abp.Features.Client\LINGYUN.Abp.Features.Client.csproj" /> <ProjectReference Include="..\..\framework\features\LINGYUN.Abp.Features.Client\LINGYUN.Abp.Features.Client.csproj" />
<ProjectReference Include="..\..\framework\localization\LINGYUN.Abp.Localization.CultureMap\LINGYUN.Abp.Localization.CultureMap.csproj" /> <ProjectReference Include="..\..\framework\localization\LINGYUN.Abp.Localization.CultureMap\LINGYUN.Abp.Localization.CultureMap.csproj" />
<ProjectReference Include="..\..\framework\logging\LINGYUN.Abp.Serilog.Enrichers.Application\LINGYUN.Abp.Serilog.Enrichers.Application.csproj" /> <ProjectReference Include="..\..\framework\logging\LINGYUN.Abp.Serilog.Enrichers.Application\LINGYUN.Abp.Serilog.Enrichers.Application.csproj" />

277
aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/Overrides/MergeFeatureDefinitionManager.cs

@ -1,277 +0,0 @@
using JetBrains.Annotations;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Features;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeFeatureDefinitionManager : FeatureDefinitionManager
{
public MergeFeatureDefinitionManager(
IStaticFeatureDefinitionStore staticStore,
IDynamicFeatureDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<FeatureDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeFeatureMetadata(staticDefinition, dynamicDefinition);
foreach (var child in dynamicDefinition.Children)
{
MergeChildFeature(staticDefinition, child);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<FeatureDefinition>> GetAllAsync()
{
var staticFeatures = await StaticStore.GetFeaturesAsync();
var dynamicFeatures = await DynamicStore.GetFeaturesAsync();
var mergedFeatures = new Dictionary<string, FeatureDefinition>();
foreach (var staticFeature in staticFeatures)
{
mergedFeatures[staticFeature.Name] = staticFeature;
}
foreach (var dynamicFeature in dynamicFeatures)
{
if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature))
{
MergeFeatureMetadata(existingFeature, dynamicFeature);
foreach (var child in dynamicFeature.Children)
{
MergeChildFeature(existingFeature, child);
}
}
else
{
mergedFeatures[dynamicFeature.Name] = dynamicFeature;
}
}
return mergedFeatures.Values.ToImmutableList();
}
public async override Task<IReadOnlyList<FeatureGroupDefinition>> GetGroupsAsync()
{
var staticGroups = await StaticStore.GetGroupsAsync();
var dynamicGroups = await DynamicStore.GetGroupsAsync();
var mergedGroups = new Dictionary<string, FeatureGroupDefinition>();
foreach (var staticGroup in staticGroups)
{
mergedGroups[staticGroup.Name] = staticGroup;
}
foreach (var dynamicGroup in dynamicGroups)
{
if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup))
{
MergeGroupFeatures(existingGroup, dynamicGroup);
}
else
{
mergedGroups[dynamicGroup.Name] = dynamicGroup;
}
}
return mergedGroups.Values.ToImmutableList();
}
private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source)
{
foreach (var sourceFeature in source.Features)
{
var existingFeature = GetFeatureOrNull(target, sourceFeature.Name);
if (existingFeature == null)
{
var newFeature = target.AddFeature(
sourceFeature.Name,
sourceFeature.DefaultValue,
sourceFeature.DisplayName,
sourceFeature.Description,
sourceFeature.ValueType,
sourceFeature.IsVisibleToClients,
sourceFeature.IsAvailableToHost
);
CopyFeatureDetails(sourceFeature, newFeature);
foreach (var child in sourceFeature.Children)
{
AddChildFeatureRecursively(newFeature, child);
}
}
else
{
MergeFeatureMetadata(existingFeature, sourceFeature);
foreach (var child in sourceFeature.Children)
{
MergeChildFeature(existingFeature, child);
}
}
}
}
private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild)
{
var newChild = parent.CreateChild(
sourceChild.Name,
sourceChild.DefaultValue,
sourceChild.DisplayName,
sourceChild.Description,
sourceChild.ValueType,
sourceChild.IsVisibleToClients,
sourceChild.IsAvailableToHost
);
CopyFeatureDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildFeatureRecursively(newChild, grandchild);
}
}
private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild)
{
var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name);
if (existingChild == null)
{
var newChild = parent.CreateChild(
sourceChild.Name,
sourceChild.DefaultValue,
sourceChild.DisplayName,
sourceChild.Description,
sourceChild.ValueType,
sourceChild.IsVisibleToClients,
sourceChild.IsAvailableToHost
);
CopyFeatureDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildFeatureRecursively(newChild, grandchild);
}
}
else
{
MergeFeatureMetadata(existingChild, sourceChild);
foreach (var grandchild in sourceChild.Children)
{
MergeChildFeature(existingChild, grandchild);
}
}
}
private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target)
{
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.AllowedProviders)
{
if (!target.AllowedProviders.Contains(provider))
{
target.AllowedProviders.Add(provider);
}
}
}
private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source)
{
if (source.DisplayName != null)
{
target.DisplayName = source.DisplayName;
}
if (source.Description != null)
{
target.Description = source.Description;
}
if (source.DefaultValue != null)
{
target.DefaultValue = source.DefaultValue;
}
if (source.ValueType != null)
{
target.ValueType = source.ValueType;
}
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.AllowedProviders)
{
if (!target.AllowedProviders.Contains(provider))
{
target.AllowedProviders.Add(provider);
}
}
target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients;
target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost;
}
public static FeatureDefinition? GetFeatureOrNull(
FeatureGroupDefinition group,
[NotNull] string name)
{
Check.NotNull(name, nameof(name));
return GetFeatureOrNullRecursively(group.Features, name);
}
private static FeatureDefinition? GetFeatureOrNullRecursively(
IReadOnlyList<FeatureDefinition> features,
string name)
{
foreach (var feature in features)
{
if (feature.Name == name)
{
return feature;
}
var childFeature = GetFeatureOrNullRecursively(feature.Children, name);
if (childFeature != null)
{
return childFeature;
}
}
return null;
}
}
#nullable disable

276
aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/Overrides/MergePermissionDefinitionManager.cs

@ -1,276 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.Authorization.Permissions;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergePermissionDefinitionManager : PermissionDefinitionManager
{
private readonly IStaticPermissionDefinitionStore _staticStore;
private readonly IDynamicPermissionDefinitionStore _dynamicStore;
public MergePermissionDefinitionManager(
IStaticPermissionDefinitionStore staticStore,
IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore)
{
_staticStore = staticStore;
_dynamicStore = dynamicStore;
}
public async override Task<PermissionDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await _staticStore.GetOrNullAsync(name);
var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergePermissionMetadata(staticDefinition, dynamicDefinition);
foreach (var grandchild in dynamicDefinition.Children)
{
MergeChildPermissions(staticDefinition, grandchild);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<PermissionDefinition?> GetResourcePermissionOrNullAsync(string resourceName, string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name);
var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergePermissionMetadata(staticDefinition, dynamicDefinition);
foreach (var grandchild in dynamicDefinition.Children)
{
MergeChildPermissions(staticDefinition, grandchild);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<PermissionDefinition>> GetPermissionsAsync()
{
var staticPermissions = await _staticStore.GetPermissionsAsync();
var dynamicPermissions = await _dynamicStore.GetPermissionsAsync();
return MergePermissions(staticPermissions, dynamicPermissions);
}
public async override Task<IReadOnlyList<PermissionDefinition>> GetResourcePermissionsAsync()
{
var staticPermissions = await _staticStore.GetResourcePermissionsAsync();
var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync();
return MergePermissions(staticPermissions, dynamicPermissions);
}
public async override Task<IReadOnlyList<PermissionGroupDefinition>> GetGroupsAsync()
{
var staticGroups = await _staticStore.GetGroupsAsync();
var dynamicGroups = await _dynamicStore.GetGroupsAsync();
var mergedGroups = new Dictionary<string, PermissionGroupDefinition>();
foreach (var staticGroup in staticGroups)
{
mergedGroups[staticGroup.Name] = staticGroup;
}
foreach (var dynamicGroup in dynamicGroups)
{
if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup))
{
MergeGroupPermissions(existingGroup, dynamicGroup);
}
else
{
mergedGroups[dynamicGroup.Name] = dynamicGroup;
}
}
return mergedGroups.Values.ToImmutableList();
}
private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source)
{
foreach (var sourcePermission in source.Permissions)
{
var existingPermission = target.GetPermissionOrNull(sourcePermission.Name);
if (existingPermission == null)
{
var newPermission = target.AddPermission(
sourcePermission.Name,
sourcePermission.DisplayName,
sourcePermission.MultiTenancySide,
sourcePermission.IsEnabled
);
CopyPermissionDetails(sourcePermission, newPermission);
foreach (var child in sourcePermission.Children)
{
AddChildPermissionRecursively(newPermission, child);
}
}
else
{
MergePermissionMetadata(existingPermission, sourcePermission);
foreach (var sourceChild in sourcePermission.Children)
{
MergeChildPermissions(existingPermission, sourceChild);
}
}
}
}
private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild)
{
var newChild = parent.AddChild(
sourceChild.Name,
sourceChild.DisplayName,
sourceChild.MultiTenancySide,
sourceChild.IsEnabled
);
CopyPermissionDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildPermissionRecursively(newChild, grandchild);
}
}
private static IReadOnlyList<PermissionDefinition> MergePermissions(IReadOnlyList<PermissionDefinition> staticPermissions, IReadOnlyList<PermissionDefinition> dynamicPermissions)
{
var mergedPermissions = new Dictionary<string, PermissionDefinition>();
foreach (var staticFeature in staticPermissions)
{
mergedPermissions[staticFeature.Name] = staticFeature;
}
foreach (var dynamicPermission in dynamicPermissions)
{
if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission))
{
MergePermissionMetadata(existingPermission, dynamicPermission);
foreach (var sourceChild in dynamicPermission.Children)
{
MergeChildPermissions(existingPermission, sourceChild);
}
}
else
{
mergedPermissions[dynamicPermission.Name] = dynamicPermission;
}
}
return mergedPermissions.Values.ToImmutableList();
}
private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild)
{
var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name);
if (existingChild == null)
{
var newChild = parent.AddChild(
sourceChild.Name,
sourceChild.DisplayName,
sourceChild.MultiTenancySide,
sourceChild.IsEnabled
);
CopyPermissionDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildPermissionRecursively(newChild, grandchild);
}
}
else
{
MergePermissionMetadata(existingChild, sourceChild);
foreach (var grandchild in sourceChild.Children)
{
MergeChildPermissions(existingChild, grandchild);
}
}
}
private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target)
{
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
foreach (var checker in source.StateCheckers)
{
if (!target.StateCheckers.Contains(checker))
{
target.StateCheckers.Add(checker);
}
}
}
private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source)
{
target.DisplayName = source.DisplayName;
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
foreach (var checker in source.StateCheckers)
{
if (!target.StateCheckers.Contains(checker))
{
target.StateCheckers.Add(checker);
}
}
if (source.MultiTenancySide != MultiTenancySides.Both)
{
target.MultiTenancySide |= source.MultiTenancySide;
}
target.IsEnabled = target.IsEnabled || source.IsEnabled;
}
}
#nullable disable

86
aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/Overrides/MergeSettingDefinitionManager.cs

@ -1,86 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Settings;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeSettingDefinitionManager : SettingDefinitionManager
{
public MergeSettingDefinitionManager(
IStaticSettingDefinitionStore staticStore,
IDynamicSettingDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<SettingDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeSetting(staticDefinition, dynamicDefinition);
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<SettingDefinition>> GetAllAsync()
{
var staticSettings = await StaticStore.GetAllAsync();
var dynamicSettings = await DynamicStore.GetAllAsync();
var mergedSettings = new Dictionary<string, SettingDefinition>();
foreach (var staticSetting in staticSettings)
{
mergedSettings[staticSetting.Name] = staticSetting;
}
foreach (var dynamicSetting in dynamicSettings)
{
if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting))
{
MergeSetting(existingSetting, dynamicSetting);
}
else
{
mergedSettings[dynamicSetting.Name] = dynamicSetting;
}
}
return mergedSettings.Values.ToImmutableList();
}
private static void MergeSetting(SettingDefinition target, SettingDefinition source)
{
target.DisplayName = source.DisplayName;
target.Description = source.Description ?? target.Description;
target.DefaultValue = source.DefaultValue ?? target.DefaultValue;
target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients;
target.IsInherited = target.IsInherited || source.IsInherited;
target.IsEncrypted = target.IsEncrypted || source.IsEncrypted;
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
}
}
#nullable disable

104
aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/Overrides/MergeTemplateDefinitionManager.cs

@ -1,104 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.TextTemplating;
namespace Volo.Abp.TextTemplatin;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeTemplateDefinitionManager : TemplateDefinitionManager
{
public MergeTemplateDefinitionManager(
IStaticTemplateDefinitionStore staticStore,
IDynamicTemplateDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<TemplateDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeTemplate(staticDefinition, dynamicDefinition);
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<TemplateDefinition>> GetAllAsync()
{
var staticTemplates = await StaticStore.GetAllAsync();
var dynamicTemplates = await DynamicStore.GetAllAsync();
var mergedTemplates = new Dictionary<string, TemplateDefinition>();
foreach (var staticTemplate in staticTemplates)
{
mergedTemplates[staticTemplate.Name] = staticTemplate;
}
foreach (var dynamicTemplate in dynamicTemplates)
{
if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate))
{
MergeTemplate(existingTemplate, dynamicTemplate);
}
else
{
mergedTemplates[dynamicTemplate.Name] = dynamicTemplate;
}
}
return mergedTemplates.Values.ToImmutableList();
}
private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate)
{
var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName;
var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName;
var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName;
var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout;
var layout = dynamicTemplate.Layout ?? staticTemplate.Layout;
var mergedTemplate = new TemplateDefinition(
staticTemplate.Name,
localizationResourceName,
displayName,
isLayout,
layout,
defaultCultureName
);
foreach (var property in staticTemplate.Properties)
{
mergedTemplate.Properties[property.Key] = property.Value;
}
foreach (var property in dynamicTemplate.Properties)
{
mergedTemplate.Properties[property.Key] = property.Value;
}
if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine))
{
mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine;
}
else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine))
{
mergedTemplate.RenderEngine = staticTemplate.RenderEngine;
}
mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized;
return mergedTemplate;
}
}
#nullable disable

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/PlatformServiceModule.cs

@ -11,6 +11,7 @@ using LINGYUN.Abp.BlobManagement.Tencent;
using LINGYUN.Abp.BlobStoring.BlobManagement; using LINGYUN.Abp.BlobStoring.BlobManagement;
using LINGYUN.Abp.Claims.Mapping; using LINGYUN.Abp.Claims.Mapping;
using LINGYUN.Abp.Data.DbMigrator; using LINGYUN.Abp.Data.DbMigrator;
using LINGYUN.Abp.Dynamic.Definitions;
using LINGYUN.Abp.EventBus.CAP; using LINGYUN.Abp.EventBus.CAP;
using LINGYUN.Abp.ExceptionHandling.Emailing; using LINGYUN.Abp.ExceptionHandling.Emailing;
using LINGYUN.Abp.Features.LimitValidation.Redis; using LINGYUN.Abp.Features.LimitValidation.Redis;
@ -95,6 +96,7 @@ namespace LINGYUN.Abp.MicroService.PlatformService;
typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpAspNetCoreMvcWrapperModule),
typeof(AbpClaimsMappingModule), typeof(AbpClaimsMappingModule),
typeof(AbpAspNetCoreHttpOverridesModule), typeof(AbpAspNetCoreHttpOverridesModule),
typeof(AbpDynamicDefinitionsModule),
typeof(AbpSwashbuckleModule), typeof(AbpSwashbuckleModule),
typeof(AbpAutofacModule) typeof(AbpAutofacModule)
)] )]

1
aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/LINGYUN.Abp.MicroService.TaskService.csproj

@ -45,6 +45,7 @@
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.Data.DbMigrator\LINGYUN.Abp.Data.DbMigrator.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.Data.DbMigrator\LINGYUN.Abp.Data.DbMigrator.csproj" />
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj" />
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.ExceptionHandling.Emailing\LINGYUN.Abp.ExceptionHandling.Emailing.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.ExceptionHandling.Emailing\LINGYUN.Abp.ExceptionHandling.Emailing.csproj" />
<ProjectReference Include="..\..\framework\dynamic-definition\LINGYUN.Abp.Dynamic.Definitions\LINGYUN.Abp.Dynamic.Definitions.csproj" />
<ProjectReference Include="..\..\framework\localization\LINGYUN.Abp.Localization.CultureMap\LINGYUN.Abp.Localization.CultureMap.csproj" /> <ProjectReference Include="..\..\framework\localization\LINGYUN.Abp.Localization.CultureMap\LINGYUN.Abp.Localization.CultureMap.csproj" />
<ProjectReference Include="..\..\framework\auditing\LINGYUN.Abp.AuditLogging.Elasticsearch\LINGYUN.Abp.AuditLogging.Elasticsearch.csproj" /> <ProjectReference Include="..\..\framework\auditing\LINGYUN.Abp.AuditLogging.Elasticsearch\LINGYUN.Abp.AuditLogging.Elasticsearch.csproj" />
<ProjectReference Include="..\..\framework\logging\LINGYUN.Abp.Serilog.Enrichers.Application\LINGYUN.Abp.Serilog.Enrichers.Application.csproj" /> <ProjectReference Include="..\..\framework\logging\LINGYUN.Abp.Serilog.Enrichers.Application\LINGYUN.Abp.Serilog.Enrichers.Application.csproj" />

277
aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/Overrides/MergeFeatureDefinitionManager.cs

@ -1,277 +0,0 @@
using JetBrains.Annotations;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Features;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeFeatureDefinitionManager : FeatureDefinitionManager
{
public MergeFeatureDefinitionManager(
IStaticFeatureDefinitionStore staticStore,
IDynamicFeatureDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<FeatureDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeFeatureMetadata(staticDefinition, dynamicDefinition);
foreach (var child in dynamicDefinition.Children)
{
MergeChildFeature(staticDefinition, child);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<FeatureDefinition>> GetAllAsync()
{
var staticFeatures = await StaticStore.GetFeaturesAsync();
var dynamicFeatures = await DynamicStore.GetFeaturesAsync();
var mergedFeatures = new Dictionary<string, FeatureDefinition>();
foreach (var staticFeature in staticFeatures)
{
mergedFeatures[staticFeature.Name] = staticFeature;
}
foreach (var dynamicFeature in dynamicFeatures)
{
if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature))
{
MergeFeatureMetadata(existingFeature, dynamicFeature);
foreach (var child in dynamicFeature.Children)
{
MergeChildFeature(existingFeature, child);
}
}
else
{
mergedFeatures[dynamicFeature.Name] = dynamicFeature;
}
}
return mergedFeatures.Values.ToImmutableList();
}
public async override Task<IReadOnlyList<FeatureGroupDefinition>> GetGroupsAsync()
{
var staticGroups = await StaticStore.GetGroupsAsync();
var dynamicGroups = await DynamicStore.GetGroupsAsync();
var mergedGroups = new Dictionary<string, FeatureGroupDefinition>();
foreach (var staticGroup in staticGroups)
{
mergedGroups[staticGroup.Name] = staticGroup;
}
foreach (var dynamicGroup in dynamicGroups)
{
if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup))
{
MergeGroupFeatures(existingGroup, dynamicGroup);
}
else
{
mergedGroups[dynamicGroup.Name] = dynamicGroup;
}
}
return mergedGroups.Values.ToImmutableList();
}
private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source)
{
foreach (var sourceFeature in source.Features)
{
var existingFeature = GetFeatureOrNull(target, sourceFeature.Name);
if (existingFeature == null)
{
var newFeature = target.AddFeature(
sourceFeature.Name,
sourceFeature.DefaultValue,
sourceFeature.DisplayName,
sourceFeature.Description,
sourceFeature.ValueType,
sourceFeature.IsVisibleToClients,
sourceFeature.IsAvailableToHost
);
CopyFeatureDetails(sourceFeature, newFeature);
foreach (var child in sourceFeature.Children)
{
AddChildFeatureRecursively(newFeature, child);
}
}
else
{
MergeFeatureMetadata(existingFeature, sourceFeature);
foreach (var child in sourceFeature.Children)
{
MergeChildFeature(existingFeature, child);
}
}
}
}
private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild)
{
var newChild = parent.CreateChild(
sourceChild.Name,
sourceChild.DefaultValue,
sourceChild.DisplayName,
sourceChild.Description,
sourceChild.ValueType,
sourceChild.IsVisibleToClients,
sourceChild.IsAvailableToHost
);
CopyFeatureDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildFeatureRecursively(newChild, grandchild);
}
}
private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild)
{
var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name);
if (existingChild == null)
{
var newChild = parent.CreateChild(
sourceChild.Name,
sourceChild.DefaultValue,
sourceChild.DisplayName,
sourceChild.Description,
sourceChild.ValueType,
sourceChild.IsVisibleToClients,
sourceChild.IsAvailableToHost
);
CopyFeatureDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildFeatureRecursively(newChild, grandchild);
}
}
else
{
MergeFeatureMetadata(existingChild, sourceChild);
foreach (var grandchild in sourceChild.Children)
{
MergeChildFeature(existingChild, grandchild);
}
}
}
private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target)
{
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.AllowedProviders)
{
if (!target.AllowedProviders.Contains(provider))
{
target.AllowedProviders.Add(provider);
}
}
}
private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source)
{
if (source.DisplayName != null)
{
target.DisplayName = source.DisplayName;
}
if (source.Description != null)
{
target.Description = source.Description;
}
if (source.DefaultValue != null)
{
target.DefaultValue = source.DefaultValue;
}
if (source.ValueType != null)
{
target.ValueType = source.ValueType;
}
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.AllowedProviders)
{
if (!target.AllowedProviders.Contains(provider))
{
target.AllowedProviders.Add(provider);
}
}
target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients;
target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost;
}
public static FeatureDefinition? GetFeatureOrNull(
FeatureGroupDefinition group,
[NotNull] string name)
{
Check.NotNull(name, nameof(name));
return GetFeatureOrNullRecursively(group.Features, name);
}
private static FeatureDefinition? GetFeatureOrNullRecursively(
IReadOnlyList<FeatureDefinition> features,
string name)
{
foreach (var feature in features)
{
if (feature.Name == name)
{
return feature;
}
var childFeature = GetFeatureOrNullRecursively(feature.Children, name);
if (childFeature != null)
{
return childFeature;
}
}
return null;
}
}
#nullable disable

276
aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/Overrides/MergePermissionDefinitionManager.cs

@ -1,276 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.Authorization.Permissions;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergePermissionDefinitionManager : PermissionDefinitionManager
{
private readonly IStaticPermissionDefinitionStore _staticStore;
private readonly IDynamicPermissionDefinitionStore _dynamicStore;
public MergePermissionDefinitionManager(
IStaticPermissionDefinitionStore staticStore,
IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore)
{
_staticStore = staticStore;
_dynamicStore = dynamicStore;
}
public async override Task<PermissionDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await _staticStore.GetOrNullAsync(name);
var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergePermissionMetadata(staticDefinition, dynamicDefinition);
foreach (var grandchild in dynamicDefinition.Children)
{
MergeChildPermissions(staticDefinition, grandchild);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<PermissionDefinition?> GetResourcePermissionOrNullAsync(string resourceName, string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name);
var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergePermissionMetadata(staticDefinition, dynamicDefinition);
foreach (var grandchild in dynamicDefinition.Children)
{
MergeChildPermissions(staticDefinition, grandchild);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<PermissionDefinition>> GetPermissionsAsync()
{
var staticPermissions = await _staticStore.GetPermissionsAsync();
var dynamicPermissions = await _dynamicStore.GetPermissionsAsync();
return MergePermissions(staticPermissions, dynamicPermissions);
}
public async override Task<IReadOnlyList<PermissionDefinition>> GetResourcePermissionsAsync()
{
var staticPermissions = await _staticStore.GetResourcePermissionsAsync();
var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync();
return MergePermissions(staticPermissions, dynamicPermissions);
}
public async override Task<IReadOnlyList<PermissionGroupDefinition>> GetGroupsAsync()
{
var staticGroups = await _staticStore.GetGroupsAsync();
var dynamicGroups = await _dynamicStore.GetGroupsAsync();
var mergedGroups = new Dictionary<string, PermissionGroupDefinition>();
foreach (var staticGroup in staticGroups)
{
mergedGroups[staticGroup.Name] = staticGroup;
}
foreach (var dynamicGroup in dynamicGroups)
{
if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup))
{
MergeGroupPermissions(existingGroup, dynamicGroup);
}
else
{
mergedGroups[dynamicGroup.Name] = dynamicGroup;
}
}
return mergedGroups.Values.ToImmutableList();
}
private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source)
{
foreach (var sourcePermission in source.Permissions)
{
var existingPermission = target.GetPermissionOrNull(sourcePermission.Name);
if (existingPermission == null)
{
var newPermission = target.AddPermission(
sourcePermission.Name,
sourcePermission.DisplayName,
sourcePermission.MultiTenancySide,
sourcePermission.IsEnabled
);
CopyPermissionDetails(sourcePermission, newPermission);
foreach (var child in sourcePermission.Children)
{
AddChildPermissionRecursively(newPermission, child);
}
}
else
{
MergePermissionMetadata(existingPermission, sourcePermission);
foreach (var sourceChild in sourcePermission.Children)
{
MergeChildPermissions(existingPermission, sourceChild);
}
}
}
}
private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild)
{
var newChild = parent.AddChild(
sourceChild.Name,
sourceChild.DisplayName,
sourceChild.MultiTenancySide,
sourceChild.IsEnabled
);
CopyPermissionDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildPermissionRecursively(newChild, grandchild);
}
}
private static IReadOnlyList<PermissionDefinition> MergePermissions(IReadOnlyList<PermissionDefinition> staticPermissions, IReadOnlyList<PermissionDefinition> dynamicPermissions)
{
var mergedPermissions = new Dictionary<string, PermissionDefinition>();
foreach (var staticFeature in staticPermissions)
{
mergedPermissions[staticFeature.Name] = staticFeature;
}
foreach (var dynamicPermission in dynamicPermissions)
{
if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission))
{
MergePermissionMetadata(existingPermission, dynamicPermission);
foreach (var sourceChild in dynamicPermission.Children)
{
MergeChildPermissions(existingPermission, sourceChild);
}
}
else
{
mergedPermissions[dynamicPermission.Name] = dynamicPermission;
}
}
return mergedPermissions.Values.ToImmutableList();
}
private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild)
{
var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name);
if (existingChild == null)
{
var newChild = parent.AddChild(
sourceChild.Name,
sourceChild.DisplayName,
sourceChild.MultiTenancySide,
sourceChild.IsEnabled
);
CopyPermissionDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildPermissionRecursively(newChild, grandchild);
}
}
else
{
MergePermissionMetadata(existingChild, sourceChild);
foreach (var grandchild in sourceChild.Children)
{
MergeChildPermissions(existingChild, grandchild);
}
}
}
private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target)
{
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
foreach (var checker in source.StateCheckers)
{
if (!target.StateCheckers.Contains(checker))
{
target.StateCheckers.Add(checker);
}
}
}
private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source)
{
target.DisplayName = source.DisplayName;
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
foreach (var checker in source.StateCheckers)
{
if (!target.StateCheckers.Contains(checker))
{
target.StateCheckers.Add(checker);
}
}
if (source.MultiTenancySide != MultiTenancySides.Both)
{
target.MultiTenancySide |= source.MultiTenancySide;
}
target.IsEnabled = target.IsEnabled || source.IsEnabled;
}
}
#nullable disable

86
aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/Overrides/MergeSettingDefinitionManager.cs

@ -1,86 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Settings;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeSettingDefinitionManager : SettingDefinitionManager
{
public MergeSettingDefinitionManager(
IStaticSettingDefinitionStore staticStore,
IDynamicSettingDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<SettingDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeSetting(staticDefinition, dynamicDefinition);
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<SettingDefinition>> GetAllAsync()
{
var staticSettings = await StaticStore.GetAllAsync();
var dynamicSettings = await DynamicStore.GetAllAsync();
var mergedSettings = new Dictionary<string, SettingDefinition>();
foreach (var staticSetting in staticSettings)
{
mergedSettings[staticSetting.Name] = staticSetting;
}
foreach (var dynamicSetting in dynamicSettings)
{
if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting))
{
MergeSetting(existingSetting, dynamicSetting);
}
else
{
mergedSettings[dynamicSetting.Name] = dynamicSetting;
}
}
return mergedSettings.Values.ToImmutableList();
}
private static void MergeSetting(SettingDefinition target, SettingDefinition source)
{
target.DisplayName = source.DisplayName;
target.Description = source.Description ?? target.Description;
target.DefaultValue = source.DefaultValue ?? target.DefaultValue;
target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients;
target.IsInherited = target.IsInherited || source.IsInherited;
target.IsEncrypted = target.IsEncrypted || source.IsEncrypted;
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
}
}
#nullable disable

104
aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/Overrides/MergeTemplateDefinitionManager.cs

@ -1,104 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.TextTemplating;
namespace Volo.Abp.TextTemplatin;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeTemplateDefinitionManager : TemplateDefinitionManager
{
public MergeTemplateDefinitionManager(
IStaticTemplateDefinitionStore staticStore,
IDynamicTemplateDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<TemplateDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeTemplate(staticDefinition, dynamicDefinition);
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<TemplateDefinition>> GetAllAsync()
{
var staticTemplates = await StaticStore.GetAllAsync();
var dynamicTemplates = await DynamicStore.GetAllAsync();
var mergedTemplates = new Dictionary<string, TemplateDefinition>();
foreach (var staticTemplate in staticTemplates)
{
mergedTemplates[staticTemplate.Name] = staticTemplate;
}
foreach (var dynamicTemplate in dynamicTemplates)
{
if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate))
{
MergeTemplate(existingTemplate, dynamicTemplate);
}
else
{
mergedTemplates[dynamicTemplate.Name] = dynamicTemplate;
}
}
return mergedTemplates.Values.ToImmutableList();
}
private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate)
{
var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName;
var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName;
var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName;
var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout;
var layout = dynamicTemplate.Layout ?? staticTemplate.Layout;
var mergedTemplate = new TemplateDefinition(
staticTemplate.Name,
localizationResourceName,
displayName,
isLayout,
layout,
defaultCultureName
);
foreach (var property in staticTemplate.Properties)
{
mergedTemplate.Properties[property.Key] = property.Value;
}
foreach (var property in dynamicTemplate.Properties)
{
mergedTemplate.Properties[property.Key] = property.Value;
}
if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine))
{
mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine;
}
else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine))
{
mergedTemplate.RenderEngine = staticTemplate.RenderEngine;
}
mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized;
return mergedTemplate;
}
}
#nullable disable

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/TaskServiceModule.cs

@ -9,6 +9,7 @@ using LINGYUN.Abp.BackgroundTasks.Quartz;
using LINGYUN.Abp.BlobStoring.BlobManagement; using LINGYUN.Abp.BlobStoring.BlobManagement;
using LINGYUN.Abp.Claims.Mapping; using LINGYUN.Abp.Claims.Mapping;
using LINGYUN.Abp.Data.DbMigrator; using LINGYUN.Abp.Data.DbMigrator;
using LINGYUN.Abp.Dynamic.Definitions;
using LINGYUN.Abp.Elasticsearch.Jobs; using LINGYUN.Abp.Elasticsearch.Jobs;
using LINGYUN.Abp.Emailing.Platform; using LINGYUN.Abp.Emailing.Platform;
using LINGYUN.Abp.EventBus.CAP; using LINGYUN.Abp.EventBus.CAP;
@ -83,6 +84,7 @@ namespace LINGYUN.Abp.MicroService.TaskService;
typeof(AbpLocalizationCultureMapModule), typeof(AbpLocalizationCultureMapModule),
typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpAspNetCoreMvcWrapperModule),
typeof(AbpAspNetCoreHttpOverridesModule), typeof(AbpAspNetCoreHttpOverridesModule),
typeof(AbpDynamicDefinitionsModule),
typeof(AbpClaimsMappingModule), typeof(AbpClaimsMappingModule),
typeof(AbpCAPEventBusModule), typeof(AbpCAPEventBusModule),
typeof(AbpAutofacModule) typeof(AbpAutofacModule)

1
aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/LINGYUN.Abp.MicroService.WeChatService.csproj

@ -46,6 +46,7 @@
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj" />
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.ExceptionHandling.Emailing\LINGYUN.Abp.ExceptionHandling.Emailing.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.ExceptionHandling.Emailing\LINGYUN.Abp.ExceptionHandling.Emailing.csproj" />
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.Http.Client.Wrapper\LINGYUN.Abp.Http.Client.Wrapper.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.Http.Client.Wrapper\LINGYUN.Abp.Http.Client.Wrapper.csproj" />
<ProjectReference Include="..\..\framework\dynamic-definition\LINGYUN.Abp.Dynamic.Definitions\LINGYUN.Abp.Dynamic.Definitions.csproj" />
<ProjectReference Include="..\..\framework\mvc\LINGYUN.Abp.AspNetCore.Mvc.Wrapper\LINGYUN.Abp.AspNetCore.Mvc.Wrapper.csproj" /> <ProjectReference Include="..\..\framework\mvc\LINGYUN.Abp.AspNetCore.Mvc.Wrapper\LINGYUN.Abp.AspNetCore.Mvc.Wrapper.csproj" />
<ProjectReference Include="..\..\framework\auditing\LINGYUN.Abp.AuditLogging.Elasticsearch\LINGYUN.Abp.AuditLogging.Elasticsearch.csproj" /> <ProjectReference Include="..\..\framework\auditing\LINGYUN.Abp.AuditLogging.Elasticsearch\LINGYUN.Abp.AuditLogging.Elasticsearch.csproj" />
<ProjectReference Include="..\..\framework\logging\LINGYUN.Abp.Serilog.Enrichers.Application\LINGYUN.Abp.Serilog.Enrichers.Application.csproj" /> <ProjectReference Include="..\..\framework\logging\LINGYUN.Abp.Serilog.Enrichers.Application\LINGYUN.Abp.Serilog.Enrichers.Application.csproj" />

277
aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/Overrides/MergeFeatureDefinitionManager.cs

@ -1,277 +0,0 @@
using JetBrains.Annotations;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Features;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeFeatureDefinitionManager : FeatureDefinitionManager
{
public MergeFeatureDefinitionManager(
IStaticFeatureDefinitionStore staticStore,
IDynamicFeatureDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<FeatureDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeFeatureMetadata(staticDefinition, dynamicDefinition);
foreach (var child in dynamicDefinition.Children)
{
MergeChildFeature(staticDefinition, child);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<FeatureDefinition>> GetAllAsync()
{
var staticFeatures = await StaticStore.GetFeaturesAsync();
var dynamicFeatures = await DynamicStore.GetFeaturesAsync();
var mergedFeatures = new Dictionary<string, FeatureDefinition>();
foreach (var staticFeature in staticFeatures)
{
mergedFeatures[staticFeature.Name] = staticFeature;
}
foreach (var dynamicFeature in dynamicFeatures)
{
if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature))
{
MergeFeatureMetadata(existingFeature, dynamicFeature);
foreach (var child in dynamicFeature.Children)
{
MergeChildFeature(existingFeature, child);
}
}
else
{
mergedFeatures[dynamicFeature.Name] = dynamicFeature;
}
}
return mergedFeatures.Values.ToImmutableList();
}
public async override Task<IReadOnlyList<FeatureGroupDefinition>> GetGroupsAsync()
{
var staticGroups = await StaticStore.GetGroupsAsync();
var dynamicGroups = await DynamicStore.GetGroupsAsync();
var mergedGroups = new Dictionary<string, FeatureGroupDefinition>();
foreach (var staticGroup in staticGroups)
{
mergedGroups[staticGroup.Name] = staticGroup;
}
foreach (var dynamicGroup in dynamicGroups)
{
if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup))
{
MergeGroupFeatures(existingGroup, dynamicGroup);
}
else
{
mergedGroups[dynamicGroup.Name] = dynamicGroup;
}
}
return mergedGroups.Values.ToImmutableList();
}
private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source)
{
foreach (var sourceFeature in source.Features)
{
var existingFeature = GetFeatureOrNull(target, sourceFeature.Name);
if (existingFeature == null)
{
var newFeature = target.AddFeature(
sourceFeature.Name,
sourceFeature.DefaultValue,
sourceFeature.DisplayName,
sourceFeature.Description,
sourceFeature.ValueType,
sourceFeature.IsVisibleToClients,
sourceFeature.IsAvailableToHost
);
CopyFeatureDetails(sourceFeature, newFeature);
foreach (var child in sourceFeature.Children)
{
AddChildFeatureRecursively(newFeature, child);
}
}
else
{
MergeFeatureMetadata(existingFeature, sourceFeature);
foreach (var child in sourceFeature.Children)
{
MergeChildFeature(existingFeature, child);
}
}
}
}
private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild)
{
var newChild = parent.CreateChild(
sourceChild.Name,
sourceChild.DefaultValue,
sourceChild.DisplayName,
sourceChild.Description,
sourceChild.ValueType,
sourceChild.IsVisibleToClients,
sourceChild.IsAvailableToHost
);
CopyFeatureDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildFeatureRecursively(newChild, grandchild);
}
}
private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild)
{
var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name);
if (existingChild == null)
{
var newChild = parent.CreateChild(
sourceChild.Name,
sourceChild.DefaultValue,
sourceChild.DisplayName,
sourceChild.Description,
sourceChild.ValueType,
sourceChild.IsVisibleToClients,
sourceChild.IsAvailableToHost
);
CopyFeatureDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildFeatureRecursively(newChild, grandchild);
}
}
else
{
MergeFeatureMetadata(existingChild, sourceChild);
foreach (var grandchild in sourceChild.Children)
{
MergeChildFeature(existingChild, grandchild);
}
}
}
private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target)
{
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.AllowedProviders)
{
if (!target.AllowedProviders.Contains(provider))
{
target.AllowedProviders.Add(provider);
}
}
}
private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source)
{
if (source.DisplayName != null)
{
target.DisplayName = source.DisplayName;
}
if (source.Description != null)
{
target.Description = source.Description;
}
if (source.DefaultValue != null)
{
target.DefaultValue = source.DefaultValue;
}
if (source.ValueType != null)
{
target.ValueType = source.ValueType;
}
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.AllowedProviders)
{
if (!target.AllowedProviders.Contains(provider))
{
target.AllowedProviders.Add(provider);
}
}
target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients;
target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost;
}
public static FeatureDefinition? GetFeatureOrNull(
FeatureGroupDefinition group,
[NotNull] string name)
{
Check.NotNull(name, nameof(name));
return GetFeatureOrNullRecursively(group.Features, name);
}
private static FeatureDefinition? GetFeatureOrNullRecursively(
IReadOnlyList<FeatureDefinition> features,
string name)
{
foreach (var feature in features)
{
if (feature.Name == name)
{
return feature;
}
var childFeature = GetFeatureOrNullRecursively(feature.Children, name);
if (childFeature != null)
{
return childFeature;
}
}
return null;
}
}
#nullable disable

276
aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/Overrides/MergePermissionDefinitionManager.cs

@ -1,276 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.Authorization.Permissions;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergePermissionDefinitionManager : PermissionDefinitionManager
{
private readonly IStaticPermissionDefinitionStore _staticStore;
private readonly IDynamicPermissionDefinitionStore _dynamicStore;
public MergePermissionDefinitionManager(
IStaticPermissionDefinitionStore staticStore,
IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore)
{
_staticStore = staticStore;
_dynamicStore = dynamicStore;
}
public async override Task<PermissionDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await _staticStore.GetOrNullAsync(name);
var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergePermissionMetadata(staticDefinition, dynamicDefinition);
foreach (var grandchild in dynamicDefinition.Children)
{
MergeChildPermissions(staticDefinition, grandchild);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<PermissionDefinition?> GetResourcePermissionOrNullAsync(string resourceName, string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name);
var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergePermissionMetadata(staticDefinition, dynamicDefinition);
foreach (var grandchild in dynamicDefinition.Children)
{
MergeChildPermissions(staticDefinition, grandchild);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<PermissionDefinition>> GetPermissionsAsync()
{
var staticPermissions = await _staticStore.GetPermissionsAsync();
var dynamicPermissions = await _dynamicStore.GetPermissionsAsync();
return MergePermissions(staticPermissions, dynamicPermissions);
}
public async override Task<IReadOnlyList<PermissionDefinition>> GetResourcePermissionsAsync()
{
var staticPermissions = await _staticStore.GetResourcePermissionsAsync();
var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync();
return MergePermissions(staticPermissions, dynamicPermissions);
}
public async override Task<IReadOnlyList<PermissionGroupDefinition>> GetGroupsAsync()
{
var staticGroups = await _staticStore.GetGroupsAsync();
var dynamicGroups = await _dynamicStore.GetGroupsAsync();
var mergedGroups = new Dictionary<string, PermissionGroupDefinition>();
foreach (var staticGroup in staticGroups)
{
mergedGroups[staticGroup.Name] = staticGroup;
}
foreach (var dynamicGroup in dynamicGroups)
{
if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup))
{
MergeGroupPermissions(existingGroup, dynamicGroup);
}
else
{
mergedGroups[dynamicGroup.Name] = dynamicGroup;
}
}
return mergedGroups.Values.ToImmutableList();
}
private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source)
{
foreach (var sourcePermission in source.Permissions)
{
var existingPermission = target.GetPermissionOrNull(sourcePermission.Name);
if (existingPermission == null)
{
var newPermission = target.AddPermission(
sourcePermission.Name,
sourcePermission.DisplayName,
sourcePermission.MultiTenancySide,
sourcePermission.IsEnabled
);
CopyPermissionDetails(sourcePermission, newPermission);
foreach (var child in sourcePermission.Children)
{
AddChildPermissionRecursively(newPermission, child);
}
}
else
{
MergePermissionMetadata(existingPermission, sourcePermission);
foreach (var sourceChild in sourcePermission.Children)
{
MergeChildPermissions(existingPermission, sourceChild);
}
}
}
}
private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild)
{
var newChild = parent.AddChild(
sourceChild.Name,
sourceChild.DisplayName,
sourceChild.MultiTenancySide,
sourceChild.IsEnabled
);
CopyPermissionDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildPermissionRecursively(newChild, grandchild);
}
}
private static IReadOnlyList<PermissionDefinition> MergePermissions(IReadOnlyList<PermissionDefinition> staticPermissions, IReadOnlyList<PermissionDefinition> dynamicPermissions)
{
var mergedPermissions = new Dictionary<string, PermissionDefinition>();
foreach (var staticFeature in staticPermissions)
{
mergedPermissions[staticFeature.Name] = staticFeature;
}
foreach (var dynamicPermission in dynamicPermissions)
{
if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission))
{
MergePermissionMetadata(existingPermission, dynamicPermission);
foreach (var sourceChild in dynamicPermission.Children)
{
MergeChildPermissions(existingPermission, sourceChild);
}
}
else
{
mergedPermissions[dynamicPermission.Name] = dynamicPermission;
}
}
return mergedPermissions.Values.ToImmutableList();
}
private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild)
{
var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name);
if (existingChild == null)
{
var newChild = parent.AddChild(
sourceChild.Name,
sourceChild.DisplayName,
sourceChild.MultiTenancySide,
sourceChild.IsEnabled
);
CopyPermissionDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildPermissionRecursively(newChild, grandchild);
}
}
else
{
MergePermissionMetadata(existingChild, sourceChild);
foreach (var grandchild in sourceChild.Children)
{
MergeChildPermissions(existingChild, grandchild);
}
}
}
private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target)
{
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
foreach (var checker in source.StateCheckers)
{
if (!target.StateCheckers.Contains(checker))
{
target.StateCheckers.Add(checker);
}
}
}
private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source)
{
target.DisplayName = source.DisplayName;
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
foreach (var checker in source.StateCheckers)
{
if (!target.StateCheckers.Contains(checker))
{
target.StateCheckers.Add(checker);
}
}
if (source.MultiTenancySide != MultiTenancySides.Both)
{
target.MultiTenancySide |= source.MultiTenancySide;
}
target.IsEnabled = target.IsEnabled || source.IsEnabled;
}
}
#nullable disable

86
aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/Overrides/MergeSettingDefinitionManager.cs

@ -1,86 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Settings;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeSettingDefinitionManager : SettingDefinitionManager
{
public MergeSettingDefinitionManager(
IStaticSettingDefinitionStore staticStore,
IDynamicSettingDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<SettingDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeSetting(staticDefinition, dynamicDefinition);
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<SettingDefinition>> GetAllAsync()
{
var staticSettings = await StaticStore.GetAllAsync();
var dynamicSettings = await DynamicStore.GetAllAsync();
var mergedSettings = new Dictionary<string, SettingDefinition>();
foreach (var staticSetting in staticSettings)
{
mergedSettings[staticSetting.Name] = staticSetting;
}
foreach (var dynamicSetting in dynamicSettings)
{
if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting))
{
MergeSetting(existingSetting, dynamicSetting);
}
else
{
mergedSettings[dynamicSetting.Name] = dynamicSetting;
}
}
return mergedSettings.Values.ToImmutableList();
}
private static void MergeSetting(SettingDefinition target, SettingDefinition source)
{
target.DisplayName = source.DisplayName;
target.Description = source.Description ?? target.Description;
target.DefaultValue = source.DefaultValue ?? target.DefaultValue;
target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients;
target.IsInherited = target.IsInherited || source.IsInherited;
target.IsEncrypted = target.IsEncrypted || source.IsEncrypted;
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
}
}
#nullable disable

104
aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/Overrides/MergeTemplateDefinitionManager.cs

@ -1,104 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.TextTemplating;
namespace Volo.Abp.TextTemplatin;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeTemplateDefinitionManager : TemplateDefinitionManager
{
public MergeTemplateDefinitionManager(
IStaticTemplateDefinitionStore staticStore,
IDynamicTemplateDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<TemplateDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeTemplate(staticDefinition, dynamicDefinition);
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<TemplateDefinition>> GetAllAsync()
{
var staticTemplates = await StaticStore.GetAllAsync();
var dynamicTemplates = await DynamicStore.GetAllAsync();
var mergedTemplates = new Dictionary<string, TemplateDefinition>();
foreach (var staticTemplate in staticTemplates)
{
mergedTemplates[staticTemplate.Name] = staticTemplate;
}
foreach (var dynamicTemplate in dynamicTemplates)
{
if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate))
{
MergeTemplate(existingTemplate, dynamicTemplate);
}
else
{
mergedTemplates[dynamicTemplate.Name] = dynamicTemplate;
}
}
return mergedTemplates.Values.ToImmutableList();
}
private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate)
{
var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName;
var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName;
var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName;
var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout;
var layout = dynamicTemplate.Layout ?? staticTemplate.Layout;
var mergedTemplate = new TemplateDefinition(
staticTemplate.Name,
localizationResourceName,
displayName,
isLayout,
layout,
defaultCultureName
);
foreach (var property in staticTemplate.Properties)
{
mergedTemplate.Properties[property.Key] = property.Value;
}
foreach (var property in dynamicTemplate.Properties)
{
mergedTemplate.Properties[property.Key] = property.Value;
}
if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine))
{
mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine;
}
else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine))
{
mergedTemplate.RenderEngine = staticTemplate.RenderEngine;
}
mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized;
return mergedTemplate;
}
}
#nullable disable

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/WeChatServiceModule.cs

@ -3,6 +3,7 @@ using LINGYUN.Abp.AspNetCore.Mvc.Wrapper;
using LINGYUN.Abp.AuditLogging.Elasticsearch; using LINGYUN.Abp.AuditLogging.Elasticsearch;
using LINGYUN.Abp.Authorization.OrganizationUnits; using LINGYUN.Abp.Authorization.OrganizationUnits;
using LINGYUN.Abp.Claims.Mapping; using LINGYUN.Abp.Claims.Mapping;
using LINGYUN.Abp.Dynamic.Definitions;
using LINGYUN.Abp.EventBus.CAP; using LINGYUN.Abp.EventBus.CAP;
using LINGYUN.Abp.ExceptionHandling.Emailing; using LINGYUN.Abp.ExceptionHandling.Emailing;
using LINGYUN.Abp.Http.Client.Wrapper; using LINGYUN.Abp.Http.Client.Wrapper;
@ -79,6 +80,7 @@ namespace LINGYUN.Abp.MicroService.WeChatService;
typeof(AbpClaimsMappingModule), typeof(AbpClaimsMappingModule),
typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpAspNetCoreMvcWrapperModule),
typeof(AbpAspNetCoreHttpOverridesModule), typeof(AbpAspNetCoreHttpOverridesModule),
typeof(AbpDynamicDefinitionsModule),
typeof(AbpIdentitySessionAspNetCoreModule), typeof(AbpIdentitySessionAspNetCoreModule),
typeof(AbpAutofacModule) typeof(AbpAutofacModule)
)] )]

1
aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/LINGYUN.Abp.MicroService.WebhookService.csproj

@ -41,6 +41,7 @@
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj" />
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.ExceptionHandling.Emailing\LINGYUN.Abp.ExceptionHandling.Emailing.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.ExceptionHandling.Emailing\LINGYUN.Abp.ExceptionHandling.Emailing.csproj" />
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.Http.Client.Wrapper\LINGYUN.Abp.Http.Client.Wrapper.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.Http.Client.Wrapper\LINGYUN.Abp.Http.Client.Wrapper.csproj" />
<ProjectReference Include="..\..\framework\dynamic-definition\LINGYUN.Abp.Dynamic.Definitions\LINGYUN.Abp.Dynamic.Definitions.csproj" />
<ProjectReference Include="..\..\framework\mvc\LINGYUN.Abp.AspNetCore.Mvc.Wrapper\LINGYUN.Abp.AspNetCore.Mvc.Wrapper.csproj" /> <ProjectReference Include="..\..\framework\mvc\LINGYUN.Abp.AspNetCore.Mvc.Wrapper\LINGYUN.Abp.AspNetCore.Mvc.Wrapper.csproj" />
<ProjectReference Include="..\..\framework\auditing\LINGYUN.Abp.AuditLogging.Elasticsearch\LINGYUN.Abp.AuditLogging.Elasticsearch.csproj" /> <ProjectReference Include="..\..\framework\auditing\LINGYUN.Abp.AuditLogging.Elasticsearch\LINGYUN.Abp.AuditLogging.Elasticsearch.csproj" />
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.Data.DbMigrator\LINGYUN.Abp.Data.DbMigrator.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.Data.DbMigrator\LINGYUN.Abp.Data.DbMigrator.csproj" />

277
aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/Overrides/MergeFeatureDefinitionManager.cs

@ -1,277 +0,0 @@
using JetBrains.Annotations;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Features;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeFeatureDefinitionManager : FeatureDefinitionManager
{
public MergeFeatureDefinitionManager(
IStaticFeatureDefinitionStore staticStore,
IDynamicFeatureDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<FeatureDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeFeatureMetadata(staticDefinition, dynamicDefinition);
foreach (var child in dynamicDefinition.Children)
{
MergeChildFeature(staticDefinition, child);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<FeatureDefinition>> GetAllAsync()
{
var staticFeatures = await StaticStore.GetFeaturesAsync();
var dynamicFeatures = await DynamicStore.GetFeaturesAsync();
var mergedFeatures = new Dictionary<string, FeatureDefinition>();
foreach (var staticFeature in staticFeatures)
{
mergedFeatures[staticFeature.Name] = staticFeature;
}
foreach (var dynamicFeature in dynamicFeatures)
{
if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature))
{
MergeFeatureMetadata(existingFeature, dynamicFeature);
foreach (var child in dynamicFeature.Children)
{
MergeChildFeature(existingFeature, child);
}
}
else
{
mergedFeatures[dynamicFeature.Name] = dynamicFeature;
}
}
return mergedFeatures.Values.ToImmutableList();
}
public async override Task<IReadOnlyList<FeatureGroupDefinition>> GetGroupsAsync()
{
var staticGroups = await StaticStore.GetGroupsAsync();
var dynamicGroups = await DynamicStore.GetGroupsAsync();
var mergedGroups = new Dictionary<string, FeatureGroupDefinition>();
foreach (var staticGroup in staticGroups)
{
mergedGroups[staticGroup.Name] = staticGroup;
}
foreach (var dynamicGroup in dynamicGroups)
{
if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup))
{
MergeGroupFeatures(existingGroup, dynamicGroup);
}
else
{
mergedGroups[dynamicGroup.Name] = dynamicGroup;
}
}
return mergedGroups.Values.ToImmutableList();
}
private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source)
{
foreach (var sourceFeature in source.Features)
{
var existingFeature = GetFeatureOrNull(target, sourceFeature.Name);
if (existingFeature == null)
{
var newFeature = target.AddFeature(
sourceFeature.Name,
sourceFeature.DefaultValue,
sourceFeature.DisplayName,
sourceFeature.Description,
sourceFeature.ValueType,
sourceFeature.IsVisibleToClients,
sourceFeature.IsAvailableToHost
);
CopyFeatureDetails(sourceFeature, newFeature);
foreach (var child in sourceFeature.Children)
{
AddChildFeatureRecursively(newFeature, child);
}
}
else
{
MergeFeatureMetadata(existingFeature, sourceFeature);
foreach (var child in sourceFeature.Children)
{
MergeChildFeature(existingFeature, child);
}
}
}
}
private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild)
{
var newChild = parent.CreateChild(
sourceChild.Name,
sourceChild.DefaultValue,
sourceChild.DisplayName,
sourceChild.Description,
sourceChild.ValueType,
sourceChild.IsVisibleToClients,
sourceChild.IsAvailableToHost
);
CopyFeatureDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildFeatureRecursively(newChild, grandchild);
}
}
private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild)
{
var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name);
if (existingChild == null)
{
var newChild = parent.CreateChild(
sourceChild.Name,
sourceChild.DefaultValue,
sourceChild.DisplayName,
sourceChild.Description,
sourceChild.ValueType,
sourceChild.IsVisibleToClients,
sourceChild.IsAvailableToHost
);
CopyFeatureDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildFeatureRecursively(newChild, grandchild);
}
}
else
{
MergeFeatureMetadata(existingChild, sourceChild);
foreach (var grandchild in sourceChild.Children)
{
MergeChildFeature(existingChild, grandchild);
}
}
}
private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target)
{
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.AllowedProviders)
{
if (!target.AllowedProviders.Contains(provider))
{
target.AllowedProviders.Add(provider);
}
}
}
private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source)
{
if (source.DisplayName != null)
{
target.DisplayName = source.DisplayName;
}
if (source.Description != null)
{
target.Description = source.Description;
}
if (source.DefaultValue != null)
{
target.DefaultValue = source.DefaultValue;
}
if (source.ValueType != null)
{
target.ValueType = source.ValueType;
}
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.AllowedProviders)
{
if (!target.AllowedProviders.Contains(provider))
{
target.AllowedProviders.Add(provider);
}
}
target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients;
target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost;
}
public static FeatureDefinition? GetFeatureOrNull(
FeatureGroupDefinition group,
[NotNull] string name)
{
Check.NotNull(name, nameof(name));
return GetFeatureOrNullRecursively(group.Features, name);
}
private static FeatureDefinition? GetFeatureOrNullRecursively(
IReadOnlyList<FeatureDefinition> features,
string name)
{
foreach (var feature in features)
{
if (feature.Name == name)
{
return feature;
}
var childFeature = GetFeatureOrNullRecursively(feature.Children, name);
if (childFeature != null)
{
return childFeature;
}
}
return null;
}
}
#nullable disable

276
aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/Overrides/MergePermissionDefinitionManager.cs

@ -1,276 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.Authorization.Permissions;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergePermissionDefinitionManager : PermissionDefinitionManager
{
private readonly IStaticPermissionDefinitionStore _staticStore;
private readonly IDynamicPermissionDefinitionStore _dynamicStore;
public MergePermissionDefinitionManager(
IStaticPermissionDefinitionStore staticStore,
IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore)
{
_staticStore = staticStore;
_dynamicStore = dynamicStore;
}
public async override Task<PermissionDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await _staticStore.GetOrNullAsync(name);
var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergePermissionMetadata(staticDefinition, dynamicDefinition);
foreach (var grandchild in dynamicDefinition.Children)
{
MergeChildPermissions(staticDefinition, grandchild);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<PermissionDefinition?> GetResourcePermissionOrNullAsync(string resourceName, string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name);
var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergePermissionMetadata(staticDefinition, dynamicDefinition);
foreach (var grandchild in dynamicDefinition.Children)
{
MergeChildPermissions(staticDefinition, grandchild);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<PermissionDefinition>> GetPermissionsAsync()
{
var staticPermissions = await _staticStore.GetPermissionsAsync();
var dynamicPermissions = await _dynamicStore.GetPermissionsAsync();
return MergePermissions(staticPermissions, dynamicPermissions);
}
public async override Task<IReadOnlyList<PermissionDefinition>> GetResourcePermissionsAsync()
{
var staticPermissions = await _staticStore.GetResourcePermissionsAsync();
var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync();
return MergePermissions(staticPermissions, dynamicPermissions);
}
public async override Task<IReadOnlyList<PermissionGroupDefinition>> GetGroupsAsync()
{
var staticGroups = await _staticStore.GetGroupsAsync();
var dynamicGroups = await _dynamicStore.GetGroupsAsync();
var mergedGroups = new Dictionary<string, PermissionGroupDefinition>();
foreach (var staticGroup in staticGroups)
{
mergedGroups[staticGroup.Name] = staticGroup;
}
foreach (var dynamicGroup in dynamicGroups)
{
if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup))
{
MergeGroupPermissions(existingGroup, dynamicGroup);
}
else
{
mergedGroups[dynamicGroup.Name] = dynamicGroup;
}
}
return mergedGroups.Values.ToImmutableList();
}
private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source)
{
foreach (var sourcePermission in source.Permissions)
{
var existingPermission = target.GetPermissionOrNull(sourcePermission.Name);
if (existingPermission == null)
{
var newPermission = target.AddPermission(
sourcePermission.Name,
sourcePermission.DisplayName,
sourcePermission.MultiTenancySide,
sourcePermission.IsEnabled
);
CopyPermissionDetails(sourcePermission, newPermission);
foreach (var child in sourcePermission.Children)
{
AddChildPermissionRecursively(newPermission, child);
}
}
else
{
MergePermissionMetadata(existingPermission, sourcePermission);
foreach (var sourceChild in sourcePermission.Children)
{
MergeChildPermissions(existingPermission, sourceChild);
}
}
}
}
private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild)
{
var newChild = parent.AddChild(
sourceChild.Name,
sourceChild.DisplayName,
sourceChild.MultiTenancySide,
sourceChild.IsEnabled
);
CopyPermissionDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildPermissionRecursively(newChild, grandchild);
}
}
private static IReadOnlyList<PermissionDefinition> MergePermissions(IReadOnlyList<PermissionDefinition> staticPermissions, IReadOnlyList<PermissionDefinition> dynamicPermissions)
{
var mergedPermissions = new Dictionary<string, PermissionDefinition>();
foreach (var staticFeature in staticPermissions)
{
mergedPermissions[staticFeature.Name] = staticFeature;
}
foreach (var dynamicPermission in dynamicPermissions)
{
if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission))
{
MergePermissionMetadata(existingPermission, dynamicPermission);
foreach (var sourceChild in dynamicPermission.Children)
{
MergeChildPermissions(existingPermission, sourceChild);
}
}
else
{
mergedPermissions[dynamicPermission.Name] = dynamicPermission;
}
}
return mergedPermissions.Values.ToImmutableList();
}
private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild)
{
var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name);
if (existingChild == null)
{
var newChild = parent.AddChild(
sourceChild.Name,
sourceChild.DisplayName,
sourceChild.MultiTenancySide,
sourceChild.IsEnabled
);
CopyPermissionDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildPermissionRecursively(newChild, grandchild);
}
}
else
{
MergePermissionMetadata(existingChild, sourceChild);
foreach (var grandchild in sourceChild.Children)
{
MergeChildPermissions(existingChild, grandchild);
}
}
}
private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target)
{
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
foreach (var checker in source.StateCheckers)
{
if (!target.StateCheckers.Contains(checker))
{
target.StateCheckers.Add(checker);
}
}
}
private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source)
{
target.DisplayName = source.DisplayName;
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
foreach (var checker in source.StateCheckers)
{
if (!target.StateCheckers.Contains(checker))
{
target.StateCheckers.Add(checker);
}
}
if (source.MultiTenancySide != MultiTenancySides.Both)
{
target.MultiTenancySide |= source.MultiTenancySide;
}
target.IsEnabled = target.IsEnabled || source.IsEnabled;
}
}
#nullable disable

86
aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/Overrides/MergeSettingDefinitionManager.cs

@ -1,86 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Settings;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeSettingDefinitionManager : SettingDefinitionManager
{
public MergeSettingDefinitionManager(
IStaticSettingDefinitionStore staticStore,
IDynamicSettingDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<SettingDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeSetting(staticDefinition, dynamicDefinition);
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<SettingDefinition>> GetAllAsync()
{
var staticSettings = await StaticStore.GetAllAsync();
var dynamicSettings = await DynamicStore.GetAllAsync();
var mergedSettings = new Dictionary<string, SettingDefinition>();
foreach (var staticSetting in staticSettings)
{
mergedSettings[staticSetting.Name] = staticSetting;
}
foreach (var dynamicSetting in dynamicSettings)
{
if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting))
{
MergeSetting(existingSetting, dynamicSetting);
}
else
{
mergedSettings[dynamicSetting.Name] = dynamicSetting;
}
}
return mergedSettings.Values.ToImmutableList();
}
private static void MergeSetting(SettingDefinition target, SettingDefinition source)
{
target.DisplayName = source.DisplayName;
target.Description = source.Description ?? target.Description;
target.DefaultValue = source.DefaultValue ?? target.DefaultValue;
target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients;
target.IsInherited = target.IsInherited || source.IsInherited;
target.IsEncrypted = target.IsEncrypted || source.IsEncrypted;
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
}
}
#nullable disable

104
aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/Overrides/MergeTemplateDefinitionManager.cs

@ -1,104 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.TextTemplating;
namespace Volo.Abp.TextTemplatin;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeTemplateDefinitionManager : TemplateDefinitionManager
{
public MergeTemplateDefinitionManager(
IStaticTemplateDefinitionStore staticStore,
IDynamicTemplateDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<TemplateDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeTemplate(staticDefinition, dynamicDefinition);
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<TemplateDefinition>> GetAllAsync()
{
var staticTemplates = await StaticStore.GetAllAsync();
var dynamicTemplates = await DynamicStore.GetAllAsync();
var mergedTemplates = new Dictionary<string, TemplateDefinition>();
foreach (var staticTemplate in staticTemplates)
{
mergedTemplates[staticTemplate.Name] = staticTemplate;
}
foreach (var dynamicTemplate in dynamicTemplates)
{
if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate))
{
MergeTemplate(existingTemplate, dynamicTemplate);
}
else
{
mergedTemplates[dynamicTemplate.Name] = dynamicTemplate;
}
}
return mergedTemplates.Values.ToImmutableList();
}
private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate)
{
var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName;
var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName;
var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName;
var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout;
var layout = dynamicTemplate.Layout ?? staticTemplate.Layout;
var mergedTemplate = new TemplateDefinition(
staticTemplate.Name,
localizationResourceName,
displayName,
isLayout,
layout,
defaultCultureName
);
foreach (var property in staticTemplate.Properties)
{
mergedTemplate.Properties[property.Key] = property.Value;
}
foreach (var property in dynamicTemplate.Properties)
{
mergedTemplate.Properties[property.Key] = property.Value;
}
if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine))
{
mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine;
}
else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine))
{
mergedTemplate.RenderEngine = staticTemplate.RenderEngine;
}
mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized;
return mergedTemplate;
}
}
#nullable disable

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/WebhookServiceModule.cs

@ -6,6 +6,7 @@ using LINGYUN.Abp.BackgroundTasks.DistributedLocking;
using LINGYUN.Abp.BackgroundTasks.Quartz; using LINGYUN.Abp.BackgroundTasks.Quartz;
using LINGYUN.Abp.Claims.Mapping; using LINGYUN.Abp.Claims.Mapping;
using LINGYUN.Abp.Dapr.Client.Wrapper; using LINGYUN.Abp.Dapr.Client.Wrapper;
using LINGYUN.Abp.Dynamic.Definitions;
using LINGYUN.Abp.Emailing.Platform; using LINGYUN.Abp.Emailing.Platform;
using LINGYUN.Abp.EventBus.CAP; using LINGYUN.Abp.EventBus.CAP;
using LINGYUN.Abp.ExceptionHandling.Emailing; using LINGYUN.Abp.ExceptionHandling.Emailing;
@ -62,6 +63,7 @@ namespace LINGYUN.Abp.MicroService.WebhookService;
typeof(AbpSmsPlatformModule), typeof(AbpSmsPlatformModule),
typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpAspNetCoreMvcWrapperModule),
typeof(AbpAspNetCoreHttpOverridesModule), typeof(AbpAspNetCoreHttpOverridesModule),
typeof(AbpDynamicDefinitionsModule),
typeof(AbpIdentitySessionAspNetCoreModule), typeof(AbpIdentitySessionAspNetCoreModule),
typeof(AbpAutofacModule) typeof(AbpAutofacModule)
)] )]

1
aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/LINGYUN.Abp.MicroService.WorkflowService.csproj

@ -52,6 +52,7 @@
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.Data.DbMigrator\LINGYUN.Abp.Data.DbMigrator.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.Data.DbMigrator\LINGYUN.Abp.Data.DbMigrator.csproj" />
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.ExceptionHandling.Emailing\LINGYUN.Abp.ExceptionHandling.Emailing.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.ExceptionHandling.Emailing\LINGYUN.Abp.ExceptionHandling.Emailing.csproj" />
<ProjectReference Include="..\..\framework\common\LINGYUN.Abp.Http.Client.Wrapper\LINGYUN.Abp.Http.Client.Wrapper.csproj" /> <ProjectReference Include="..\..\framework\common\LINGYUN.Abp.Http.Client.Wrapper\LINGYUN.Abp.Http.Client.Wrapper.csproj" />
<ProjectReference Include="..\..\framework\dynamic-definition\LINGYUN.Abp.Dynamic.Definitions\LINGYUN.Abp.Dynamic.Definitions.csproj" />
<ProjectReference Include="..\..\framework\localization\LINGYUN.Abp.Localization.CultureMap\LINGYUN.Abp.Localization.CultureMap.csproj" /> <ProjectReference Include="..\..\framework\localization\LINGYUN.Abp.Localization.CultureMap\LINGYUN.Abp.Localization.CultureMap.csproj" />
<ProjectReference Include="..\..\framework\logging\LINGYUN.Abp.Serilog.Enrichers.Application\LINGYUN.Abp.Serilog.Enrichers.Application.csproj" /> <ProjectReference Include="..\..\framework\logging\LINGYUN.Abp.Serilog.Enrichers.Application\LINGYUN.Abp.Serilog.Enrichers.Application.csproj" />
<ProjectReference Include="..\..\framework\logging\LINGYUN.Abp.Serilog.Enrichers.UniqueId\LINGYUN.Abp.Serilog.Enrichers.UniqueId.csproj" /> <ProjectReference Include="..\..\framework\logging\LINGYUN.Abp.Serilog.Enrichers.UniqueId\LINGYUN.Abp.Serilog.Enrichers.UniqueId.csproj" />

277
aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/Overrides/MergeFeatureDefinitionManager.cs

@ -1,277 +0,0 @@
using JetBrains.Annotations;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Features;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeFeatureDefinitionManager : FeatureDefinitionManager
{
public MergeFeatureDefinitionManager(
IStaticFeatureDefinitionStore staticStore,
IDynamicFeatureDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<FeatureDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeFeatureMetadata(staticDefinition, dynamicDefinition);
foreach (var child in dynamicDefinition.Children)
{
MergeChildFeature(staticDefinition, child);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<FeatureDefinition>> GetAllAsync()
{
var staticFeatures = await StaticStore.GetFeaturesAsync();
var dynamicFeatures = await DynamicStore.GetFeaturesAsync();
var mergedFeatures = new Dictionary<string, FeatureDefinition>();
foreach (var staticFeature in staticFeatures)
{
mergedFeatures[staticFeature.Name] = staticFeature;
}
foreach (var dynamicFeature in dynamicFeatures)
{
if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature))
{
MergeFeatureMetadata(existingFeature, dynamicFeature);
foreach (var child in dynamicFeature.Children)
{
MergeChildFeature(existingFeature, child);
}
}
else
{
mergedFeatures[dynamicFeature.Name] = dynamicFeature;
}
}
return mergedFeatures.Values.ToImmutableList();
}
public async override Task<IReadOnlyList<FeatureGroupDefinition>> GetGroupsAsync()
{
var staticGroups = await StaticStore.GetGroupsAsync();
var dynamicGroups = await DynamicStore.GetGroupsAsync();
var mergedGroups = new Dictionary<string, FeatureGroupDefinition>();
foreach (var staticGroup in staticGroups)
{
mergedGroups[staticGroup.Name] = staticGroup;
}
foreach (var dynamicGroup in dynamicGroups)
{
if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup))
{
MergeGroupFeatures(existingGroup, dynamicGroup);
}
else
{
mergedGroups[dynamicGroup.Name] = dynamicGroup;
}
}
return mergedGroups.Values.ToImmutableList();
}
private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source)
{
foreach (var sourceFeature in source.Features)
{
var existingFeature = GetFeatureOrNull(target, sourceFeature.Name);
if (existingFeature == null)
{
var newFeature = target.AddFeature(
sourceFeature.Name,
sourceFeature.DefaultValue,
sourceFeature.DisplayName,
sourceFeature.Description,
sourceFeature.ValueType,
sourceFeature.IsVisibleToClients,
sourceFeature.IsAvailableToHost
);
CopyFeatureDetails(sourceFeature, newFeature);
foreach (var child in sourceFeature.Children)
{
AddChildFeatureRecursively(newFeature, child);
}
}
else
{
MergeFeatureMetadata(existingFeature, sourceFeature);
foreach (var child in sourceFeature.Children)
{
MergeChildFeature(existingFeature, child);
}
}
}
}
private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild)
{
var newChild = parent.CreateChild(
sourceChild.Name,
sourceChild.DefaultValue,
sourceChild.DisplayName,
sourceChild.Description,
sourceChild.ValueType,
sourceChild.IsVisibleToClients,
sourceChild.IsAvailableToHost
);
CopyFeatureDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildFeatureRecursively(newChild, grandchild);
}
}
private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild)
{
var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name);
if (existingChild == null)
{
var newChild = parent.CreateChild(
sourceChild.Name,
sourceChild.DefaultValue,
sourceChild.DisplayName,
sourceChild.Description,
sourceChild.ValueType,
sourceChild.IsVisibleToClients,
sourceChild.IsAvailableToHost
);
CopyFeatureDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildFeatureRecursively(newChild, grandchild);
}
}
else
{
MergeFeatureMetadata(existingChild, sourceChild);
foreach (var grandchild in sourceChild.Children)
{
MergeChildFeature(existingChild, grandchild);
}
}
}
private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target)
{
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.AllowedProviders)
{
if (!target.AllowedProviders.Contains(provider))
{
target.AllowedProviders.Add(provider);
}
}
}
private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source)
{
if (source.DisplayName != null)
{
target.DisplayName = source.DisplayName;
}
if (source.Description != null)
{
target.Description = source.Description;
}
if (source.DefaultValue != null)
{
target.DefaultValue = source.DefaultValue;
}
if (source.ValueType != null)
{
target.ValueType = source.ValueType;
}
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.AllowedProviders)
{
if (!target.AllowedProviders.Contains(provider))
{
target.AllowedProviders.Add(provider);
}
}
target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients;
target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost;
}
public static FeatureDefinition? GetFeatureOrNull(
FeatureGroupDefinition group,
[NotNull] string name)
{
Check.NotNull(name, nameof(name));
return GetFeatureOrNullRecursively(group.Features, name);
}
private static FeatureDefinition? GetFeatureOrNullRecursively(
IReadOnlyList<FeatureDefinition> features,
string name)
{
foreach (var feature in features)
{
if (feature.Name == name)
{
return feature;
}
var childFeature = GetFeatureOrNullRecursively(feature.Children, name);
if (childFeature != null)
{
return childFeature;
}
}
return null;
}
}
#nullable disable

276
aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/Overrides/MergePermissionDefinitionManager.cs

@ -1,276 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.Authorization.Permissions;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergePermissionDefinitionManager : PermissionDefinitionManager
{
private readonly IStaticPermissionDefinitionStore _staticStore;
private readonly IDynamicPermissionDefinitionStore _dynamicStore;
public MergePermissionDefinitionManager(
IStaticPermissionDefinitionStore staticStore,
IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore)
{
_staticStore = staticStore;
_dynamicStore = dynamicStore;
}
public async override Task<PermissionDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await _staticStore.GetOrNullAsync(name);
var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergePermissionMetadata(staticDefinition, dynamicDefinition);
foreach (var grandchild in dynamicDefinition.Children)
{
MergeChildPermissions(staticDefinition, grandchild);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<PermissionDefinition?> GetResourcePermissionOrNullAsync(string resourceName, string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name);
var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergePermissionMetadata(staticDefinition, dynamicDefinition);
foreach (var grandchild in dynamicDefinition.Children)
{
MergeChildPermissions(staticDefinition, grandchild);
}
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<PermissionDefinition>> GetPermissionsAsync()
{
var staticPermissions = await _staticStore.GetPermissionsAsync();
var dynamicPermissions = await _dynamicStore.GetPermissionsAsync();
return MergePermissions(staticPermissions, dynamicPermissions);
}
public async override Task<IReadOnlyList<PermissionDefinition>> GetResourcePermissionsAsync()
{
var staticPermissions = await _staticStore.GetResourcePermissionsAsync();
var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync();
return MergePermissions(staticPermissions, dynamicPermissions);
}
public async override Task<IReadOnlyList<PermissionGroupDefinition>> GetGroupsAsync()
{
var staticGroups = await _staticStore.GetGroupsAsync();
var dynamicGroups = await _dynamicStore.GetGroupsAsync();
var mergedGroups = new Dictionary<string, PermissionGroupDefinition>();
foreach (var staticGroup in staticGroups)
{
mergedGroups[staticGroup.Name] = staticGroup;
}
foreach (var dynamicGroup in dynamicGroups)
{
if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup))
{
MergeGroupPermissions(existingGroup, dynamicGroup);
}
else
{
mergedGroups[dynamicGroup.Name] = dynamicGroup;
}
}
return mergedGroups.Values.ToImmutableList();
}
private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source)
{
foreach (var sourcePermission in source.Permissions)
{
var existingPermission = target.GetPermissionOrNull(sourcePermission.Name);
if (existingPermission == null)
{
var newPermission = target.AddPermission(
sourcePermission.Name,
sourcePermission.DisplayName,
sourcePermission.MultiTenancySide,
sourcePermission.IsEnabled
);
CopyPermissionDetails(sourcePermission, newPermission);
foreach (var child in sourcePermission.Children)
{
AddChildPermissionRecursively(newPermission, child);
}
}
else
{
MergePermissionMetadata(existingPermission, sourcePermission);
foreach (var sourceChild in sourcePermission.Children)
{
MergeChildPermissions(existingPermission, sourceChild);
}
}
}
}
private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild)
{
var newChild = parent.AddChild(
sourceChild.Name,
sourceChild.DisplayName,
sourceChild.MultiTenancySide,
sourceChild.IsEnabled
);
CopyPermissionDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildPermissionRecursively(newChild, grandchild);
}
}
private static IReadOnlyList<PermissionDefinition> MergePermissions(IReadOnlyList<PermissionDefinition> staticPermissions, IReadOnlyList<PermissionDefinition> dynamicPermissions)
{
var mergedPermissions = new Dictionary<string, PermissionDefinition>();
foreach (var staticFeature in staticPermissions)
{
mergedPermissions[staticFeature.Name] = staticFeature;
}
foreach (var dynamicPermission in dynamicPermissions)
{
if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission))
{
MergePermissionMetadata(existingPermission, dynamicPermission);
foreach (var sourceChild in dynamicPermission.Children)
{
MergeChildPermissions(existingPermission, sourceChild);
}
}
else
{
mergedPermissions[dynamicPermission.Name] = dynamicPermission;
}
}
return mergedPermissions.Values.ToImmutableList();
}
private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild)
{
var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name);
if (existingChild == null)
{
var newChild = parent.AddChild(
sourceChild.Name,
sourceChild.DisplayName,
sourceChild.MultiTenancySide,
sourceChild.IsEnabled
);
CopyPermissionDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildPermissionRecursively(newChild, grandchild);
}
}
else
{
MergePermissionMetadata(existingChild, sourceChild);
foreach (var grandchild in sourceChild.Children)
{
MergeChildPermissions(existingChild, grandchild);
}
}
}
private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target)
{
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
foreach (var checker in source.StateCheckers)
{
if (!target.StateCheckers.Contains(checker))
{
target.StateCheckers.Add(checker);
}
}
}
private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source)
{
target.DisplayName = source.DisplayName;
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
foreach (var checker in source.StateCheckers)
{
if (!target.StateCheckers.Contains(checker))
{
target.StateCheckers.Add(checker);
}
}
if (source.MultiTenancySide != MultiTenancySides.Both)
{
target.MultiTenancySide |= source.MultiTenancySide;
}
target.IsEnabled = target.IsEnabled || source.IsEnabled;
}
}
#nullable disable

86
aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/Overrides/MergeSettingDefinitionManager.cs

@ -1,86 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Settings;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeSettingDefinitionManager : SettingDefinitionManager
{
public MergeSettingDefinitionManager(
IStaticSettingDefinitionStore staticStore,
IDynamicSettingDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<SettingDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeSetting(staticDefinition, dynamicDefinition);
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<SettingDefinition>> GetAllAsync()
{
var staticSettings = await StaticStore.GetAllAsync();
var dynamicSettings = await DynamicStore.GetAllAsync();
var mergedSettings = new Dictionary<string, SettingDefinition>();
foreach (var staticSetting in staticSettings)
{
mergedSettings[staticSetting.Name] = staticSetting;
}
foreach (var dynamicSetting in dynamicSettings)
{
if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting))
{
MergeSetting(existingSetting, dynamicSetting);
}
else
{
mergedSettings[dynamicSetting.Name] = dynamicSetting;
}
}
return mergedSettings.Values.ToImmutableList();
}
private static void MergeSetting(SettingDefinition target, SettingDefinition source)
{
target.DisplayName = source.DisplayName;
target.Description = source.Description ?? target.Description;
target.DefaultValue = source.DefaultValue ?? target.DefaultValue;
target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients;
target.IsInherited = target.IsInherited || source.IsInherited;
target.IsEncrypted = target.IsEncrypted || source.IsEncrypted;
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
}
}
#nullable disable

104
aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/Overrides/MergeTemplateDefinitionManager.cs

@ -1,104 +0,0 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.TextTemplating;
namespace Volo.Abp.TextTemplatin;
#nullable enable
[Dependency(ReplaceServices = true)]
public class MergeTemplateDefinitionManager : TemplateDefinitionManager
{
public MergeTemplateDefinitionManager(
IStaticTemplateDefinitionStore staticStore,
IDynamicTemplateDefinitionStore dynamicStore)
: base(staticStore, dynamicStore)
{
}
public async override Task<TemplateDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
if (staticDefinition != null && dynamicDefinition != null)
{
MergeTemplate(staticDefinition, dynamicDefinition);
}
return staticDefinition ?? dynamicDefinition;
}
public async override Task<IReadOnlyList<TemplateDefinition>> GetAllAsync()
{
var staticTemplates = await StaticStore.GetAllAsync();
var dynamicTemplates = await DynamicStore.GetAllAsync();
var mergedTemplates = new Dictionary<string, TemplateDefinition>();
foreach (var staticTemplate in staticTemplates)
{
mergedTemplates[staticTemplate.Name] = staticTemplate;
}
foreach (var dynamicTemplate in dynamicTemplates)
{
if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate))
{
MergeTemplate(existingTemplate, dynamicTemplate);
}
else
{
mergedTemplates[dynamicTemplate.Name] = dynamicTemplate;
}
}
return mergedTemplates.Values.ToImmutableList();
}
private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate)
{
var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName;
var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName;
var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName;
var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout;
var layout = dynamicTemplate.Layout ?? staticTemplate.Layout;
var mergedTemplate = new TemplateDefinition(
staticTemplate.Name,
localizationResourceName,
displayName,
isLayout,
layout,
defaultCultureName
);
foreach (var property in staticTemplate.Properties)
{
mergedTemplate.Properties[property.Key] = property.Value;
}
foreach (var property in dynamicTemplate.Properties)
{
mergedTemplate.Properties[property.Key] = property.Value;
}
if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine))
{
mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine;
}
else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine))
{
mergedTemplate.RenderEngine = staticTemplate.RenderEngine;
}
mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized;
return mergedTemplate;
}
}
#nullable disable

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/WorkflowServiceModule.cs

@ -7,6 +7,7 @@ using LINGYUN.Abp.BackgroundTasks.Quartz;
using LINGYUN.Abp.BlobStoring.BlobManagement; using LINGYUN.Abp.BlobStoring.BlobManagement;
using LINGYUN.Abp.Claims.Mapping; using LINGYUN.Abp.Claims.Mapping;
using LINGYUN.Abp.Data.DbMigrator; using LINGYUN.Abp.Data.DbMigrator;
using LINGYUN.Abp.Dynamic.Definitions;
using LINGYUN.Abp.Elsa; using LINGYUN.Abp.Elsa;
using LINGYUN.Abp.Elsa.Activities; using LINGYUN.Abp.Elsa.Activities;
using LINGYUN.Abp.Elsa.EntityFrameworkCore.PostgreSql; using LINGYUN.Abp.Elsa.EntityFrameworkCore.PostgreSql;
@ -84,6 +85,7 @@ namespace LINGYUN.Abp.MicroService.WorkflowService;
typeof(AbpClaimsMappingModule), typeof(AbpClaimsMappingModule),
typeof(AbpAspNetCoreMvcNewtonsoftModule), typeof(AbpAspNetCoreMvcNewtonsoftModule),
typeof(AbpAspNetCoreHttpOverridesModule), typeof(AbpAspNetCoreHttpOverridesModule),
typeof(AbpDynamicDefinitionsModule),
typeof(AbpIdentitySessionAspNetCoreModule), typeof(AbpIdentitySessionAspNetCoreModule),
typeof(AbpAutofacModule) typeof(AbpAutofacModule)
)] )]

3
aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/FodyWeavers.xml

@ -0,0 +1,3 @@
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
<ConfigureAwait ContinueOnCapturedContext="false" />
</Weavers>

30
aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/FodyWeavers.xsd

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- This file was generated by Fody. Manual changes to this file will be lost when your project is rebuilt. -->
<xs:element name="Weavers">
<xs:complexType>
<xs:all>
<xs:element name="ConfigureAwait" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:attribute name="ContinueOnCapturedContext" type="xs:boolean" />
</xs:complexType>
</xs:element>
</xs:all>
<xs:attribute name="VerifyAssembly" type="xs:boolean">
<xs:annotation>
<xs:documentation>'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="VerifyIgnoreCodes" type="xs:string">
<xs:annotation>
<xs:documentation>A comma-separated list of error codes that can be safely ignored in assembly verification.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="GenerateXsd" type="xs:boolean">
<xs:annotation>
<xs:documentation>'false' to turn off automatic generation of the XML Schema file.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:schema>

20
aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN.Abp.Dynamic.Definitions.Core.csproj

@ -0,0 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\..\configureawait.props" />
<Import Project="..\..\..\..\common.props" />
<PropertyGroup>
<TargetFrameworks>netstandard2.0;netstandard2.1;net8.0;net9.0;net10.0</TargetFrameworks>
<AssemblyName>LINGYUN.Abp.Dynamic.Definitions.Core</AssemblyName>
<PackageId>LINGYUN.Abp.Dynamic.Definitions.Core</PackageId>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.Core" />
</ItemGroup>
</Project>

8
aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN/Abp/Dynamic/Definitions/AbpDynamicDefinitionsCoreModule.cs

@ -0,0 +1,8 @@
using Volo.Abp.Modularity;
namespace LINGYUN.Abp.Dynamic.Definitions;
public class AbpDynamicDefinitionsCoreModule : AbpModule
{
}

35
aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN/Abp/Dynamic/Definitions/AbpDynamicDefinitionsOptions.cs

@ -0,0 +1,35 @@
using System;
using System.Collections.Generic;
namespace LINGYUN.Abp.Dynamic.Definitions;
public class AbpDynamicDefinitionsOptions
{
public DynamicDefinitionStrategy DefaultStrategy { get; set; }
public Dictionary<Type, DynamicDefinitionStrategy> DefinitionStrategy { get; set; }
public AbpDynamicDefinitionsOptions()
{
DefaultStrategy = DynamicDefinitionStrategy.Static;
DefinitionStrategy = new Dictionary<Type, DynamicDefinitionStrategy>();
}
public void MapStrategy<T>(DynamicDefinitionStrategy strategy = DynamicDefinitionStrategy.Static)
{
DefinitionStrategy[typeof(T)] = strategy;
}
public DynamicDefinitionStrategy GetStrategy<T>()
{
return GetStrategy(typeof(T));
}
public DynamicDefinitionStrategy GetStrategy(Type type)
{
if (DefinitionStrategy.TryGetValue(type, out var strategy))
{
return strategy;
}
return DefaultStrategy;
}
}

240
aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN/Abp/Dynamic/Definitions/DynamicDefinitionManager.cs

@ -0,0 +1,240 @@
using Microsoft.Extensions.Options;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
namespace LINGYUN.Abp.Dynamic.Definitions;
public abstract class DynamicDefinitionManager<TGroupDefinition, TDefinition> : DynamicDefinitionManager<TDefinition>
{
protected DynamicDefinitionManager(
IOptions<AbpDynamicDefinitionsOptions> options) : base(options)
{
}
public async virtual Task<TGroupDefinition?> GetGroupDefinitionAsync(
TGroupDefinition? staticGroupDefinition,
TGroupDefinition? dynamicGroupDefinition)
{
if (staticGroupDefinition != null && dynamicGroupDefinition != null)
{
var strategy = Options.GetStrategy<TGroupDefinition>();
switch (strategy)
{
case DynamicDefinitionStrategy.Dynamic:
return dynamicGroupDefinition;
case DynamicDefinitionStrategy.Merge:
await MergeGroupDefinitionAsync(staticGroupDefinition, dynamicGroupDefinition);
return staticGroupDefinition;
case DynamicDefinitionStrategy.Static:
default:
return staticGroupDefinition;
}
}
return staticGroupDefinition ?? dynamicGroupDefinition;
}
public async virtual Task<IReadOnlyList<TGroupDefinition>> GetGroupDefinitionsAsync(
IReadOnlyList<TGroupDefinition> staticGroupDefinitions,
IReadOnlyList<TGroupDefinition> dynamicGroupDefinitions)
{
var strategy = Options.GetStrategy<TGroupDefinition>();
return strategy switch
{
DynamicDefinitionStrategy.Dynamic => await GetDynamicGroupDefinitionsAsync(staticGroupDefinitions, dynamicGroupDefinitions),
DynamicDefinitionStrategy.Merge => await GetMergedGroupDefinitionsAsync(staticGroupDefinitions, dynamicGroupDefinitions),
_ => await GetStaticGroupDefinitionsAsync(staticGroupDefinitions, dynamicGroupDefinitions),
};
}
protected virtual Task<IReadOnlyList<TGroupDefinition>> GetStaticGroupDefinitionsAsync(
IReadOnlyList<TGroupDefinition> staticGroupDefinitions,
IReadOnlyList<TGroupDefinition> dynamicGroupDefinitions)
{
var staticDefinitionKeys = staticGroupDefinitions
.Select(GetGroupDefinitionKey)
.ToImmutableHashSet();
return Task.FromResult<IReadOnlyList<TGroupDefinition>>(
staticGroupDefinitions
.Concat(dynamicGroupDefinitions.Where(d => !staticDefinitionKeys.Contains(GetGroupDefinitionKey(d))))
.ToImmutableList()
);
}
protected virtual Task<IReadOnlyList<TGroupDefinition>> GetDynamicGroupDefinitionsAsync(
IReadOnlyList<TGroupDefinition> staticGroupDefinitions,
IReadOnlyList<TGroupDefinition> dynamicGroupDefinitions)
{
var dynamicDefinitionKeys = dynamicGroupDefinitions
.Select(GetGroupDefinitionKey)
.ToImmutableHashSet();
return Task.FromResult<IReadOnlyList<TGroupDefinition>>(
dynamicGroupDefinitions
.Concat(staticGroupDefinitions.Where(s => !dynamicDefinitionKeys.Contains(GetGroupDefinitionKey(s))))
.ToImmutableList()
);
}
protected async virtual Task<IReadOnlyList<TGroupDefinition>> GetMergedGroupDefinitionsAsync(
IReadOnlyList<TGroupDefinition> staticGroupDefinitions,
IReadOnlyList<TGroupDefinition> dynamicGroupDefinitions)
{
var mergedGroups = new Dictionary<string, TGroupDefinition>();
foreach (var staticGroup in staticGroupDefinitions)
{
mergedGroups[GetGroupDefinitionKey(staticGroup)] = staticGroup;
}
foreach (var dynamicGroup in dynamicGroupDefinitions)
{
if (mergedGroups.TryGetValue(GetGroupDefinitionKey(dynamicGroup), out var existingGroup))
{
await BeforeMergeGroupDefinitionAsync(existingGroup, dynamicGroup);
await MergeGroupDefinitionAsync(existingGroup, dynamicGroup);
await AfterMergeGroupDefinitionAsync(existingGroup, dynamicGroup);
}
else
{
mergedGroups[GetGroupDefinitionKey(dynamicGroup)] = dynamicGroup;
}
}
await AfterMergedGroupDefinitionsAsync(mergedGroups);
return mergedGroups.Values.ToImmutableList();
}
protected abstract string GetGroupDefinitionKey(TGroupDefinition groupDefinition);
protected abstract Task MergeGroupDefinitionAsync(TGroupDefinition targetGroupDefinition, TGroupDefinition sourceGroupDefinition);
protected virtual Task BeforeMergeGroupDefinitionAsync(TGroupDefinition targetGroupDefinition, TGroupDefinition sourceGroupDefinition)
{
return Task.CompletedTask;
}
protected virtual Task AfterMergeGroupDefinitionAsync(TGroupDefinition targetGroupDefinition, TGroupDefinition sourceGroupDefinition)
{
return Task.CompletedTask;
}
protected virtual Task AfterMergedGroupDefinitionsAsync(Dictionary<string, TGroupDefinition> mergedDefinitions)
{
return Task.CompletedTask;
}
}
public abstract class DynamicDefinitionManager<TDefinition>
{
protected AbpDynamicDefinitionsOptions Options { get; }
protected DynamicDefinitionManager(IOptions<AbpDynamicDefinitionsOptions> options)
{
Options = options.Value;
}
public async virtual Task<TDefinition?> GetDefinitionAsync(TDefinition? staticDefinition, TDefinition? dynamicDefinition)
{
if (staticDefinition != null && dynamicDefinition != null)
{
var strategy = Options.GetStrategy<TDefinition>();
return strategy switch
{
DynamicDefinitionStrategy.Static => staticDefinition,
DynamicDefinitionStrategy.Dynamic => dynamicDefinition,
DynamicDefinitionStrategy.Merge => await MergeDefinitionAsync(staticDefinition, dynamicDefinition),
_ => staticDefinition
};
}
return staticDefinition ?? dynamicDefinition;
}
public async virtual Task<IReadOnlyList<TDefinition>> GetDefinitionsAsync(IReadOnlyList<TDefinition> staticDefinitions, IReadOnlyList<TDefinition> dynamicDefinitions)
{
var strategy = Options.GetStrategy<TDefinition>();
return strategy switch
{
DynamicDefinitionStrategy.Dynamic => await GetDynamicDefinitionsAsync(staticDefinitions, dynamicDefinitions),
DynamicDefinitionStrategy.Merge => await GetMergedDefinitionsAsync(staticDefinitions, dynamicDefinitions),
_ => await GetStaticDefinitionsAsync(staticDefinitions, dynamicDefinitions),
};
}
protected virtual Task<IReadOnlyList<TDefinition>> GetStaticDefinitionsAsync(IReadOnlyList<TDefinition> staticDefinitions, IReadOnlyList<TDefinition> dynamicDefinitions)
{
var staticDefinitionKeys = staticDefinitions
.Select(GetDefinitionKey)
.ToImmutableHashSet();
return Task.FromResult<IReadOnlyList<TDefinition>>(
staticDefinitions
.Concat(dynamicDefinitions.Where(d => !staticDefinitionKeys.Contains(GetDefinitionKey(d))))
.ToImmutableList()
);
}
protected virtual Task<IReadOnlyList<TDefinition>> GetDynamicDefinitionsAsync(IReadOnlyList<TDefinition> staticDefinitions, IReadOnlyList<TDefinition> dynamicDefinitions)
{
var dynamicDefinitionKeys = dynamicDefinitions
.Select(GetDefinitionKey)
.ToImmutableHashSet();
return Task.FromResult<IReadOnlyList<TDefinition>>(
dynamicDefinitions
.Concat(staticDefinitions.Where(s => !dynamicDefinitionKeys.Contains(GetDefinitionKey(s))))
.ToImmutableList()
);
}
protected async virtual Task<IReadOnlyList<TDefinition>> GetMergedDefinitionsAsync(IReadOnlyList<TDefinition> staticDefinitions, IReadOnlyList<TDefinition> dynamicDefinitions)
{
var mergedDefinitions = new Dictionary<string, TDefinition>();
foreach (var staticDefinition in staticDefinitions)
{
mergedDefinitions[GetDefinitionKey(staticDefinition)] = staticDefinition;
}
foreach (var dynamicDefinition in dynamicDefinitions)
{
if (mergedDefinitions.TryGetValue(GetDefinitionKey(dynamicDefinition), out var existingDefinition))
{
await BeforeMergeDefinitionAsync(existingDefinition, dynamicDefinition);
await MergeDefinitionAsync(existingDefinition, dynamicDefinition);
await AfterMergeDefinitionAsync(existingDefinition, dynamicDefinition);
}
else
{
mergedDefinitions[GetDefinitionKey(dynamicDefinition)] = dynamicDefinition;
}
}
await AfterMergedDefinitionsAsync(mergedDefinitions);
return mergedDefinitions.Values.ToImmutableList();
}
protected abstract string GetDefinitionKey(TDefinition definition);
protected abstract Task<TDefinition> MergeDefinitionAsync(TDefinition targetDefinition, TDefinition sourceDefinition);
protected virtual Task BeforeMergeDefinitionAsync(TDefinition targetDefinition, TDefinition sourceDefinition)
{
return Task.CompletedTask;
}
protected virtual Task AfterMergeDefinitionAsync(TDefinition targetDefinition, TDefinition sourceDefinition)
{
return Task.CompletedTask;
}
protected virtual Task AfterMergedDefinitionsAsync(Dictionary<string, TDefinition> mergedDefinitions)
{
return Task.CompletedTask;
}
}

8
aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN/Abp/Dynamic/Definitions/DynamicDefinitionStrategy.cs

@ -0,0 +1,8 @@
namespace LINGYUN.Abp.Dynamic.Definitions;
public enum DynamicDefinitionStrategy
{
Static = 0,
Dynamic = 1,
Merge = 2,
}

3
aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/FodyWeavers.xml

@ -0,0 +1,3 @@
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
<ConfigureAwait ContinueOnCapturedContext="false" />
</Weavers>

30
aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/FodyWeavers.xsd

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- This file was generated by Fody. Manual changes to this file will be lost when your project is rebuilt. -->
<xs:element name="Weavers">
<xs:complexType>
<xs:all>
<xs:element name="ConfigureAwait" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:attribute name="ContinueOnCapturedContext" type="xs:boolean" />
</xs:complexType>
</xs:element>
</xs:all>
<xs:attribute name="VerifyAssembly" type="xs:boolean">
<xs:annotation>
<xs:documentation>'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="VerifyIgnoreCodes" type="xs:string">
<xs:annotation>
<xs:documentation>A comma-separated list of error codes that can be safely ignored in assembly verification.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="GenerateXsd" type="xs:boolean">
<xs:annotation>
<xs:documentation>'false' to turn off automatic generation of the XML Schema file.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:schema>

27
aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN.Abp.Dynamic.Definitions.csproj

@ -0,0 +1,27 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\..\configureawait.props" />
<Import Project="..\..\..\..\common.props" />
<PropertyGroup>
<TargetFrameworks>netstandard2.0;netstandard2.1;net8.0;net9.0;net10.0</TargetFrameworks>
<AssemblyName>LINGYUN.Abp.Dynamic.Definitions</AssemblyName>
<PackageId>LINGYUN.Abp.Dynamic.Definitions</PackageId>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.Authorization" />
<PackageReference Include="Volo.Abp.Features" />
<PackageReference Include="Volo.Abp.Settings" />
<PackageReference Include="Volo.Abp.TextTemplating.Core" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\LINGYUN.Abp.Dynamic.Definitions.Core\LINGYUN.Abp.Dynamic.Definitions.Core.csproj" />
</ItemGroup>
</Project>

32
aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN/Abp/Dynamic/Definitions/AbpDynamicDefinitionsModule.cs

@ -0,0 +1,32 @@
using Volo.Abp.Authorization;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Features;
using Volo.Abp.Modularity;
using Volo.Abp.Settings;
using Volo.Abp.TextTemplating;
namespace LINGYUN.Abp.Dynamic.Definitions;
[DependsOn(
typeof(AbpFeaturesModule),
typeof(AbpAuthorizationModule),
typeof(AbpTextTemplatingCoreModule),
typeof(AbpDynamicDefinitionsCoreModule))]
public class AbpDynamicDefinitionsModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpDynamicDefinitionsOptions>(options =>
{
options.MapStrategy<FeatureDefinition>(DynamicDefinitionStrategy.Merge);
options.MapStrategy<FeatureGroupDefinition>(DynamicDefinitionStrategy.Merge);
options.MapStrategy<PermissionDefinition>(DynamicDefinitionStrategy.Merge);
options.MapStrategy<PermissionGroupDefinition>(DynamicDefinitionStrategy.Merge);
options.MapStrategy<SettingDefinition>(DynamicDefinitionStrategy.Merge);
options.MapStrategy<TemplateDefinition>(DynamicDefinitionStrategy.Merge);
});
}
}

253
aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN/Abp/Dynamic/Definitions/FeatureDynamicDefinitionManager.cs

@ -0,0 +1,253 @@
using JetBrains.Annotations;
using Microsoft.Extensions.Options;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Features;
namespace LINGYUN.Abp.Dynamic.Definitions;
[Dependency(ReplaceServices = true)]
[ExposeServices(
typeof(IFeatureDefinitionManager),
typeof(FeatureDynamicDefinitionManager))]
public class FeatureDynamicDefinitionManager :
DynamicDefinitionManager<FeatureGroupDefinition, FeatureDefinition>,
IFeatureDefinitionManager,
ISingletonDependency
{
protected IStaticFeatureDefinitionStore StaticStore { get; }
protected IDynamicFeatureDefinitionStore DynamicStore { get; }
public FeatureDynamicDefinitionManager(
IStaticFeatureDefinitionStore staticStore,
IDynamicFeatureDefinitionStore dynamicStore,
IOptions<AbpDynamicDefinitionsOptions> options)
: base(options)
{
StaticStore = staticStore;
DynamicStore = dynamicStore;
}
public async virtual Task<IReadOnlyList<FeatureDefinition>> GetAllAsync()
{
var staticDefinitions = await StaticStore.GetFeaturesAsync();
var dynamicDefinitions = await DynamicStore.GetFeaturesAsync();
return await GetDefinitionsAsync(staticDefinitions, dynamicDefinitions);
}
public async virtual Task<FeatureDefinition> GetAsync(string name)
{
return await GetOrNullAsync(name) ?? throw new AbpException("Undefined feature: " + name);
}
public async virtual Task<IReadOnlyList<FeatureGroupDefinition>> GetGroupsAsync()
{
var staticGroupDefinitions = await StaticStore.GetGroupsAsync();
var dynamicGroupDefinitions = await DynamicStore.GetGroupsAsync();
return await GetGroupDefinitionsAsync(staticGroupDefinitions, dynamicGroupDefinitions);
}
public async virtual Task<FeatureDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
return await GetDefinitionAsync(staticDefinition, dynamicDefinition);
}
protected override string GetDefinitionKey(FeatureDefinition definition)
{
return definition.Name;
}
protected override string GetGroupDefinitionKey(FeatureGroupDefinition groupDefinition)
{
return groupDefinition.Name;
}
protected override Task<FeatureDefinition> MergeDefinitionAsync(FeatureDefinition targetDefinition, FeatureDefinition sourceDefinition)
{
targetDefinition.DisplayName = sourceDefinition.DisplayName;
if (sourceDefinition.Description != null)
{
targetDefinition.Description = sourceDefinition.Description;
}
if (sourceDefinition.DefaultValue != null)
{
targetDefinition.DefaultValue = sourceDefinition.DefaultValue;
}
if (sourceDefinition.ValueType != null)
{
targetDefinition.ValueType = sourceDefinition.ValueType;
}
targetDefinition.IsVisibleToClients = targetDefinition.IsVisibleToClients || sourceDefinition.IsVisibleToClients;
targetDefinition.IsAvailableToHost = targetDefinition.IsAvailableToHost || sourceDefinition.IsAvailableToHost;
CopyFeatureDetails(targetDefinition, sourceDefinition);
return Task.FromResult(targetDefinition);
}
protected async override Task AfterMergeDefinitionAsync(FeatureDefinition targetDefinition, FeatureDefinition sourceDefinition)
{
foreach (var child in sourceDefinition.Children)
{
await MergeChildFeature(targetDefinition, child);
}
}
protected async override Task MergeGroupDefinitionAsync(FeatureGroupDefinition targetGroupDefinition, FeatureGroupDefinition sourceGroupDefinition)
{
if (sourceGroupDefinition.DisplayName != null)
{
targetGroupDefinition.DisplayName = sourceGroupDefinition.DisplayName;
}
foreach (var property in sourceGroupDefinition.Properties)
{
targetGroupDefinition.Properties[property.Key] = property.Value;
}
foreach (var sourceFeature in sourceGroupDefinition.Features)
{
var existingFeature = GetFeatureOrNull(targetGroupDefinition, sourceFeature.Name);
if (existingFeature == null)
{
var newFeature = targetGroupDefinition.AddFeature(
sourceFeature.Name,
sourceFeature.DefaultValue,
sourceFeature.DisplayName,
sourceFeature.Description,
sourceFeature.ValueType,
sourceFeature.IsVisibleToClients,
sourceFeature.IsAvailableToHost
);
CopyFeatureDetails(sourceFeature, newFeature);
foreach (var child in sourceFeature.Children)
{
AddChildFeatureRecursively(newFeature, child);
}
}
else
{
await MergeDefinitionAsync(existingFeature, sourceFeature);
foreach (var child in sourceFeature.Children)
{
await MergeChildFeature(existingFeature, child);
}
}
}
}
private async Task MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild)
{
var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name);
if (existingChild == null)
{
var newChild = parent.CreateChild(
sourceChild.Name,
sourceChild.DefaultValue,
sourceChild.DisplayName,
sourceChild.Description,
sourceChild.ValueType,
sourceChild.IsVisibleToClients,
sourceChild.IsAvailableToHost
);
CopyFeatureDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildFeatureRecursively(newChild, grandchild);
}
}
else
{
await MergeDefinitionAsync(existingChild, sourceChild);
foreach (var grandchild in sourceChild.Children)
{
await MergeChildFeature(existingChild, grandchild);
}
}
}
private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild)
{
var newChild = parent.CreateChild(
sourceChild.Name,
sourceChild.DefaultValue,
sourceChild.DisplayName,
sourceChild.Description,
sourceChild.ValueType,
sourceChild.IsVisibleToClients,
sourceChild.IsAvailableToHost
);
CopyFeatureDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildFeatureRecursively(newChild, grandchild);
}
}
private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target)
{
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.AllowedProviders)
{
if (!target.AllowedProviders.Contains(provider))
{
target.AllowedProviders.Add(provider);
}
}
}
public static FeatureDefinition? GetFeatureOrNull(
FeatureGroupDefinition group,
[NotNull] string name)
{
Check.NotNull(name, nameof(name));
return GetFeatureOrNullRecursively(group.Features, name);
}
private static FeatureDefinition? GetFeatureOrNullRecursively(
IReadOnlyList<FeatureDefinition> features,
string name)
{
foreach (var feature in features)
{
if (feature.Name == name)
{
return feature;
}
var childFeature = GetFeatureOrNullRecursively(feature.Children, name);
if (childFeature != null)
{
return childFeature;
}
}
return null;
}
}

249
aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN/Abp/Dynamic/Definitions/PermissionDynamicDefinitionManager.cs

@ -0,0 +1,249 @@
using Microsoft.Extensions.Options;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
namespace LINGYUN.Abp.Dynamic.Definitions;
[Dependency(ReplaceServices = true)]
[ExposeServices(
typeof(IPermissionDefinitionManager),
typeof(PermissionDynamicDefinitionManager))]
public class PermissionDynamicDefinitionManager :
DynamicDefinitionManager<PermissionGroupDefinition, PermissionDefinition>,
IPermissionDefinitionManager,
ITransientDependency
{
protected IStaticPermissionDefinitionStore StaticStore { get; }
protected IDynamicPermissionDefinitionStore DynamicStore { get; }
public PermissionDynamicDefinitionManager(
IStaticPermissionDefinitionStore staticStore,
IDynamicPermissionDefinitionStore dynamicStore,
IOptions<AbpDynamicDefinitionsOptions> options) : base(options)
{
StaticStore = staticStore;
DynamicStore = dynamicStore;
}
public async virtual Task<PermissionDefinition> GetAsync(string name)
{
return await GetOrNullAsync(name) ?? throw new AbpException("Undefined permission: " + name);
}
public async virtual Task<IReadOnlyList<PermissionGroupDefinition>> GetGroupsAsync()
{
var staticGroupDefinitions = await StaticStore.GetGroupsAsync();
var dynamicGroupDefinitions = await DynamicStore.GetGroupsAsync();
return await GetGroupDefinitionsAsync(staticGroupDefinitions, dynamicGroupDefinitions);
}
public async virtual Task<PermissionDefinition?> GetOrNullAsync(string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetOrNullAsync(name);
var dynamicDefinition = await DynamicStore.GetOrNullAsync(name);
return await GetDefinitionAsync(staticDefinition, dynamicDefinition);
}
public async virtual Task<IReadOnlyList<PermissionDefinition>> GetPermissionsAsync()
{
var staticDefinitions = await StaticStore.GetPermissionsAsync();
var dynamicDefinitions = await DynamicStore.GetPermissionsAsync();
return await GetDefinitionsAsync(staticDefinitions, dynamicDefinitions);
}
public async virtual Task<PermissionDefinition> GetResourcePermissionAsync(string resourceName, string name)
{
return await GetResourcePermissionOrNullAsync(resourceName, name)
?? throw new AbpException($"Undefined resource permission: {name} for resource: {resourceName}");
}
public async virtual Task<PermissionDefinition?> GetResourcePermissionOrNullAsync(string resourceName, string name)
{
Check.NotNull(name, nameof(name));
var staticDefinition = await StaticStore.GetResourcePermissionOrNullAsync(resourceName, name);
var dynamicDefinition = await DynamicStore.GetResourcePermissionOrNullAsync(resourceName, name);
return await GetDefinitionAsync(staticDefinition, dynamicDefinition);
}
public async virtual Task<IReadOnlyList<PermissionDefinition>> GetResourcePermissionsAsync()
{
var staticDefinitions = await StaticStore.GetResourcePermissionsAsync();
var dynamicDefinitions = await DynamicStore.GetResourcePermissionsAsync();
return await GetDefinitionsAsync(staticDefinitions, dynamicDefinitions);
}
protected override string GetDefinitionKey(PermissionDefinition definition)
{
return definition.Name;
}
protected override string GetGroupDefinitionKey(PermissionGroupDefinition groupDefinition)
{
return groupDefinition.Name;
}
protected override Task<PermissionDefinition> MergeDefinitionAsync(PermissionDefinition targetDefinition, PermissionDefinition sourceDefinition)
{
targetDefinition.DisplayName = sourceDefinition.DisplayName;
if (sourceDefinition.ResourceName != null)
{
targetDefinition.ResourceName = sourceDefinition.ResourceName;
}
if (sourceDefinition.ManagementPermissionName != null)
{
targetDefinition.ManagementPermissionName = sourceDefinition.ManagementPermissionName;
}
if (sourceDefinition.MultiTenancySide != MultiTenancySides.Both)
{
targetDefinition.MultiTenancySide |= sourceDefinition.MultiTenancySide;
}
targetDefinition.IsEnabled = targetDefinition.IsEnabled || sourceDefinition.IsEnabled;
CopyPermissionDetails(targetDefinition, sourceDefinition);
return Task.FromResult(targetDefinition);
}
protected async override Task MergeGroupDefinitionAsync(PermissionGroupDefinition targetGroupDefinition, PermissionGroupDefinition sourceGroupDefinition)
{
if (sourceGroupDefinition.DisplayName != null)
{
targetGroupDefinition.DisplayName = sourceGroupDefinition.DisplayName;
}
foreach (var property in sourceGroupDefinition.Properties)
{
targetGroupDefinition.Properties[property.Key] = property.Value;
}
foreach (var sourcePermission in sourceGroupDefinition.Permissions)
{
var existingPermission = targetGroupDefinition.GetPermissionOrNull(sourcePermission.Name);
if (existingPermission == null)
{
var newPermission = targetGroupDefinition.AddPermission(
sourcePermission.Name,
sourcePermission.DisplayName,
sourcePermission.MultiTenancySide,
sourcePermission.IsEnabled
);
newPermission.ResourceName = sourcePermission.ResourceName;
newPermission.ManagementPermissionName = sourcePermission.ManagementPermissionName;
CopyPermissionDetails(sourcePermission, newPermission);
foreach (var child in sourcePermission.Children)
{
AddChildPermissionRecursively(newPermission, child);
}
}
else
{
await MergeDefinitionAsync(existingPermission, sourcePermission);
foreach (var sourceChild in sourcePermission.Children)
{
await MergeChildPermissions(existingPermission, sourceChild);
}
}
}
}
protected async override Task AfterMergeDefinitionAsync(PermissionDefinition targetDefinition, PermissionDefinition sourceDefinition)
{
foreach (var child in sourceDefinition.Children)
{
await MergeChildPermissions(targetDefinition, child);
}
}
private async Task MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild)
{
var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name);
if (existingChild == null)
{
var newChild = parent.AddChild(
sourceChild.Name,
sourceChild.DisplayName,
sourceChild.MultiTenancySide,
sourceChild.IsEnabled
);
newChild.ResourceName = sourceChild.ResourceName;
newChild.ManagementPermissionName = sourceChild.ManagementPermissionName;
CopyPermissionDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildPermissionRecursively(newChild, grandchild);
}
}
else
{
await MergeDefinitionAsync(existingChild, sourceChild);
foreach (var grandchild in sourceChild.Children)
{
await MergeChildPermissions(existingChild, grandchild);
}
}
}
private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild)
{
var newChild = parent.AddChild(
sourceChild.Name,
sourceChild.DisplayName,
sourceChild.MultiTenancySide,
sourceChild.IsEnabled
);
newChild.ResourceName = sourceChild.ResourceName;
newChild.ManagementPermissionName = sourceChild.ManagementPermissionName;
CopyPermissionDetails(sourceChild, newChild);
foreach (var grandchild in sourceChild.Children)
{
AddChildPermissionRecursively(newChild, grandchild);
}
}
private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target)
{
foreach (var property in source.Properties)
{
target.Properties[property.Key] = property.Value;
}
foreach (var provider in source.Providers)
{
if (!target.Providers.Contains(provider))
{
target.Providers.Add(provider);
}
}
foreach (var checker in source.StateCheckers)
{
if (!target.StateCheckers.Contains(checker))
{
target.StateCheckers.Add(checker);
}
}
}
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save