From 91ab538cac8be631a91a70340d32c4f73860efe0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Ca=C5=82ka?= <25438601+rafaucau@users.noreply.github.com> Date: Wed, 19 Feb 2025 12:07:26 +0100 Subject: [PATCH] feat: flarum/gdpr integration (#91) --- composer.json | 8 +++++-- extend.php | 7 ++++++ resources/locale/en.yml | 8 +++++++ src/Data/MasqueradeAnswers.php | 40 ++++++++++++++++++++++++++++++++++ 4 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 src/Data/MasqueradeAnswers.php diff --git a/composer.json b/composer.json index 8b24ac8..10ca728 100644 --- a/composer.json +++ b/composer.json @@ -44,7 +44,10 @@ "backgroundSize": "90%", "backgroundRepeat": "no-repeat", "backgroundPosition": "center" - } + }, + "optional-dependencies": [ + "flarum/gdpr" + ] }, "flagrow": { "discuss": "https://discuss.flarum.org/d/5791" @@ -61,7 +64,8 @@ } }, "require-dev": { - "flarum/phpstan": "*" + "flarum/phpstan": "*", + "flarum/gdpr": "^1.0.0@beta" }, "scripts": { "analyse:phpstan": "phpstan analyse", diff --git a/extend.php b/extend.php index 1c1b18e..3898869 100644 --- a/extend.php +++ b/extend.php @@ -12,6 +12,7 @@ use Flarum\Api\Serializer\BasicUserSerializer; use Flarum\Api\Serializer\ForumSerializer; use Flarum\Api\Serializer\UserSerializer; +use Flarum\Gdpr\Extend\UserData; use Flarum\User\Filter\UserFilterer; use Flarum\User\Search\UserSearcher; use Flarum\User\User; @@ -109,4 +110,10 @@ (new Extend\Filter(UserFilterer::class)) ->addFilter(Gambits\AnswerGambit::class), + + (new Extend\Conditional()) + ->whenExtensionEnabled('flarum-gdpr', fn () => [ + (new UserData()) + ->addType(Data\MasqueradeAnswers::class), + ]), ]; diff --git a/resources/locale/en.yml b/resources/locale/en.yml index 4e81d4a..6ac54b7 100644 --- a/resources/locale/en.yml +++ b/resources/locale/en.yml @@ -60,3 +60,11 @@ fof-masquerade: email: Email select: Dropdown url: URL + +flarum-gdpr: + lib: + data: + masqueradeanswers: + export_description: Exports the user's profile field answers + delete_description: Removes all profile field answers from the user's account + anonymize_description: => flarum-gdpr.lib.data.masqueradeanswers.delete_description diff --git a/src/Data/MasqueradeAnswers.php b/src/Data/MasqueradeAnswers.php new file mode 100644 index 0000000..3690bdc --- /dev/null +++ b/src/Data/MasqueradeAnswers.php @@ -0,0 +1,40 @@ +where('user_id', '=', $this->user->id) + ->each(function (Answer $answer) use (&$data) { + $data[] = ["masquerade/answer-{$answer->id}.json" => $this->encodeForExport($this->sanitize($answer))]; + }); + + return $data; + } + + protected function sanitize(Answer $answer): array + { + return Arr::except($answer->toArray(), ['id', 'user_id']); + } + + public function anonymize(): void + { + $this->delete(); + } + + public function delete(): void + { + Answer::query() + ->where('user_id', '=', $this->user->id) + ->delete(); + } +}