diff --git a/src/main/java/net/accelbyte/gdpr/sdk/GDPRHandler.java b/src/main/java/net/accelbyte/gdpr/sdk/GDPRHandler.java index 23787c4..ef8343a 100644 --- a/src/main/java/net/accelbyte/gdpr/sdk/GDPRHandler.java +++ b/src/main/java/net/accelbyte/gdpr/sdk/GDPRHandler.java @@ -5,18 +5,21 @@ package net.accelbyte.gdpr.sdk; +import net.accelbyte.gdpr.registered.v1.AccountInfo; import net.accelbyte.gdpr.sdk.object.DataGenerationResult; +import java.util.List; + public interface GDPRHandler { /** * Process data generation for the requested user. * * The concrete implementation should put the data result into "data" property inside DataGenerationResult object. - * The "data" property (inside DataGenerationResult object) was in form of Map, + * The "data" property (inside DataGenerationResult object) was in form of Map<ModuleId, byte[]>, * this allows the concrete implementation to categorized multiple data based on the modules they have. * Example: - * Map = { + * Map<ModuleId, byte[]> = { * entitlement: entitlementData, * wallet: walletData, * transaction: transactionData @@ -50,4 +53,13 @@ public interface GDPRHandler { * @param isPublisherNamespace indicate whether the "namespace" is a publisher namespace or game namespace */ void ProcessDataRestriction(String namespace, String userId, boolean restrict, boolean isPublisherNamespace); + + /** + * Handle 3rd party platform account closure. + * + * @param platform 3rd party platform + * @param platformUserId 3rd party platform account id + * @param accounts linked AGS accounts in all namespaces(including publisher namespace) + */ + void ProcessPlatformAccountClosure(String platform, String platformUserId, List accounts); } diff --git a/src/main/java/net/accelbyte/gdpr/sdk/GDPRService.java b/src/main/java/net/accelbyte/gdpr/sdk/GDPRService.java index 4b55b2c..ecd0508 100644 --- a/src/main/java/net/accelbyte/gdpr/sdk/GDPRService.java +++ b/src/main/java/net/accelbyte/gdpr/sdk/GDPRService.java @@ -122,4 +122,33 @@ public void dataRestriction(DataRestrictionRequest request, StreamObserver responseObserver) { + PlatformAccountClosureResponse.Builder responseBuilder = PlatformAccountClosureResponse.newBuilder(); + if (Strings.isNullOrEmpty(request.getPlatform()) || Strings.isNullOrEmpty(request.getPlatformUserId()) || request.getAccountsList() == null || request.getAccountsList().size() == 0) { + log.error("[GDPRService.platformAccountClosure] empty required payload: platform or platformUserId or linked accounts."); + responseBuilder.setSuccess(false).setMessage("required payload is empty"); + responseObserver.onNext(responseBuilder.build()); + responseObserver.onCompleted(); + return; + } + + if (handler == null) { + responseBuilder.setSuccess(true); + } else { + log.info("[GDPRService.platformAccountClosure] start executing for platform [{}]", + request.getPlatform()); + try { + handler.ProcessPlatformAccountClosure(request.getPlatform(), request.getPlatformUserId(), request.getAccountsList()); + responseBuilder.setSuccess(true); + }catch (Exception ex) { + log.error("[GDPRService.platformAccountClosure] error: [{}]", ex.getMessage()); + responseBuilder.setSuccess(false).setMessage(ex.getMessage()); + } + } + responseObserver.onNext(responseBuilder.build()); + responseObserver.onCompleted(); + } + } diff --git a/src/main/proto/gdpr.proto b/src/main/proto/gdpr.proto index 86ec12f..59d5842 100644 --- a/src/main/proto/gdpr.proto +++ b/src/main/proto/gdpr.proto @@ -30,6 +30,12 @@ service GDPR { */ rpc DataRestriction(DataRestrictionRequest) returns (DataRestrictionResponse) {}; + /** + Platform Account Closure. + Used to inform the registered services to handle the 3rd party account closure. + */ + rpc PlatformAccountClosure(PlatformAccountClosureRequest) returns (PlatformAccountClosureResponse) {}; + } message DataGenerationRequest { @@ -65,4 +71,20 @@ message DataRestrictionRequest { message DataRestrictionResponse { bool success = 1; // indicate restrict processing was success string message = 2; // message from restrict processing +} + +message AccountInfo { + string namespace = 1; // namespace + string userId = 2; // user id in the namespace +} + +message PlatformAccountClosureRequest { + string platform = 1; // platform: psn, xbox, epicgames, etc + string platformUserId = 2; // third party account id + repeated AccountInfo accounts = 3; // account info in each namespace +} + +message PlatformAccountClosureResponse { + bool success = 1; // indicates platform account closure was success + string message = 2; // message from platform account closure process } \ No newline at end of file