From 64b3247460c04a59cc85a5d0ac9702668a23afef Mon Sep 17 00:00:00 2001 From: jxnkwlp Date: Sat, 30 Nov 2024 01:02:57 +0800 Subject: [PATCH] feat: add audit logging application services --- Sample.sln | 48 ++++++++ clear.ps1 | 1 + .../Sample.Application.csproj | 1 + .../SampleApplicationModule.cs | 2 + host/src/Sample.Domain/Sample.Domain.csproj | 1 + host/src/Sample.Domain/SampleDomainModule.cs | 2 + .../Sample.HttpApi.Client.csproj | 1 + .../Sample.HttpApi.Host.csproj | 3 +- .../SampleHttpApiHostModule.cs | 32 +++++- .../wwwroot/swagger/ui/index.js | 66 +++++++++++ host/src/Sample.HttpApi/Sample.HttpApi.csproj | 3 +- .../src/Sample.HttpApi/SampleHttpApiModule.cs | 2 + modules/audit-logging/common.props | 5 + .../AuditLogActionDto.cs | 25 +++++ .../AuditLogCleanupRequestDto.cs | 9 ++ .../AuditLogCleanupSettingsDto.cs | 8 ++ .../AuditLogDto.cs | 55 +++++++++ .../AuditLogListRequestDto.cs | 23 ++++ .../AuditLoggingApplicationContractsModule.cs | 14 +++ .../AuditLoggingRemoteServiceConsts.cs | 8 ++ .../EntityChangeDto.cs | 29 +++++ .../EntityChangeListRequestDto.cs | 15 +++ .../EntityPropertyChangeDto.cs | 20 ++++ .../FodyWeavers.xml | 3 + .../FodyWeavers.xsd | 30 +++++ .../IAuditLogAppService.cs | 15 +++ .../IAuditLogCleanupAppService.cs | 9 ++ .../IAuditLogSettingAppService.cs | 10 ++ .../IEntityChangeAppService.cs | 13 +++ ....AuditLogging.Application.Contracts.abppkg | 3 + ....AuditLogging.Application.Contracts.csproj | 16 +++ ...uditLoggingPermissionDefinitionProvider.cs | 28 +++++ .../Permissions/AuditLoggingPermissions.cs | 33 ++++++ .../AuditLogAppService.cs | 71 ++++++++++++ .../AuditLogCleanupAppService.cs | 22 ++++ .../AuditLogSettingAppService.cs | 37 ++++++ .../AuditLoggingAppServiceBase.cs | 13 +++ ...uditLoggingApplicationAutoMapperProfile.cs | 15 +++ .../AuditLoggingApplicationModule.cs | 21 ++++ .../EntityChangeAppService.cs | 51 +++++++++ .../FodyWeavers.xml | 3 + .../FodyWeavers.xsd | 30 +++++ ...ngwind.Abp.AuditLogging.Application.abppkg | 3 + ...ngwind.Abp.AuditLogging.Application.csproj | 17 +++ .../AuditLogCleanupBehavior.cs | 8 ++ .../AuditLoggingDomainSharedModule.cs | 32 ++++++ .../FodyWeavers.xml | 3 + .../FodyWeavers.xsd | 30 +++++ .../Localization/AuditLogging/en.json | 11 ++ .../Localization/AuditLogging/zh-Hans.json | 11 ++ .../Localization/AuditLoggingResource.cs | 8 ++ ...wind.Abp.AuditLogging.Domain.Shared.abppkg | 3 + ...wind.Abp.AuditLogging.Domain.Shared.csproj | 25 +++++ .../AuditLoggingDomainModule.cs | 32 ++++++ .../AuditLogCleanupBackgroundWorker.cs | 31 +++++ .../Cleanup/AuditLogCleanupSettingManager.cs | 52 +++++++++ .../Cleanup/AuditLogCleanupSettings.cs | 13 +++ .../Cleanup/DefaultAuditLogCleanupProvider.cs | 37 ++++++ .../Cleanup/DefaultAuditLogCleanupRunner.cs | 61 ++++++++++ .../Cleanup/IAuditLogCleanupProvider.cs | 11 ++ .../Cleanup/IAuditLogCleanupRunner.cs | 11 ++ .../Cleanup/IAuditLogCleanupSettingManager.cs | 10 ++ .../Providers/DefaultDeleteProvider.cs | 26 +++++ .../Providers/DefaultSaveToFileProvider.cs | 106 ++++++++++++++++++ .../IAuditLogCleanupDeleteProvider.cs | 10 ++ .../IAuditLogCleanupSaveToFileProvider.cs | 10 ++ .../FodyWeavers.xml | 3 + .../FodyWeavers.xsd | 30 +++++ .../Options/AuditLoggingCleanupOptions.cs | 14 +++ ...Passingwind.Abp.AuditLogging.Domain.abppkg | 3 + ...Passingwind.Abp.AuditLogging.Domain.csproj | 20 ++++ .../AuditLoggingSettingDefinitionProvider.cs | 17 +++ .../Settings/AuditLoggingSettingNames.cs | 15 +++ .../AuditLoggingHttpApiClientModule.cs | 22 ++++ .../FodyWeavers.xml | 3 + .../FodyWeavers.xsd | 30 +++++ ...ind.Abp.AuditLogging.HttpApi.Client.abppkg | 3 + ...ind.Abp.AuditLogging.HttpApi.Client.csproj | 20 ++++ .../AuditLogCleanupController.cs | 26 +++++ .../AuditLogController.cs | 42 +++++++ .../AuditLogSettingController.cs | 33 ++++++ .../AuditLoggingHttpApiModule.cs | 29 +++++ .../EntityChangeController.cs | 35 ++++++ .../FodyWeavers.xml | 3 + .../FodyWeavers.xsd | 30 +++++ ...assingwind.Abp.AuditLogging.HttpApi.abppkg | 3 + ...assingwind.Abp.AuditLogging.HttpApi.csproj | 15 +++ 87 files changed, 1747 insertions(+), 6 deletions(-) create mode 100644 clear.ps1 create mode 100644 host/src/Sample.HttpApi.Host/wwwroot/swagger/ui/index.js create mode 100644 modules/audit-logging/common.props create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/AuditLogActionDto.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/AuditLogCleanupRequestDto.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/AuditLogCleanupSettingsDto.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/AuditLogDto.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/AuditLogListRequestDto.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/AuditLoggingApplicationContractsModule.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/AuditLoggingRemoteServiceConsts.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/EntityChangeDto.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/EntityChangeListRequestDto.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/EntityPropertyChangeDto.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/FodyWeavers.xml create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/FodyWeavers.xsd create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/IAuditLogAppService.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/IAuditLogCleanupAppService.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/IAuditLogSettingAppService.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/IEntityChangeAppService.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/Passingwind.Abp.AuditLogging.Application.Contracts.abppkg create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/Passingwind.Abp.AuditLogging.Application.Contracts.csproj create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/Permissions/AuditLoggingPermissionDefinitionProvider.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/Permissions/AuditLoggingPermissions.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/AuditLogAppService.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/AuditLogCleanupAppService.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/AuditLogSettingAppService.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/AuditLoggingAppServiceBase.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/AuditLoggingApplicationAutoMapperProfile.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/AuditLoggingApplicationModule.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/EntityChangeAppService.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/FodyWeavers.xml create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/FodyWeavers.xsd create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/Passingwind.Abp.AuditLogging.Application.abppkg create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/Passingwind.Abp.AuditLogging.Application.csproj create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/AuditLogCleanupBehavior.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/AuditLoggingDomainSharedModule.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/FodyWeavers.xml create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/FodyWeavers.xsd create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/Localization/AuditLogging/en.json create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/Localization/AuditLogging/zh-Hans.json create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/Localization/AuditLoggingResource.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/Passingwind.Abp.AuditLogging.Domain.Shared.abppkg create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/Passingwind.Abp.AuditLogging.Domain.Shared.csproj create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/AuditLoggingDomainModule.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/AuditLogCleanupBackgroundWorker.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/AuditLogCleanupSettingManager.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/AuditLogCleanupSettings.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/DefaultAuditLogCleanupProvider.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/DefaultAuditLogCleanupRunner.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/IAuditLogCleanupProvider.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/IAuditLogCleanupRunner.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/IAuditLogCleanupSettingManager.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/Providers/DefaultDeleteProvider.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/Providers/DefaultSaveToFileProvider.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/Providers/IAuditLogCleanupDeleteProvider.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/Providers/IAuditLogCleanupSaveToFileProvider.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/FodyWeavers.xml create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/FodyWeavers.xsd create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Options/AuditLoggingCleanupOptions.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Passingwind.Abp.AuditLogging.Domain.abppkg create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Passingwind.Abp.AuditLogging.Domain.csproj create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Settings/AuditLoggingSettingDefinitionProvider.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Settings/AuditLoggingSettingNames.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi.Client/AuditLoggingHttpApiClientModule.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi.Client/FodyWeavers.xml create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi.Client/FodyWeavers.xsd create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi.Client/Passingwind.Abp.AuditLogging.HttpApi.Client.abppkg create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi.Client/Passingwind.Abp.AuditLogging.HttpApi.Client.csproj create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/AuditLogCleanupController.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/AuditLogController.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/AuditLogSettingController.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/AuditLoggingHttpApiModule.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/EntityChangeController.cs create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/FodyWeavers.xml create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/FodyWeavers.xsd create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/Passingwind.Abp.AuditLogging.HttpApi.abppkg create mode 100644 modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/Passingwind.Abp.AuditLogging.HttpApi.csproj diff --git a/Sample.sln b/Sample.sln index 3c7258f..b479ad0 100644 --- a/Sample.sln +++ b/Sample.sln @@ -185,6 +185,22 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Passingwind.Abp.DictionaryM EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Passingwind.Abp.DictionaryManagement.MongoDB.Tests", "modules\dictionary-management\test\Passingwind.Abp.DictionaryManagement.MongoDB.Tests\Passingwind.Abp.DictionaryManagement.MongoDB.Tests.csproj", "{F60E2974-A7C7-41EF-96E8-23E38619E98F}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "audit-logging", "audit-logging", "{88AD1592-7C36-44AC-8E47-5CBE9AB69560}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{2567C22F-1B70-4D19-83EE-CF6AA99A4554}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Passingwind.Abp.AuditLogging.Domain.Shared", "modules\audit-logging\src\Passingwind.Abp.AuditLogging.Domain.Shared\Passingwind.Abp.AuditLogging.Domain.Shared.csproj", "{AF753833-EA02-4D79-A7A1-B54E3519139D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Passingwind.Abp.AuditLogging.Domain", "modules\audit-logging\src\Passingwind.Abp.AuditLogging.Domain\Passingwind.Abp.AuditLogging.Domain.csproj", "{B192F772-5006-48F3-9971-1F4CAE552859}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Passingwind.Abp.AuditLogging.Application.Contracts", "modules\audit-logging\src\Passingwind.Abp.AuditLogging.Application.Contracts\Passingwind.Abp.AuditLogging.Application.Contracts.csproj", "{D20826A3-F38A-4AEA-A649-13BFA2569A37}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Passingwind.Abp.AuditLogging.Application", "modules\audit-logging\src\Passingwind.Abp.AuditLogging.Application\Passingwind.Abp.AuditLogging.Application.csproj", "{D19B5383-BDA1-4FBC-A9EB-A329F823F077}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Passingwind.Abp.AuditLogging.HttpApi.Client", "modules\audit-logging\src\Passingwind.Abp.AuditLogging.HttpApi.Client\Passingwind.Abp.AuditLogging.HttpApi.Client.csproj", "{CD71C1AF-8934-417F-B587-62546096E3D0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Passingwind.Abp.AuditLogging.HttpApi", "modules\audit-logging\src\Passingwind.Abp.AuditLogging.HttpApi\Passingwind.Abp.AuditLogging.HttpApi.csproj", "{61E4167C-DE63-4749-AED8-D2B41011799F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -483,6 +499,30 @@ Global {F60E2974-A7C7-41EF-96E8-23E38619E98F}.Debug|Any CPU.Build.0 = Debug|Any CPU {F60E2974-A7C7-41EF-96E8-23E38619E98F}.Release|Any CPU.ActiveCfg = Release|Any CPU {F60E2974-A7C7-41EF-96E8-23E38619E98F}.Release|Any CPU.Build.0 = Release|Any CPU + {AF753833-EA02-4D79-A7A1-B54E3519139D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AF753833-EA02-4D79-A7A1-B54E3519139D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AF753833-EA02-4D79-A7A1-B54E3519139D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AF753833-EA02-4D79-A7A1-B54E3519139D}.Release|Any CPU.Build.0 = Release|Any CPU + {B192F772-5006-48F3-9971-1F4CAE552859}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B192F772-5006-48F3-9971-1F4CAE552859}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B192F772-5006-48F3-9971-1F4CAE552859}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B192F772-5006-48F3-9971-1F4CAE552859}.Release|Any CPU.Build.0 = Release|Any CPU + {D20826A3-F38A-4AEA-A649-13BFA2569A37}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D20826A3-F38A-4AEA-A649-13BFA2569A37}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D20826A3-F38A-4AEA-A649-13BFA2569A37}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D20826A3-F38A-4AEA-A649-13BFA2569A37}.Release|Any CPU.Build.0 = Release|Any CPU + {D19B5383-BDA1-4FBC-A9EB-A329F823F077}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D19B5383-BDA1-4FBC-A9EB-A329F823F077}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D19B5383-BDA1-4FBC-A9EB-A329F823F077}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D19B5383-BDA1-4FBC-A9EB-A329F823F077}.Release|Any CPU.Build.0 = Release|Any CPU + {CD71C1AF-8934-417F-B587-62546096E3D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CD71C1AF-8934-417F-B587-62546096E3D0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CD71C1AF-8934-417F-B587-62546096E3D0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CD71C1AF-8934-417F-B587-62546096E3D0}.Release|Any CPU.Build.0 = Release|Any CPU + {61E4167C-DE63-4749-AED8-D2B41011799F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {61E4167C-DE63-4749-AED8-D2B41011799F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {61E4167C-DE63-4749-AED8-D2B41011799F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {61E4167C-DE63-4749-AED8-D2B41011799F}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -576,6 +616,14 @@ Global {B401EA9D-2336-44AC-8D3E-FD7D2DAE7C97} = {A117DB50-D9B9-4590-BB62-15D87ABA19A8} {DF459EDD-8E5D-4CE5-B879-8E7260E15E7F} = {A117DB50-D9B9-4590-BB62-15D87ABA19A8} {F60E2974-A7C7-41EF-96E8-23E38619E98F} = {A117DB50-D9B9-4590-BB62-15D87ABA19A8} + {88AD1592-7C36-44AC-8E47-5CBE9AB69560} = {9EAC2FB6-A28A-4851-B809-BF8216AAAFE0} + {2567C22F-1B70-4D19-83EE-CF6AA99A4554} = {88AD1592-7C36-44AC-8E47-5CBE9AB69560} + {AF753833-EA02-4D79-A7A1-B54E3519139D} = {2567C22F-1B70-4D19-83EE-CF6AA99A4554} + {B192F772-5006-48F3-9971-1F4CAE552859} = {2567C22F-1B70-4D19-83EE-CF6AA99A4554} + {D20826A3-F38A-4AEA-A649-13BFA2569A37} = {2567C22F-1B70-4D19-83EE-CF6AA99A4554} + {D19B5383-BDA1-4FBC-A9EB-A329F823F077} = {2567C22F-1B70-4D19-83EE-CF6AA99A4554} + {CD71C1AF-8934-417F-B587-62546096E3D0} = {2567C22F-1B70-4D19-83EE-CF6AA99A4554} + {61E4167C-DE63-4749-AED8-D2B41011799F} = {2567C22F-1B70-4D19-83EE-CF6AA99A4554} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {28315BFD-90E7-4E14-A2EA-F3D23AF4126F} diff --git a/clear.ps1 b/clear.ps1 new file mode 100644 index 0000000..f5bf1bd --- /dev/null +++ b/clear.ps1 @@ -0,0 +1 @@ +Get-ChildItem -Path .\ -Recurse -Depth 5 -Directory -Exclude "node_modules/*" -Include "bin", "obj" | ForEach-Object ($_) { Write-Output $_.FullName; Remove-Item $_ -Force -Recurse } diff --git a/host/src/Sample.Application/Sample.Application.csproj b/host/src/Sample.Application/Sample.Application.csproj index 0727dfe..3ba900d 100644 --- a/host/src/Sample.Application/Sample.Application.csproj +++ b/host/src/Sample.Application/Sample.Application.csproj @@ -11,6 +11,7 @@ + diff --git a/host/src/Sample.Application/SampleApplicationModule.cs b/host/src/Sample.Application/SampleApplicationModule.cs index 86061a3..3dd58ea 100644 --- a/host/src/Sample.Application/SampleApplicationModule.cs +++ b/host/src/Sample.Application/SampleApplicationModule.cs @@ -1,5 +1,6 @@ using Passingwind.Abp.Account; using Passingwind.Abp.ApiKey; +using Passingwind.Abp.AuditLogging; using Passingwind.Abp.FileManagement; using Passingwind.Abp.Identity; using Passingwind.Abp.IdentityClient; @@ -31,6 +32,7 @@ namespace Sample; [DependsOn(typeof(IdentityApplicationModule))] [DependsOn(typeof(IdentityClientApplicationModule))] [DependsOn(typeof(PermissionManagementApplicationModule))] +[DependsOn(typeof(AuditLoggingApplicationModule))] public class SampleApplicationModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) diff --git a/host/src/Sample.Domain/Sample.Domain.csproj b/host/src/Sample.Domain/Sample.Domain.csproj index e182e15..67b1515 100644 --- a/host/src/Sample.Domain/Sample.Domain.csproj +++ b/host/src/Sample.Domain/Sample.Domain.csproj @@ -11,6 +11,7 @@ + diff --git a/host/src/Sample.Domain/SampleDomainModule.cs b/host/src/Sample.Domain/SampleDomainModule.cs index 5696ea7..d071071 100644 --- a/host/src/Sample.Domain/SampleDomainModule.cs +++ b/host/src/Sample.Domain/SampleDomainModule.cs @@ -1,6 +1,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Passingwind.Abp.ApiKey; +using Passingwind.Abp.AuditLogging; using Passingwind.Abp.FileManagement; using Passingwind.Abp.Identity; using Passingwind.Abp.IdentityClient; @@ -40,6 +41,7 @@ namespace Sample; [DependsOn(typeof(IdentityClientDomainModule))] [DependsOn(typeof(IdentityDomainModule))] [DependsOn(typeof(PermissionManagementDomainModule))] +[DependsOn(typeof(AuditLoggingDomainModule))] public class SampleDomainModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) diff --git a/host/src/Sample.HttpApi.Client/Sample.HttpApi.Client.csproj b/host/src/Sample.HttpApi.Client/Sample.HttpApi.Client.csproj index e1981fa..4817039 100644 --- a/host/src/Sample.HttpApi.Client/Sample.HttpApi.Client.csproj +++ b/host/src/Sample.HttpApi.Client/Sample.HttpApi.Client.csproj @@ -10,6 +10,7 @@ + diff --git a/host/src/Sample.HttpApi.Host/Sample.HttpApi.Host.csproj b/host/src/Sample.HttpApi.Host/Sample.HttpApi.Host.csproj index 4172506..7f07dc7 100644 --- a/host/src/Sample.HttpApi.Host/Sample.HttpApi.Host.csproj +++ b/host/src/Sample.HttpApi.Host/Sample.HttpApi.Host.csproj @@ -14,7 +14,7 @@ - + @@ -24,7 +24,6 @@ - diff --git a/host/src/Sample.HttpApi.Host/SampleHttpApiHostModule.cs b/host/src/Sample.HttpApi.Host/SampleHttpApiHostModule.cs index 4c36ebb..a8ca51a 100644 --- a/host/src/Sample.HttpApi.Host/SampleHttpApiHostModule.cs +++ b/host/src/Sample.HttpApi.Host/SampleHttpApiHostModule.cs @@ -2,6 +2,8 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Reflection; +using System.Text; using Hangfire; using Hangfire.MemoryStorage; using Microsoft.AspNetCore.Builder; @@ -9,6 +11,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; using Microsoft.OpenApi.Models; using Passingwind.Abp.Account; @@ -20,6 +23,7 @@ using Sample.EntityFrameworkCore; using Sample.MultiTenancy; using Swashbuckle.AspNetCore.SwaggerGen; +using Swashbuckle.AspNetCore.SwaggerUI; using Volo.Abp; using Volo.Abp.Account; using Volo.Abp.AspNetCore.MultiTenancy; @@ -34,6 +38,7 @@ using Volo.Abp.BackgroundWorkers.Hangfire; using Volo.Abp.BlobStoring; using Volo.Abp.BlobStoring.FileSystem; +using Volo.Abp.DependencyInjection; using Volo.Abp.Modularity; using Volo.Abp.OpenIddict; using Volo.Abp.Swashbuckle; @@ -117,6 +122,8 @@ public override void ConfigureServices(ServiceConfigurationContext context) Configure(options => options.TokenCookie.SameSite = Microsoft.AspNetCore.Http.SameSiteMode.Lax); Configure(options => options.CheckLibs = false); + + context.Services.Replace(ServiceDescriptor.Transient()); } private void ConfigureAuthentication(ServiceConfigurationContext context) @@ -259,7 +266,7 @@ public override void OnApplicationInitialization(ApplicationInitializationContex } app.UseCorrelationId(); - app.UseStaticFiles(); + app.MapAbpStaticAssets(); app.UseRouting(); app.UseCors(); app.UseAuthentication(); @@ -276,8 +283,14 @@ public override void OnApplicationInitialization(ApplicationInitializationContex app.UseAuthorization(); app.UseSwagger(); - app.UseAbpSwaggerUI(c => + var resolver = app.ApplicationServices.GetService(); + app.UseSwaggerUI(c => { + c.InjectJavascript("ui/abp.js"); + c.InjectJavascript("ui/abp.swagger.js"); + // c.IndexStream = () => new MemoryStream(Encoding.UTF8.GetBytes(new StreamReader(resolver!!?.Resolver()).ReadToEnd().Replace("src=\"index.js\"", "src=\"ui/index.js\""))); + c.IndexStream = () => resolver?.Resolver(); + c.SwaggerEndpoint("/swagger/v1/swagger.json", "Sample API"); c.DisplayOperationId(); c.DisplayRequestDuration(); @@ -290,3 +303,18 @@ public override void OnApplicationInitialization(ApplicationInitializationContex app.UseConfiguredEndpoints(); } } + +public class SwaggerHtmlResolver : ISwaggerHtmlResolver, ITransientDependency +{ + public virtual Stream Resolver() + { + var stream = typeof(SwaggerUIOptions).GetTypeInfo().Assembly + .GetManifestResourceStream("Swashbuckle.AspNetCore.SwaggerUI.index.html"); + + var html = new StreamReader(stream!) + .ReadToEnd() + .Replace("src=\"index.js\"", "src=\"ui/index.js\""); + + return new MemoryStream(Encoding.UTF8.GetBytes(html)); + } +} diff --git a/host/src/Sample.HttpApi.Host/wwwroot/swagger/ui/index.js b/host/src/Sample.HttpApi.Host/wwwroot/swagger/ui/index.js new file mode 100644 index 0000000..81d195c --- /dev/null +++ b/host/src/Sample.HttpApi.Host/wwwroot/swagger/ui/index.js @@ -0,0 +1,66 @@ +/* Source: https://gist.github.com/lamberta/3768814 + */ +function parseFunction(str) { + if (!str) return void (0); + + var fn_body_idx = str.indexOf('{'), + fn_body = str.substring(fn_body_idx + 1, str.lastIndexOf('}')), + fn_declare = str.substring(0, fn_body_idx), + fn_params = fn_declare.substring(fn_declare.indexOf('(') + 1, fn_declare.lastIndexOf(')')), + args = fn_params.split(','); + + args.push(fn_body); + + function Fn() { + return Function.apply(this, args); + } + + Fn.prototype = Function.prototype; + + return new Fn(); +} + +window.onload = function () { + var configObject = JSON.parse('{"urls":[{"url":"/swagger/v1/swagger.json","name":"Sample API"}],"deepLinking":false,"persistAuthorization":false,"displayOperationId":true,"defaultModelsExpandDepth":1,"defaultModelExpandDepth":1,"defaultModelRendering":"example","displayRequestDuration":true,"docExpansion":"none","showExtensions":false,"showCommonExtensions":false,"supportedSubmitMethods":["get","put","post","delete","options","head","patch","trace"],"tryItOutEnabled":false,"tagsSorter":"alpha"}'); + var oauthConfigObject = JSON.parse('{"scopeSeparator":" ","scopes":[],"useBasicAuthenticationWithAccessCodeGrant":false,"usePkceWithAuthorizationCodeGrant":false}'); + + // Workaround for https://github.com/swagger-api/swagger-ui/issues/5945 + configObject.urls.forEach(function (item) { + if (item.url.startsWith("http") || item.url.startsWith("/")) return; + item.url = window.location.href.replace("index.html", item.url).split('#')[0]; + }); + + // If validatorUrl is not explicitly provided, disable the feature by setting to null + if (!configObject.hasOwnProperty("validatorUrl")) + configObject.validatorUrl = null + + // If oauth2RedirectUrl isn't specified, use the built-in default + if (!configObject.hasOwnProperty("oauth2RedirectUrl")) + configObject.oauth2RedirectUrl = (new URL("oauth2-redirect.html", window.location.href)).href; + + // Apply mandatory parameters + configObject.dom_id = "#swagger-ui"; + configObject.presets = [SwaggerUIBundle.presets.apis, SwaggerUIStandalonePreset]; + configObject.layout = "StandaloneLayout"; + + // Parse and add interceptor functions + var interceptors = JSON.parse('{}'); + if (interceptors.RequestInterceptorFunction) + configObject.requestInterceptor = parseFunction(interceptors.RequestInterceptorFunction); + if (interceptors.ResponseInterceptorFunction) + configObject.responseInterceptor = parseFunction(interceptors.ResponseInterceptorFunction); + + if (configObject.plugins) { + configObject.plugins = configObject.plugins.map(eval); + } + + // Begin Swagger UI call region + + const ui = abp.SwaggerUIBundle(configObject); + + ui.initOAuth(oauthConfigObject); + + // End Swagger UI call region + + window.ui = ui +} diff --git a/host/src/Sample.HttpApi/Sample.HttpApi.csproj b/host/src/Sample.HttpApi/Sample.HttpApi.csproj index c18dfc2..b243a12 100644 --- a/host/src/Sample.HttpApi/Sample.HttpApi.csproj +++ b/host/src/Sample.HttpApi/Sample.HttpApi.csproj @@ -11,6 +11,7 @@ + @@ -18,9 +19,7 @@ - - diff --git a/host/src/Sample.HttpApi/SampleHttpApiModule.cs b/host/src/Sample.HttpApi/SampleHttpApiModule.cs index 376dfda..975fea6 100644 --- a/host/src/Sample.HttpApi/SampleHttpApiModule.cs +++ b/host/src/Sample.HttpApi/SampleHttpApiModule.cs @@ -1,6 +1,7 @@ using Localization.Resources.AbpUi; using Passingwind.Abp.Account; using Passingwind.Abp.ApiKey; +using Passingwind.Abp.AuditLogging; using Passingwind.Abp.FileManagement; using Passingwind.Abp.Identity; using Passingwind.Abp.IdentityClient; @@ -28,6 +29,7 @@ namespace Sample; [DependsOn(typeof(FileManagementHttpApiModule))] [DependsOn(typeof(AbpBlobStoringFileSystemModule))] [DependsOn(typeof(IdentityClientHttpApiModule))] +[DependsOn(typeof(AuditLoggingHttpApiModule))] public class SampleHttpApiModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) diff --git a/modules/audit-logging/common.props b/modules/audit-logging/common.props new file mode 100644 index 0000000..a5dd8f3 --- /dev/null +++ b/modules/audit-logging/common.props @@ -0,0 +1,5 @@ + + + + + diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/AuditLogActionDto.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/AuditLogActionDto.cs new file mode 100644 index 0000000..79c4e15 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/AuditLogActionDto.cs @@ -0,0 +1,25 @@ +using System; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Data; +using Volo.Abp.MultiTenancy; + +namespace Passingwind.Abp.AuditLogging; + +public class AuditLogActionDto : EntityDto, IMultiTenant, IHasExtraProperties +{ + public virtual Guid? TenantId { get; set; } + + public virtual Guid AuditLogId { get; set; } + + public virtual string? ServiceName { get; set; } + + public virtual string? MethodName { get; set; } + + public virtual string? Parameters { get; set; } + + public virtual DateTime ExecutionTime { get; set; } + + public virtual int ExecutionDuration { get; set; } + + public virtual ExtraPropertyDictionary ExtraProperties { get; set; } = null!; +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/AuditLogCleanupRequestDto.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/AuditLogCleanupRequestDto.cs new file mode 100644 index 0000000..88116de --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/AuditLogCleanupRequestDto.cs @@ -0,0 +1,9 @@ +using System; + +namespace Passingwind.Abp.AuditLogging; + +public class AuditLogCleanupRequestDto +{ + public AuditLogCleanupBehavior Behavior { get; set; } + public DateTime EndTime { get; set; } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/AuditLogCleanupSettingsDto.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/AuditLogCleanupSettingsDto.cs new file mode 100644 index 0000000..c914d19 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/AuditLogCleanupSettingsDto.cs @@ -0,0 +1,8 @@ +namespace Passingwind.Abp.AuditLogging; + +public class AuditLogCleanupSettingsDto +{ + public AuditLogCleanupBehavior Behavior { get; set; } + public string BehaviorDescription => Behavior.ToString(); + public int KeepDays { get; set; } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/AuditLogDto.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/AuditLogDto.cs new file mode 100644 index 0000000..81183fc --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/AuditLogDto.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using Volo.Abp.Application.Dtos; +using Volo.Abp.MultiTenancy; + +namespace Passingwind.Abp.AuditLogging; + +public class AuditLogDto : EntityDto, IMultiTenant +{ + public virtual string? ApplicationName { get; set; } + + public virtual Guid? UserId { get; set; } + + public virtual string? UserName { get; set; } + + public virtual Guid? TenantId { get; set; } + + public virtual string? TenantName { get; set; } + + public virtual Guid? ImpersonatorUserId { get; set; } + + public virtual string? ImpersonatorUserName { get; set; } + + public virtual Guid? ImpersonatorTenantId { get; set; } + + public virtual string? ImpersonatorTenantName { get; set; } + + public virtual DateTime ExecutionTime { get; set; } + + public virtual int ExecutionDuration { get; set; } + + public virtual string? ClientIpAddress { get; set; } + + public virtual string? ClientName { get; set; } + + public virtual string? ClientId { get; set; } + + public virtual string? CorrelationId { get; set; } + + public virtual string? BrowserInfo { get; set; } + + public virtual string? HttpMethod { get; set; } + + public virtual string? Url { get; set; } + + public virtual string? Exceptions { get; set; } + + public virtual string? Comments { get; set; } + + public virtual int? HttpStatusCode { get; set; } + + public virtual List? Actions { get; set; } + + public virtual List? EntityChanges { get; set; } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/AuditLogListRequestDto.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/AuditLogListRequestDto.cs new file mode 100644 index 0000000..e7cef62 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/AuditLogListRequestDto.cs @@ -0,0 +1,23 @@ +using System; +using Volo.Abp.Application.Dtos; + +namespace Passingwind.Abp.AuditLogging; + +public class AuditLogListRequestDto : PagedResultRequestDto +{ + public virtual string? Sorting { get; set; } + public virtual string? HttpMethod { get; set; } + public virtual int? HttpStatusCode { get; set; } + public virtual string? Url { get; set; } + public virtual DateTime? StartTime { get; set; } + public virtual DateTime? EndTime { get; set; } + public virtual string? ClientId { get; set; } + public virtual Guid? UserId { get; set; } + public virtual string? UserName { get; set; } + public virtual string? ApplicationName { get; set; } + public virtual string? ClientIpAddress { get; set; } + public virtual string? CorrelationId { get; set; } + public virtual int? MaxExecutionDuration { get; set; } + public virtual int? MinExecutionDuration { get; set; } + public virtual bool? HasException { get; set; } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/AuditLoggingApplicationContractsModule.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/AuditLoggingApplicationContractsModule.cs new file mode 100644 index 0000000..6abb519 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/AuditLoggingApplicationContractsModule.cs @@ -0,0 +1,14 @@ +using Volo.Abp.Application; +using Volo.Abp.Authorization; +using Volo.Abp.Modularity; + +namespace Passingwind.Abp.AuditLogging; + +[DependsOn( + typeof(AuditLoggingDomainSharedModule), + typeof(AbpDddApplicationContractsModule), + typeof(AbpAuthorizationModule) + )] +public class AuditLoggingApplicationContractsModule : AbpModule +{ +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/AuditLoggingRemoteServiceConsts.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/AuditLoggingRemoteServiceConsts.cs new file mode 100644 index 0000000..af15511 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/AuditLoggingRemoteServiceConsts.cs @@ -0,0 +1,8 @@ +namespace Passingwind.Abp.AuditLogging; + +public static class AuditLoggingRemoteServiceConsts +{ + public const string RemoteServiceName = "AuditLogging"; + + public const string ModuleName = "auditLogging"; +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/EntityChangeDto.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/EntityChangeDto.cs new file mode 100644 index 0000000..263a1b8 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/EntityChangeDto.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Auditing; +using Volo.Abp.Data; +using Volo.Abp.MultiTenancy; + +namespace Passingwind.Abp.AuditLogging; + +public class EntityChangeDto : EntityDto, IMultiTenant, IHasExtraProperties +{ + public virtual Guid AuditLogId { get; set; } + + public virtual Guid? TenantId { get; set; } + + public virtual DateTime ChangeTime { get; set; } + + public virtual EntityChangeType ChangeType { get; set; } + + public virtual Guid? EntityTenantId { get; set; } + + public virtual string? EntityId { get; set; } + + public virtual string? EntityTypeFullName { get; set; } + + public virtual List? PropertyChanges { get; set; } + + public virtual ExtraPropertyDictionary ExtraProperties { get; set; } = null!; +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/EntityChangeListRequestDto.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/EntityChangeListRequestDto.cs new file mode 100644 index 0000000..c971a77 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/EntityChangeListRequestDto.cs @@ -0,0 +1,15 @@ +using System; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Auditing; + +namespace Passingwind.Abp.AuditLogging; + +public class EntityChangeListRequestDto : PagedResultRequestDto +{ + public Guid? AuditLogId { get; set; } + public DateTime? StartTime { get; set; } + public DateTime? EndTime { get; set; } + public EntityChangeType? ChangeType { get; set; } + public string? EntityId { get; set; } + public string? EntityTypeFullName { get; set; } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/EntityPropertyChangeDto.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/EntityPropertyChangeDto.cs new file mode 100644 index 0000000..5f22d6a --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/EntityPropertyChangeDto.cs @@ -0,0 +1,20 @@ +using System; +using Volo.Abp.Application.Dtos; +using Volo.Abp.MultiTenancy; + +namespace Passingwind.Abp.AuditLogging; + +public class EntityPropertyChangeDto : EntityDto, IMultiTenant +{ + public virtual Guid? TenantId { get; set; } + + public virtual Guid EntityChangeId { get; set; } + + public virtual string? NewValue { get; set; } + + public virtual string? OriginalValue { get; set; } + + public virtual string? PropertyName { get; set; } + + public virtual string? PropertyTypeFullName { get; set; } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/FodyWeavers.xml b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/FodyWeavers.xml new file mode 100644 index 0000000..1715698 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/FodyWeavers.xsd b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/FodyWeavers.xsd new file mode 100644 index 0000000..ffa6fc4 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/IAuditLogAppService.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/IAuditLogAppService.cs new file mode 100644 index 0000000..1427b0b --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/IAuditLogAppService.cs @@ -0,0 +1,15 @@ +using System; +using System.Threading.Tasks; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Application.Services; + +namespace Passingwind.Abp.AuditLogging; + +public interface IAuditLogAppService : IApplicationService +{ + Task> GetListAsync(AuditLogListRequestDto input); + + Task GetAsync(Guid id); + + Task DeleteAsync(Guid id); +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/IAuditLogCleanupAppService.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/IAuditLogCleanupAppService.cs new file mode 100644 index 0000000..d6027a5 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/IAuditLogCleanupAppService.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; +using Volo.Abp.Application.Services; + +namespace Passingwind.Abp.AuditLogging; + +public interface IAuditLogCleanupAppService : IApplicationService +{ + Task RunAsync(AuditLogCleanupRequestDto input); +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/IAuditLogSettingAppService.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/IAuditLogSettingAppService.cs new file mode 100644 index 0000000..8b9b356 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/IAuditLogSettingAppService.cs @@ -0,0 +1,10 @@ +using System.Threading.Tasks; +using Volo.Abp.Application.Services; + +namespace Passingwind.Abp.AuditLogging; + +public interface IAuditLogSettingAppService : IApplicationService +{ + Task GetCleanupAsync(); + Task UpdateCleanupAsync(AuditLogCleanupSettingsDto input); +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/IEntityChangeAppService.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/IEntityChangeAppService.cs new file mode 100644 index 0000000..0b20743 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/IEntityChangeAppService.cs @@ -0,0 +1,13 @@ +using System; +using System.Threading.Tasks; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Application.Services; + +namespace Passingwind.Abp.AuditLogging; + +public interface IEntityChangeAppService : IApplicationService +{ + Task> GetListAsync(EntityChangeListRequestDto input); + + Task GetAsync(Guid id); +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/Passingwind.Abp.AuditLogging.Application.Contracts.abppkg b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/Passingwind.Abp.AuditLogging.Application.Contracts.abppkg new file mode 100644 index 0000000..4903279 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/Passingwind.Abp.AuditLogging.Application.Contracts.abppkg @@ -0,0 +1,3 @@ +{ + "role": "lib.application-contracts" +} \ No newline at end of file diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/Passingwind.Abp.AuditLogging.Application.Contracts.csproj b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/Passingwind.Abp.AuditLogging.Application.Contracts.csproj new file mode 100644 index 0000000..573e753 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/Passingwind.Abp.AuditLogging.Application.Contracts.csproj @@ -0,0 +1,16 @@ + + + + + + netstandard2.0; + Passingwind.Abp.AuditLogging + + + + + + + + + diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/Permissions/AuditLoggingPermissionDefinitionProvider.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/Permissions/AuditLoggingPermissionDefinitionProvider.cs new file mode 100644 index 0000000..82f9c63 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/Permissions/AuditLoggingPermissionDefinitionProvider.cs @@ -0,0 +1,28 @@ +using Passingwind.Abp.AuditLogging.Localization; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Localization; + +namespace Passingwind.Abp.AuditLogging.Permissions; + +public class AuditLoggingPermissionDefinitionProvider : PermissionDefinitionProvider +{ + [System.Diagnostics.CodeAnalysis.SuppressMessage("Roslynator", "RCS1201:Use method chaining.", Justification = "")] + public override void Define(IPermissionDefinitionContext context) + { + var myGroup = context.AddGroup(AuditLoggingPermissions.GroupName, L("Permission:AuditLogging")); + + var settings = myGroup.AddPermission(AuditLoggingPermissions.Settings.Default, L("Permission:Settings")); + settings.AddChild(AuditLoggingPermissions.Settings.Cleanup, L("Permission:AuditLogging.Cleanup")); + + var auditLogs = myGroup.AddPermission(AuditLoggingPermissions.AuditLogs.Default, L("Permission:AuditLogging.AuditLogs")); + auditLogs.AddChild(AuditLoggingPermissions.AuditLogs.Delete, L("Permission:Delete")); + + var entityChanges = myGroup.AddPermission(AuditLoggingPermissions.EntityChange.Default, L("Permission:AuditLogging.EntityChanges")); + // entityChanges.AddChild(AuditLoggingPermissions.EntityChange.Delete, L("Permission:Delete")); + } + + private static LocalizableString L(string name) + { + return LocalizableString.Create(name); + } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/Permissions/AuditLoggingPermissions.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/Permissions/AuditLoggingPermissions.cs new file mode 100644 index 0000000..e0462cd --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application.Contracts/Permissions/AuditLoggingPermissions.cs @@ -0,0 +1,33 @@ +using Volo.Abp.Reflection; + +namespace Passingwind.Abp.AuditLogging.Permissions; + +public class AuditLoggingPermissions +{ + public const string GroupName = "AuditLogging"; + + public static class AuditLogs + { + public const string Default = GroupName + ".AuditLogs"; + + public const string Delete = Default + ".Delete"; + } + + public static class Settings + { + public const string Default = GroupName + ".Settings"; + + public const string Cleanup = Default + ".Cleanup"; + } + + public static class EntityChange + { + public const string Default = GroupName + ".EntityChanges"; + //public const string Delete = Default + ".Delete"; + } + + public static string[] GetAll() + { + return ReflectionHelper.GetPublicConstantsRecursively(typeof(AuditLoggingPermissions)); + } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/AuditLogAppService.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/AuditLogAppService.cs new file mode 100644 index 0000000..010f4a9 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/AuditLogAppService.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Passingwind.Abp.AuditLogging.Permissions; +using Volo.Abp.Application.Dtos; +using Volo.Abp.AuditLogging; + +namespace Passingwind.Abp.AuditLogging; + +[Authorize(AuditLoggingPermissions.AuditLogs.Default)] +public class AuditLogAppService : AuditLoggingAppServiceBase, IAuditLogAppService +{ + protected IAuditLogRepository AuditLogRepository { get; } + + public AuditLogAppService(IAuditLogRepository auditLogRepository) + { + AuditLogRepository = auditLogRepository; + } + + [Authorize(AuditLoggingPermissions.AuditLogs.Delete)] + public async Task DeleteAsync(Guid id) + { + await AuditLogRepository.DeleteAsync(id); + } + + public async Task GetAsync(Guid id) + { + var entity = await AuditLogRepository.GetAsync(id); + + return ObjectMapper.Map(entity); + } + + public async Task> GetListAsync(AuditLogListRequestDto input) + { + var list = await AuditLogRepository.GetListAsync( + sorting: input.Sorting, + maxResultCount: input.MaxResultCount, + skipCount: input.SkipCount, + startTime: input.StartTime, + endTime: input.EndTime, + httpMethod: input.HttpMethod, + url: input.Url, + userId: input.UserId, + userName: input.UserName, + applicationName: input.ApplicationName, + clientIpAddress: input.ClientIpAddress, + correlationId: input.CorrelationId, + maxExecutionDuration: input.MaxExecutionDuration, + minExecutionDuration: input.MinExecutionDuration, + hasException: input.HasException, + httpStatusCode: (System.Net.HttpStatusCode?)input.HttpStatusCode); + + var count = await AuditLogRepository.GetCountAsync( + startTime: input.StartTime, + endTime: input.EndTime, + httpMethod: input.HttpMethod, + url: input.Url, + userId: input.UserId, + userName: input.UserName, + applicationName: input.ApplicationName, + clientIpAddress: input.ClientIpAddress, + correlationId: input.CorrelationId, + maxExecutionDuration: input.MaxExecutionDuration, + minExecutionDuration: input.MinExecutionDuration, + hasException: input.HasException, + httpStatusCode: (System.Net.HttpStatusCode?)input.HttpStatusCode); + + return new PagedResultDto(count, ObjectMapper.Map, List>(list)); + } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/AuditLogCleanupAppService.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/AuditLogCleanupAppService.cs new file mode 100644 index 0000000..cfcc5f2 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/AuditLogCleanupAppService.cs @@ -0,0 +1,22 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Passingwind.Abp.AuditLogging.Cleanup; +using Passingwind.Abp.AuditLogging.Permissions; + +namespace Passingwind.Abp.AuditLogging; + +[Authorize(AuditLoggingPermissions.AuditLogs.Delete)] +public class AuditLogCleanupAppService : AuditLoggingAppServiceBase, IAuditLogCleanupAppService +{ + protected IAuditLogCleanupRunner AuditLogCleanupRunner { get; } + + public AuditLogCleanupAppService(IAuditLogCleanupRunner auditLogCleanupRunner) + { + AuditLogCleanupRunner = auditLogCleanupRunner; + } + + public virtual async Task RunAsync(AuditLogCleanupRequestDto input) + { + await AuditLogCleanupRunner.RunAsync(input.Behavior, input.EndTime.Date); + } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/AuditLogSettingAppService.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/AuditLogSettingAppService.cs new file mode 100644 index 0000000..2af0f81 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/AuditLogSettingAppService.cs @@ -0,0 +1,37 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Passingwind.Abp.AuditLogging.Cleanup; +using Passingwind.Abp.AuditLogging.Permissions; + +namespace Passingwind.Abp.AuditLogging; + +[Authorize(AuditLoggingPermissions.Settings.Default)] +public class AuditLogSettingAppService : AuditLoggingAppServiceBase, IAuditLogSettingAppService +{ + protected IAuditLogCleanupSettingManager SettingsManager { get; } + + public AuditLogSettingAppService(IAuditLogCleanupSettingManager settingsManager) + { + SettingsManager = settingsManager; + } + + public virtual async Task GetCleanupAsync() + { + var result = await SettingsManager.GetAsync(); + + return new AuditLogCleanupSettingsDto + { + Behavior = result.Behavior, + KeepDays = result.KeepDays, + }; + } + + public virtual async Task UpdateCleanupAsync(AuditLogCleanupSettingsDto input) + { + await SettingsManager.UpdateAsync(new AuditLogCleanupSettings + { + Behavior = input.Behavior, + KeepDays = input.KeepDays, + }); + } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/AuditLoggingAppServiceBase.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/AuditLoggingAppServiceBase.cs new file mode 100644 index 0000000..db5bf87 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/AuditLoggingAppServiceBase.cs @@ -0,0 +1,13 @@ +using Passingwind.Abp.AuditLogging.Localization; +using Volo.Abp.Application.Services; + +namespace Passingwind.Abp.AuditLogging; + +public abstract class AuditLoggingAppServiceBase : ApplicationService +{ + protected AuditLoggingAppServiceBase() + { + LocalizationResource = typeof(AuditLoggingResource); + ObjectMapperContext = typeof(AuditLoggingApplicationModule); + } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/AuditLoggingApplicationAutoMapperProfile.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/AuditLoggingApplicationAutoMapperProfile.cs new file mode 100644 index 0000000..d1668df --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/AuditLoggingApplicationAutoMapperProfile.cs @@ -0,0 +1,15 @@ +using AutoMapper; +using Volo.Abp.AuditLogging; + +namespace Passingwind.Abp.AuditLogging; + +public class AuditLoggingApplicationAutoMapperProfile : Profile +{ + public AuditLoggingApplicationAutoMapperProfile() + { + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/AuditLoggingApplicationModule.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/AuditLoggingApplicationModule.cs new file mode 100644 index 0000000..7b39739 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/AuditLoggingApplicationModule.cs @@ -0,0 +1,21 @@ +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Application; +using Volo.Abp.AutoMapper; +using Volo.Abp.Modularity; + +namespace Passingwind.Abp.AuditLogging; + +[DependsOn( + typeof(AuditLoggingDomainModule), + typeof(AuditLoggingApplicationContractsModule), + typeof(AbpDddApplicationModule), + typeof(AbpAutoMapperModule) + )] +public class AuditLoggingApplicationModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddAutoMapperObjectMapper(); + Configure(options => options.AddMaps(validate: true)); + } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/EntityChangeAppService.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/EntityChangeAppService.cs new file mode 100644 index 0000000..d849575 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/EntityChangeAppService.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Passingwind.Abp.AuditLogging.Permissions; +using Volo.Abp.Application.Dtos; +using Volo.Abp.AuditLogging; + +namespace Passingwind.Abp.AuditLogging; + +[Authorize(AuditLoggingPermissions.EntityChange.Default)] +public class EntityChangeAppService : AuditLoggingAppServiceBase, IEntityChangeAppService +{ + protected IAuditLogRepository AuditLogRepository { get; set; } + + public EntityChangeAppService(IAuditLogRepository auditLogRepository) + { + AuditLogRepository = auditLogRepository; + } + + public virtual async Task GetAsync(Guid id) + { + var entity = await AuditLogRepository.GetEntityChange(id); + + return ObjectMapper.Map(entity); + } + + public virtual async Task> GetListAsync(EntityChangeListRequestDto input) + { + var list = await AuditLogRepository.GetEntityChangeListAsync( + sorting: null, + maxResultCount: input.MaxResultCount, + skipCount: input.SkipCount, + auditLogId: input.AuditLogId, + startTime: input.StartTime, + endTime: input.EndTime, + changeType: input.ChangeType, + entityId: input.EntityId, + entityTypeFullName: input.EntityTypeFullName); + + var count = await AuditLogRepository.GetEntityChangeCountAsync( + auditLogId: input.AuditLogId, + startTime: input.StartTime, + endTime: input.EndTime, + changeType: input.ChangeType, + entityId: input.EntityId, + entityTypeFullName: input.EntityTypeFullName); + + return new PagedResultDto(count, ObjectMapper.Map, List>(list)); + } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/FodyWeavers.xml b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/FodyWeavers.xml new file mode 100644 index 0000000..1715698 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/FodyWeavers.xsd b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/FodyWeavers.xsd new file mode 100644 index 0000000..ffa6fc4 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/Passingwind.Abp.AuditLogging.Application.abppkg b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/Passingwind.Abp.AuditLogging.Application.abppkg new file mode 100644 index 0000000..412567a --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/Passingwind.Abp.AuditLogging.Application.abppkg @@ -0,0 +1,3 @@ +{ + "role": "lib.application" +} \ No newline at end of file diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/Passingwind.Abp.AuditLogging.Application.csproj b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/Passingwind.Abp.AuditLogging.Application.csproj new file mode 100644 index 0000000..983b026 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Application/Passingwind.Abp.AuditLogging.Application.csproj @@ -0,0 +1,17 @@ + + + + + + $(Tfw) + Passingwind.Abp.AuditLogging + + + + + + + + + + diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/AuditLogCleanupBehavior.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/AuditLogCleanupBehavior.cs new file mode 100644 index 0000000..a441329 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/AuditLogCleanupBehavior.cs @@ -0,0 +1,8 @@ +namespace Passingwind.Abp.AuditLogging; + +public enum AuditLogCleanupBehavior +{ + None = 0, + Delete = 1, + BackupToFile = 2 +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/AuditLoggingDomainSharedModule.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/AuditLoggingDomainSharedModule.cs new file mode 100644 index 0000000..eca914b --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/AuditLoggingDomainSharedModule.cs @@ -0,0 +1,32 @@ +using Passingwind.Abp.AuditLogging.Localization; +using Volo.Abp.AuditLogging; +using Volo.Abp.Localization; +using Volo.Abp.Localization.ExceptionHandling; +using Volo.Abp.Modularity; +using Volo.Abp.Validation; +using Volo.Abp.Validation.Localization; +using Volo.Abp.VirtualFileSystem; + +namespace Passingwind.Abp.AuditLogging; + +[DependsOn( + typeof(AbpValidationModule), + typeof(AbpAuditLoggingDomainSharedModule) +)] +public class AuditLoggingDomainSharedModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => options.FileSets.AddEmbedded()); + + Configure(options => + { + options.Resources + .Add("en") + .AddBaseTypes(typeof(AbpValidationResource)) + .AddVirtualJson("/Localization/AuditLogging"); + }); + + Configure(options => options.MapCodeNamespace("AuditLogging", typeof(AuditLoggingResource))); + } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/FodyWeavers.xml b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/FodyWeavers.xml new file mode 100644 index 0000000..1715698 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/FodyWeavers.xsd b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/FodyWeavers.xsd new file mode 100644 index 0000000..ffa6fc4 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/Localization/AuditLogging/en.json b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/Localization/AuditLogging/en.json new file mode 100644 index 0000000..aae4fa9 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/Localization/AuditLogging/en.json @@ -0,0 +1,11 @@ +{ + "culture": "en", + "texts": { + "Permission:Delete": "Delete", + "Permission:Settings": "Settings", + "Permission:Settings.Cleanup": "Cleanup", + "Permission:AuditLogging": "Audit logging management", + "Permission:AuditLogging.AuditLogs": "Audit logs", + "Permission:AuditLogging.EntityChanges": "Entity change logs" + } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/Localization/AuditLogging/zh-Hans.json b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/Localization/AuditLogging/zh-Hans.json new file mode 100644 index 0000000..295d760 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/Localization/AuditLogging/zh-Hans.json @@ -0,0 +1,11 @@ +{ + "culture": "zh-Hans", + "texts": { + "Permission:Delete": "删除", + "Permission:Settings": "设置", + "Permission:Settings.Cleanup": "清理", + "Permission:AuditLogging": "审计日志管理", + "Permission:AuditLogging.AuditLogs": "审计日志", + "Permission:AuditLogging.EntityChanges": "实体修改日志" + } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/Localization/AuditLoggingResource.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/Localization/AuditLoggingResource.cs new file mode 100644 index 0000000..629c289 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/Localization/AuditLoggingResource.cs @@ -0,0 +1,8 @@ +using Volo.Abp.Localization; + +namespace Passingwind.Abp.AuditLogging.Localization; + +[LocalizationResourceName("AuditLogging")] +public class AuditLoggingResource +{ +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/Passingwind.Abp.AuditLogging.Domain.Shared.abppkg b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/Passingwind.Abp.AuditLogging.Domain.Shared.abppkg new file mode 100644 index 0000000..8b3de05 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/Passingwind.Abp.AuditLogging.Domain.Shared.abppkg @@ -0,0 +1,3 @@ +{ + "role": "lib.domain-shared" +} \ No newline at end of file diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/Passingwind.Abp.AuditLogging.Domain.Shared.csproj b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/Passingwind.Abp.AuditLogging.Domain.Shared.csproj new file mode 100644 index 0000000..0ce6b2e --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain.Shared/Passingwind.Abp.AuditLogging.Domain.Shared.csproj @@ -0,0 +1,25 @@ + + + + + + netstandard2.0; + Passingwind.Abp.AuditLogging + true + + + + + + + + + + + + + + + + + diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/AuditLoggingDomainModule.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/AuditLoggingDomainModule.cs new file mode 100644 index 0000000..281bb6e --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/AuditLoggingDomainModule.cs @@ -0,0 +1,32 @@ +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Passingwind.Abp.AuditLogging.Cleanup; +using Passingwind.Abp.AuditLogging.Options; +using Volo.Abp; +using Volo.Abp.AuditLogging; +using Volo.Abp.BackgroundWorkers; +using Volo.Abp.Modularity; +using Volo.Abp.SettingManagement; + +namespace Passingwind.Abp.AuditLogging; + +[DependsOn( + typeof(AbpAuditLoggingDomainModule), + typeof(AbpSettingManagementDomainModule), + typeof(AbpBackgroundWorkersModule), + typeof(AuditLoggingDomainSharedModule) +)] +public class AuditLoggingDomainModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + var configuration = context.Services.GetConfiguration(); + + context.Services.AddOptions("AuditLogging"); + } + + public override async Task OnPostApplicationInitializationAsync(ApplicationInitializationContext context) + { + await context.AddBackgroundWorkerAsync(); + } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/AuditLogCleanupBackgroundWorker.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/AuditLogCleanupBackgroundWorker.cs new file mode 100644 index 0000000..5ab2c87 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/AuditLogCleanupBackgroundWorker.cs @@ -0,0 +1,31 @@ +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Volo.Abp.BackgroundWorkers; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Threading; + +namespace Passingwind.Abp.AuditLogging.Cleanup; + +public class AuditLogCleanupBackgroundWorker : AsyncPeriodicBackgroundWorkerBase, ITransientDependency +{ + public AuditLogCleanupBackgroundWorker(AbpAsyncTimer timer, IServiceScopeFactory serviceScopeFactory) : base(timer, serviceScopeFactory) + { + Timer.Period = 24 * 60 * 60 * 1000; + } + + protected override async Task DoWorkAsync(PeriodicBackgroundWorkerContext workerContext) + { + try + { + var service = workerContext.ServiceProvider.GetRequiredService(); + + await service.RunAsync(workerContext.CancellationToken); + } + catch (Exception ex) + { + Logger.LogError(ex, "Run audit log cleanup job failed."); + } + } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/AuditLogCleanupSettingManager.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/AuditLogCleanupSettingManager.cs new file mode 100644 index 0000000..f93148b --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/AuditLogCleanupSettingManager.cs @@ -0,0 +1,52 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Passingwind.Abp.AuditLogging.Settings; +using Volo.Abp.DependencyInjection; +using Volo.Abp.SettingManagement; +using Volo.Abp.Settings; + +namespace Passingwind.Abp.AuditLogging.Cleanup; + +public class AuditLogCleanupSettingManager : IAuditLogCleanupSettingManager, IScopedDependency +{ + protected ISettingProvider SettingProvider { get; } + protected ISettingManager SettingManager { get; } + + public AuditLogCleanupSettingManager(ISettingProvider settingProvider, ISettingManager settingManager) + { + SettingProvider = settingProvider; + SettingManager = settingManager; + } + + public virtual async Task GetAsync(CancellationToken cancellationToken = default) + { + return new AuditLogCleanupSettings + { + Behavior = await GetValue(AuditLoggingSettingNames.Cleanup.Behavior, cancellationToken: cancellationToken), + KeepDays = await GetValue(AuditLoggingSettingNames.Cleanup.KeepDays, cancellationToken: cancellationToken), + }; + } + + public virtual async Task UpdateAsync(AuditLogCleanupSettings settings, CancellationToken cancellationToken = default) + { + await SettingManager.SetGlobalAsync(AuditLoggingSettingNames.Cleanup.KeepDays, settings.KeepDays.ToString()); + await SettingManager.SetGlobalAsync(AuditLoggingSettingNames.Cleanup.Behavior, settings.Behavior.ToString()); + } + + protected virtual async Task GetValue(string key, T defaultValue = default, CancellationToken cancellationToken = default) where T : struct + { + var value = await SettingProvider.GetOrNullAsync(key); + if (string.IsNullOrWhiteSpace(value)) + { + return defaultValue; + } + + if (typeof(T).IsEnum) + { + return (T)Enum.Parse(typeof(T), value, true); + } + + return value!.To(); + } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/AuditLogCleanupSettings.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/AuditLogCleanupSettings.cs new file mode 100644 index 0000000..e1fb22e --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/AuditLogCleanupSettings.cs @@ -0,0 +1,13 @@ +namespace Passingwind.Abp.AuditLogging.Cleanup; + +public class AuditLogCleanupSettings +{ + /// + /// Cleanup behavior + /// + public AuditLogCleanupBehavior Behavior { get; set; } + /// + /// Number of days to keep + /// + public int KeepDays { get; set; } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/DefaultAuditLogCleanupProvider.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/DefaultAuditLogCleanupProvider.cs new file mode 100644 index 0000000..a91830b --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/DefaultAuditLogCleanupProvider.cs @@ -0,0 +1,37 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Passingwind.Abp.AuditLogging.Cleanup.Providers; +using Volo.Abp.DependencyInjection; + +namespace Passingwind.Abp.AuditLogging.Cleanup; + +public class DefaultAuditLogCleanupProvider : IAuditLogCleanupProvider, IScopedDependency +{ + protected ILogger Logger { get; } + protected IAuditLogCleanupSaveToFileProvider SaveToFileProvider { get; } + protected IAuditLogCleanupDeleteProvider DeleteProvider { get; } + + public DefaultAuditLogCleanupProvider( + ILogger logger, + IAuditLogCleanupSaveToFileProvider saveToFileProvider, + IAuditLogCleanupDeleteProvider deleteProvider) + { + Logger = logger; + SaveToFileProvider = saveToFileProvider; + DeleteProvider = deleteProvider; + } + + public virtual async Task DeleteAsync(DateTime endTime, CancellationToken cancellationToken = default) + { + Logger.LogDebug("Start cleanup audit logs by delete and ends to '{endTime}'", endTime); + await DeleteProvider.DeleteAsync(endTime, cancellationToken); + } + + public virtual async Task BackupToFileAsync(DateTime endTime, CancellationToken cancellationToken = default) + { + Logger.LogDebug("Start cleanup audit logs by save to file and ends to '{endTime}'", endTime); + await SaveToFileProvider.SaveToFileAsync(endTime, cancellationToken); + } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/DefaultAuditLogCleanupRunner.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/DefaultAuditLogCleanupRunner.cs new file mode 100644 index 0000000..bd36518 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/DefaultAuditLogCleanupRunner.cs @@ -0,0 +1,61 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Timing; + +namespace Passingwind.Abp.AuditLogging.Cleanup; + +public class DefaultAuditLogCleanupRunner : IAuditLogCleanupRunner, IScopedDependency +{ + protected ILogger Logger { get; } + protected IClock Clock { get; } + protected IAuditLogCleanupProvider CleanupProvider { get; } + protected IAuditLogCleanupSettingManager CleanupSettingManager { get; } + + public DefaultAuditLogCleanupRunner( + ILogger logger, + IClock clock, + IAuditLogCleanupProvider cleanupProvider, + IAuditLogCleanupSettingManager cleanupSettingManager) + { + Logger = logger; + Clock = clock; + CleanupProvider = cleanupProvider; + CleanupSettingManager = cleanupSettingManager; + } + + public virtual async Task RunAsync(CancellationToken cancellationToken = default) + { + var settings = await CleanupSettingManager.GetAsync(cancellationToken); + + var behavior = settings.Behavior; + + if (behavior == AuditLogCleanupBehavior.None) + { + return; + } + + var endTime = Clock.Now.AddDays(-settings.KeepDays); + + await RunAsync(behavior, endTime, cancellationToken); + } + + public virtual async Task RunAsync(AuditLogCleanupBehavior behavior, DateTime endTime, CancellationToken cancellationToken = default) + { + Logger.LogDebug("Start cleanup audit logs..."); + + switch (behavior) + { + case AuditLogCleanupBehavior.Delete: + await CleanupProvider.DeleteAsync(endTime, cancellationToken); + break; + case AuditLogCleanupBehavior.BackupToFile: + await CleanupProvider.BackupToFileAsync(endTime, cancellationToken); + break; + } + + Logger.LogInformation("Audit logs cleaned up."); + } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/IAuditLogCleanupProvider.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/IAuditLogCleanupProvider.cs new file mode 100644 index 0000000..d8d4bdd --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/IAuditLogCleanupProvider.cs @@ -0,0 +1,11 @@ +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace Passingwind.Abp.AuditLogging.Cleanup; + +public interface IAuditLogCleanupProvider +{ + Task DeleteAsync(DateTime endTime, CancellationToken cancellationToken = default); + Task BackupToFileAsync(DateTime endTime, CancellationToken cancellationToken = default); +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/IAuditLogCleanupRunner.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/IAuditLogCleanupRunner.cs new file mode 100644 index 0000000..f8bb495 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/IAuditLogCleanupRunner.cs @@ -0,0 +1,11 @@ +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace Passingwind.Abp.AuditLogging.Cleanup; + +public interface IAuditLogCleanupRunner +{ + Task RunAsync(CancellationToken cancellationToken = default); + Task RunAsync(AuditLogCleanupBehavior behavior, DateTime endTime, CancellationToken cancellationToken = default); +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/IAuditLogCleanupSettingManager.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/IAuditLogCleanupSettingManager.cs new file mode 100644 index 0000000..0cb7b54 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/IAuditLogCleanupSettingManager.cs @@ -0,0 +1,10 @@ +using System.Threading; +using System.Threading.Tasks; + +namespace Passingwind.Abp.AuditLogging.Cleanup; + +public interface IAuditLogCleanupSettingManager +{ + Task GetAsync(CancellationToken cancellationToken = default); + Task UpdateAsync(AuditLogCleanupSettings settings, CancellationToken cancellationToken = default); +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/Providers/DefaultDeleteProvider.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/Providers/DefaultDeleteProvider.cs new file mode 100644 index 0000000..ab7427d --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/Providers/DefaultDeleteProvider.cs @@ -0,0 +1,26 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Volo.Abp.AuditLogging; +using Volo.Abp.DependencyInjection; + +namespace Passingwind.Abp.AuditLogging.Cleanup.Providers; + +[ExposeServices(typeof(IAuditLogCleanupDeleteProvider))] +public class DefaultDeleteProvider : IAuditLogCleanupDeleteProvider, IScopedDependency +{ + protected ILogger Logger { get; } + protected IAuditLogRepository AuditLogRepository { get; } + + public DefaultDeleteProvider(ILogger logger, IAuditLogRepository auditLogRepository) + { + Logger = logger; + AuditLogRepository = auditLogRepository; + } + + public virtual async Task DeleteAsync(DateTime endTime, CancellationToken cancellationToken = default) + { + await AuditLogRepository.DeleteDirectAsync(x => x.ExecutionTime < endTime, cancellationToken); + } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/Providers/DefaultSaveToFileProvider.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/Providers/DefaultSaveToFileProvider.cs new file mode 100644 index 0000000..cab0775 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/Providers/DefaultSaveToFileProvider.cs @@ -0,0 +1,106 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Passingwind.Abp.AuditLogging.Options; +using Volo.Abp.AuditLogging; +using Volo.Abp.DependencyInjection; + +namespace Passingwind.Abp.AuditLogging.Cleanup.Providers; + +[ExposeServices(typeof(IAuditLogCleanupSaveToFileProvider))] +public class DefaultSaveToFileProvider : IAuditLogCleanupSaveToFileProvider, IScopedDependency +{ + protected ILogger Logger { get; } + protected IAuditLogRepository AuditLogRepository { get; } + protected IHostEnvironment HostEnvironment { get; } + protected AuditLoggingCleanupOptions AuditLoggingCleanupOptions { get; } + + public DefaultSaveToFileProvider( + ILogger logger, + IAuditLogRepository auditLogRepository, + IHostEnvironment hostEnvironment, + IOptions auditLoggingCleanupOptions) + { + Logger = logger; + AuditLogRepository = auditLogRepository; + HostEnvironment = hostEnvironment; + AuditLoggingCleanupOptions = auditLoggingCleanupOptions.Value; + } + + public virtual async Task SaveToFileAsync(DateTime endTime, CancellationToken cancellationToken = default) + { + if (string.IsNullOrWhiteSpace(AuditLoggingCleanupOptions.BackupToDir)) + { + Logger.LogWarning("The options 'BackupToDir' value is empty."); + return; + } + + var rootDir = AuditLoggingCleanupOptions.BackupToDir!; + if (!Path.IsPathRooted(rootDir)) + { + rootDir = Path.Combine(HostEnvironment.ContentRootPath, rootDir); + } + + // + const int perCount = 1000; + int index = 0; + + while (true) + { + int skipCount = index * perCount; + + var list = await AuditLogRepository.GetListAsync( + maxResultCount: perCount, + skipCount: skipCount, + endTime: endTime, + includeDetails: true, + cancellationToken: cancellationToken); + + if (list.Count == 0) + break; + + SaveToFile(index + 1, rootDir, list); + + index++; + } + + // delete source data + await AuditLogRepository.DeleteDirectAsync(x => x.ExecutionTime <= endTime, cancellationToken); + } + + protected void SaveToFile(int index, string rootDir, IEnumerable logs) + { + var saveDir = Path.Combine(rootDir, DateTime.Now.ToString("yyyyMMdd-HHmm")); + + if (!Directory.Exists(saveDir)) + { + Directory.CreateDirectory(saveDir); + } + + var filePath = Path.Combine(saveDir, $"{index}.data"); + + try + { + using var writer = new StreamWriter(filePath, true, Encoding.UTF8, 65536); + + foreach (var item in logs) + { + var jsonText = JsonSerializer.Serialize(item); + + writer.WriteLine(jsonText); + } + } + catch (Exception ex) + { + Logger.LogError(ex, "Write file failed."); + throw; + } + } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/Providers/IAuditLogCleanupDeleteProvider.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/Providers/IAuditLogCleanupDeleteProvider.cs new file mode 100644 index 0000000..be04daf --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/Providers/IAuditLogCleanupDeleteProvider.cs @@ -0,0 +1,10 @@ +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace Passingwind.Abp.AuditLogging.Cleanup.Providers; + +public interface IAuditLogCleanupDeleteProvider +{ + Task DeleteAsync(DateTime endTime, CancellationToken cancellationToken = default); +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/Providers/IAuditLogCleanupSaveToFileProvider.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/Providers/IAuditLogCleanupSaveToFileProvider.cs new file mode 100644 index 0000000..4d54b37 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Cleanup/Providers/IAuditLogCleanupSaveToFileProvider.cs @@ -0,0 +1,10 @@ +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace Passingwind.Abp.AuditLogging.Cleanup.Providers; + +public interface IAuditLogCleanupSaveToFileProvider +{ + Task SaveToFileAsync(DateTime endTime, CancellationToken cancellationToken = default); +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/FodyWeavers.xml b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/FodyWeavers.xml new file mode 100644 index 0000000..1715698 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/FodyWeavers.xsd b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/FodyWeavers.xsd new file mode 100644 index 0000000..ffa6fc4 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Options/AuditLoggingCleanupOptions.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Options/AuditLoggingCleanupOptions.cs new file mode 100644 index 0000000..7bf6295 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Options/AuditLoggingCleanupOptions.cs @@ -0,0 +1,14 @@ +namespace Passingwind.Abp.AuditLogging.Options; + +public class AuditLoggingCleanupOptions +{ + /// + /// Default: ./audit-logging-backup/" + /// + public string? BackupToDir { get; set; } + + public AuditLoggingCleanupOptions() + { + BackupToDir = "./audit-logging-backup/"; + } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Passingwind.Abp.AuditLogging.Domain.abppkg b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Passingwind.Abp.AuditLogging.Domain.abppkg new file mode 100644 index 0000000..1d574ef --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Passingwind.Abp.AuditLogging.Domain.abppkg @@ -0,0 +1,3 @@ +{ + "role": "lib.domain" +} \ No newline at end of file diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Passingwind.Abp.AuditLogging.Domain.csproj b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Passingwind.Abp.AuditLogging.Domain.csproj new file mode 100644 index 0000000..391db16 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Passingwind.Abp.AuditLogging.Domain.csproj @@ -0,0 +1,20 @@ + + + + + + netstandard2.0; + Passingwind.Abp.AuditLogging + + + + + + + + + + + + + diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Settings/AuditLoggingSettingDefinitionProvider.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Settings/AuditLoggingSettingDefinitionProvider.cs new file mode 100644 index 0000000..5bdd854 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Settings/AuditLoggingSettingDefinitionProvider.cs @@ -0,0 +1,17 @@ +using Volo.Abp.Settings; + +namespace Passingwind.Abp.AuditLogging.Settings; + +public class AuditLoggingSettingDefinitionProvider : SettingDefinitionProvider +{ + public override void Define(ISettingDefinitionContext context) + { + /* Define module settings here. + * Use names from AuditLoggingSettings class. + */ + + context.Add(new SettingDefinition(AuditLoggingSettingNames.Cleanup.Behavior, nameof(AuditLogCleanupBehavior.None))); + context.Add(new SettingDefinition(AuditLoggingSettingNames.Cleanup.KeepDays, "30")); + context.Add(new SettingDefinition(AuditLoggingSettingNames.Cleanup.SaveFileRootDir, "./storage/audit-logs-backup")); + } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Settings/AuditLoggingSettingNames.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Settings/AuditLoggingSettingNames.cs new file mode 100644 index 0000000..a674d73 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.Domain/Settings/AuditLoggingSettingNames.cs @@ -0,0 +1,15 @@ +namespace Passingwind.Abp.AuditLogging.Settings; + +public static class AuditLoggingSettingNames +{ + public const string GroupName = "AuditLogging"; + + public static class Cleanup + { + private const string Default = GroupName + ".Cleanup"; + + public const string Behavior = Default + ".Behavior"; + public const string KeepDays = Default + ".KeepDays"; + public const string SaveFileRootDir = Default + ".SaveFileRootDir"; + } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi.Client/AuditLoggingHttpApiClientModule.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi.Client/AuditLoggingHttpApiClientModule.cs new file mode 100644 index 0000000..a5b0235 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi.Client/AuditLoggingHttpApiClientModule.cs @@ -0,0 +1,22 @@ +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Http.Client; +using Volo.Abp.Modularity; +using Volo.Abp.VirtualFileSystem; + +namespace Passingwind.Abp.AuditLogging; + +[DependsOn( + typeof(AuditLoggingApplicationContractsModule), + typeof(AbpHttpClientModule))] +public class AuditLoggingHttpApiClientModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddHttpClientProxies( + typeof(AuditLoggingApplicationContractsModule).Assembly, + AuditLoggingRemoteServiceConsts.RemoteServiceName + ); + + Configure(options => options.FileSets.AddEmbedded()); + } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi.Client/FodyWeavers.xml b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi.Client/FodyWeavers.xml new file mode 100644 index 0000000..1715698 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi.Client/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi.Client/FodyWeavers.xsd b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi.Client/FodyWeavers.xsd new file mode 100644 index 0000000..ffa6fc4 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi.Client/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi.Client/Passingwind.Abp.AuditLogging.HttpApi.Client.abppkg b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi.Client/Passingwind.Abp.AuditLogging.HttpApi.Client.abppkg new file mode 100644 index 0000000..7deef5e --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi.Client/Passingwind.Abp.AuditLogging.HttpApi.Client.abppkg @@ -0,0 +1,3 @@ +{ + "role": "lib.http-api-client" +} \ No newline at end of file diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi.Client/Passingwind.Abp.AuditLogging.HttpApi.Client.csproj b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi.Client/Passingwind.Abp.AuditLogging.HttpApi.Client.csproj new file mode 100644 index 0000000..ae44d09 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi.Client/Passingwind.Abp.AuditLogging.HttpApi.Client.csproj @@ -0,0 +1,20 @@ + + + + + + netstandard2.0; + Passingwind.Abp.AuditLogging + + + + + + + + + + + + + diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/AuditLogCleanupController.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/AuditLogCleanupController.cs new file mode 100644 index 0000000..c3e6245 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/AuditLogCleanupController.cs @@ -0,0 +1,26 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp; +using Volo.Abp.AspNetCore.Mvc; + +namespace Passingwind.Abp.AuditLogging; + +[Area(AuditLoggingRemoteServiceConsts.RemoteServiceName)] +[RemoteService(Name = AuditLoggingRemoteServiceConsts.RemoteServiceName)] +[Route("api/audit-logging/audit-logs")] +public class AuditLogCleanupController : AbpControllerBase, IAuditLogCleanupAppService +{ + protected IAuditLogCleanupAppService Service { get; } + + public AuditLogCleanupController(IAuditLogCleanupAppService service) + { + Service = service; + } + + /// + [HttpPost("cleanup")] + public virtual Task RunAsync(AuditLogCleanupRequestDto input) + { + return Service.RunAsync(input); + } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/AuditLogController.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/AuditLogController.cs new file mode 100644 index 0000000..7d62528 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/AuditLogController.cs @@ -0,0 +1,42 @@ +using System; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.AspNetCore.Mvc; + +namespace Passingwind.Abp.AuditLogging; + +[Area(AuditLoggingRemoteServiceConsts.RemoteServiceName)] +[RemoteService(Name = AuditLoggingRemoteServiceConsts.RemoteServiceName)] +[Route("api/audit-logging/audit-logs")] +public class AuditLogController : AbpControllerBase, IAuditLogAppService +{ + protected IAuditLogAppService Service { get; } + + public AuditLogController(IAuditLogAppService service) + { + Service = service; + } + + /// + [HttpGet] + public virtual Task> GetListAsync(AuditLogListRequestDto input) + { + return Service.GetListAsync(input); + } + + /// + [HttpGet("{id}")] + public virtual Task GetAsync(Guid id) + { + return Service.GetAsync(id); + } + + /// + [HttpDelete("{id}")] + public virtual Task DeleteAsync(Guid id) + { + return Service.DeleteAsync(id); + } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/AuditLogSettingController.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/AuditLogSettingController.cs new file mode 100644 index 0000000..971d58f --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/AuditLogSettingController.cs @@ -0,0 +1,33 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp; +using Volo.Abp.AspNetCore.Mvc; + +namespace Passingwind.Abp.AuditLogging; + +[Area(AuditLoggingRemoteServiceConsts.RemoteServiceName)] +[RemoteService(Name = AuditLoggingRemoteServiceConsts.RemoteServiceName)] +[Route("api/audit-logging/settings")] +public class AuditLogSettingController : AbpControllerBase, IAuditLogSettingAppService +{ + private readonly IAuditLogSettingAppService _service; + + public AuditLogSettingController(IAuditLogSettingAppService service) + { + _service = service; + } + + /// + [HttpGet("cleanup")] + public virtual Task GetCleanupAsync() + { + return _service.GetCleanupAsync(); + } + + /// + [HttpPut("cleanup")] + public virtual Task UpdateCleanupAsync(AuditLogCleanupSettingsDto input) + { + return _service.UpdateCleanupAsync(input); + } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/AuditLoggingHttpApiModule.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/AuditLoggingHttpApiModule.cs new file mode 100644 index 0000000..147d72a --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/AuditLoggingHttpApiModule.cs @@ -0,0 +1,29 @@ +using Localization.Resources.AbpUi; +using Microsoft.Extensions.DependencyInjection; +using Passingwind.Abp.AuditLogging.Localization; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.Localization; +using Volo.Abp.Modularity; + +namespace Passingwind.Abp.AuditLogging; + +[DependsOn( + typeof(AuditLoggingApplicationContractsModule), + typeof(AbpAspNetCoreMvcModule))] +public class AuditLoggingHttpApiModule : AbpModule +{ + public override void PreConfigureServices(ServiceConfigurationContext context) + { + PreConfigure(mvcBuilder => mvcBuilder.AddApplicationPartIfNotExists(typeof(AuditLoggingHttpApiModule).Assembly)); + } + + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.Resources + .Get() + .AddBaseTypes(typeof(AbpUiResource)); + }); + } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/EntityChangeController.cs b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/EntityChangeController.cs new file mode 100644 index 0000000..b1a77df --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/EntityChangeController.cs @@ -0,0 +1,35 @@ +using System; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.AspNetCore.Mvc; + +namespace Passingwind.Abp.AuditLogging; + +[Area(AuditLoggingRemoteServiceConsts.RemoteServiceName)] +[RemoteService(Name = AuditLoggingRemoteServiceConsts.RemoteServiceName)] +[Route("api/audit-logging/entity-changes")] +public class EntityChangeController : AbpControllerBase, IEntityChangeAppService +{ + protected IEntityChangeAppService Service { get; } + + public EntityChangeController(IEntityChangeAppService service) + { + Service = service; + } + + /// + [HttpGet] + public virtual Task> GetListAsync(EntityChangeListRequestDto input) + { + return Service.GetListAsync(input); + } + + /// + [HttpGet("{id}")] + public virtual Task GetAsync(Guid id) + { + return Service.GetAsync(id); + } +} diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/FodyWeavers.xml b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/FodyWeavers.xml new file mode 100644 index 0000000..1715698 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/FodyWeavers.xsd b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/FodyWeavers.xsd new file mode 100644 index 0000000..ffa6fc4 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/Passingwind.Abp.AuditLogging.HttpApi.abppkg b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/Passingwind.Abp.AuditLogging.HttpApi.abppkg new file mode 100644 index 0000000..515bfe6 --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/Passingwind.Abp.AuditLogging.HttpApi.abppkg @@ -0,0 +1,3 @@ +{ + "role": "lib.http-api" +} \ No newline at end of file diff --git a/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/Passingwind.Abp.AuditLogging.HttpApi.csproj b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/Passingwind.Abp.AuditLogging.HttpApi.csproj new file mode 100644 index 0000000..d753cfa --- /dev/null +++ b/modules/audit-logging/src/Passingwind.Abp.AuditLogging.HttpApi/Passingwind.Abp.AuditLogging.HttpApi.csproj @@ -0,0 +1,15 @@ + + + + + + $(Tfw) + Passingwind.Abp.AuditLogging + + + + + + + +