diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index f3e495c814..94a2e79415 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -403,6 +403,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.DistributedLocking EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BackgroundWorkers.Hangfire", "src\Volo.Abp.BackgroundWorkers.Hangfire\Volo.Abp.BackgroundWorkers.Hangfire.csproj", "{E5FCE710-C5A3-4F94-B9C9-BD1E99252BFB}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Gdpr.Abstractions", "src\Volo.Abp.Gdpr.Abstractions\Volo.Abp.Gdpr.Abstractions.csproj", "{3683340D-92F5-4B14-B77B-34A163333309}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -1201,6 +1203,10 @@ Global {E5FCE710-C5A3-4F94-B9C9-BD1E99252BFB}.Debug|Any CPU.Build.0 = Debug|Any CPU {E5FCE710-C5A3-4F94-B9C9-BD1E99252BFB}.Release|Any CPU.ActiveCfg = Release|Any CPU {E5FCE710-C5A3-4F94-B9C9-BD1E99252BFB}.Release|Any CPU.Build.0 = Release|Any CPU + {3683340D-92F5-4B14-B77B-34A163333309}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3683340D-92F5-4B14-B77B-34A163333309}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3683340D-92F5-4B14-B77B-34A163333309}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3683340D-92F5-4B14-B77B-34A163333309}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1404,6 +1410,7 @@ Global {CA805B77-D50C-431F-B3CB-1111C9C6E807} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {C4F54FB5-C828-414D-BA03-E8E7A10C784D} = {447C8A77-E5F0-4538-8687-7383196D04EA} {E5FCE710-C5A3-4F94-B9C9-BD1E99252BFB} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} + {3683340D-92F5-4B14-B77B-34A163333309} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5} diff --git a/framework/src/Volo.Abp.Gdpr.Abstractions/FodyWeavers.xml b/framework/src/Volo.Abp.Gdpr.Abstractions/FodyWeavers.xml new file mode 100644 index 0000000000..00e1d9a1c1 --- /dev/null +++ b/framework/src/Volo.Abp.Gdpr.Abstractions/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/framework/src/Volo.Abp.Gdpr.Abstractions/FodyWeavers.xsd b/framework/src/Volo.Abp.Gdpr.Abstractions/FodyWeavers.xsd new file mode 100644 index 0000000000..3f3946e282 --- /dev/null +++ b/framework/src/Volo.Abp.Gdpr.Abstractions/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/framework/src/Volo.Abp.Gdpr.Abstractions/Volo.Abp.Gdpr.Abstractions.csproj b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo.Abp.Gdpr.Abstractions.csproj new file mode 100644 index 0000000000..3a5f8369b0 --- /dev/null +++ b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo.Abp.Gdpr.Abstractions.csproj @@ -0,0 +1,15 @@ + + + + + + + netstandard2.0 + + + + + + + + diff --git a/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/AbpGdprAbstractionsModule.cs b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/AbpGdprAbstractionsModule.cs new file mode 100644 index 0000000000..9d1e95eae9 --- /dev/null +++ b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/AbpGdprAbstractionsModule.cs @@ -0,0 +1,9 @@ +using Volo.Abp.EventBus; +using Volo.Abp.Modularity; + +namespace Volo.Abp.Gdpr; + +[DependsOn(typeof(AbpEventBusModule))] +public class AbpGdprAbstractionsModule : AbpModule +{ +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprDataInfo.cs b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprDataInfo.cs new file mode 100644 index 0000000000..550f556a1c --- /dev/null +++ b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprDataInfo.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; + +namespace Volo.Abp.Gdpr; + +[Serializable] +public class GdprDataInfo : Dictionary +{ + +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataDeleteRequestedEto.cs b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataDeleteRequestedEto.cs new file mode 100644 index 0000000000..c5975e1496 --- /dev/null +++ b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataDeleteRequestedEto.cs @@ -0,0 +1,9 @@ +using System; + +namespace Volo.Abp.Gdpr; + +[Serializable] +public class GdprUserDataDeleteRequestedEto +{ + public Guid UserId { get; set; } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataPreparedEto.cs b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataPreparedEto.cs new file mode 100644 index 0000000000..3a2c440f97 --- /dev/null +++ b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataPreparedEto.cs @@ -0,0 +1,13 @@ +using System; + +namespace Volo.Abp.Gdpr; + +[Serializable] +public class GdprUserDataPreparedEto +{ + public Guid RequestId { get; set; } + + public string Provider { get; set; } + + public GdprDataInfo Data { get; set; } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataProviderBase.cs b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataProviderBase.cs new file mode 100644 index 0000000000..696cf16e74 --- /dev/null +++ b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataProviderBase.cs @@ -0,0 +1,8 @@ +using System.Threading.Tasks; + +namespace Volo.Abp.Gdpr; + +public abstract class GdprUserDataProviderBase : IGdprUserDataProvider +{ + public abstract Task GetAsync(GdprUserDataProviderContext context); +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataProviderContext.cs b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataProviderContext.cs new file mode 100644 index 0000000000..1ccd035b7e --- /dev/null +++ b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataProviderContext.cs @@ -0,0 +1,8 @@ +using System; + +namespace Volo.Abp.Gdpr; + +public class GdprUserDataProviderContext +{ + public Guid UserId { get; set; } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataRequestEventHandler.cs b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataRequestEventHandler.cs new file mode 100644 index 0000000000..d9453c7ef5 --- /dev/null +++ b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataRequestEventHandler.cs @@ -0,0 +1,41 @@ +using System.Linq; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.DependencyInjection; +using Volo.Abp.EventBus.Distributed; + +namespace Volo.Abp.Gdpr; + +public class GdprUserDataRequestEventHandler + : IDistributedEventHandler, ITransientDependency +{ + protected IServiceScopeFactory ServiceScopeFactory { get; } + protected IDistributedEventBus EventBus { get; } + + public GdprUserDataRequestEventHandler(IServiceScopeFactory serviceScopeFactory, IDistributedEventBus eventBus) + { + ServiceScopeFactory = serviceScopeFactory; + EventBus = eventBus; + } + + public async Task HandleEventAsync(GdprUserDataRequestedEto eventData) + { + using (var scope = ServiceScopeFactory.CreateScope()) + { + var gdprDataProviders = scope.ServiceProvider.GetServices().ToList(); + + foreach (var gdprDataProvider in gdprDataProviders) + { + var gdprDataInfo = await gdprDataProvider.GetAsync(new GdprUserDataProviderContext { UserId = eventData.UserId}); + + await EventBus.PublishAsync( + new GdprUserDataPreparedEto + { + RequestId = eventData.RequestId, + Data = gdprDataInfo, + Provider = gdprDataProvider.GetType().FullName + }); + } + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataRequestedEto.cs b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataRequestedEto.cs new file mode 100644 index 0000000000..b341ab2659 --- /dev/null +++ b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataRequestedEto.cs @@ -0,0 +1,11 @@ +using System; + +namespace Volo.Abp.Gdpr; + +[Serializable] +public class GdprUserDataRequestedEto +{ + public Guid UserId { get; set; } + + public Guid RequestId { get; set; } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/IGdprUserDataProvider.cs b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/IGdprUserDataProvider.cs new file mode 100644 index 0000000000..e04fc950d9 --- /dev/null +++ b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/IGdprUserDataProvider.cs @@ -0,0 +1,8 @@ +using System.Threading.Tasks; + +namespace Volo.Abp.Gdpr; + +public interface IGdprUserDataProvider +{ + Task GetAsync(GdprUserDataProviderContext context); +} \ No newline at end of file