Covivo/mobicoop

View on GitHub
api/src/User/Service/PseudonymizationManager.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

namespace App\User\Service;

use App\User\Entity\User;

class PseudonymizationManager
{
    private const DELETE_AVAILABLE_USER_FIELDS = ['birthDate', 'chat', 'chatFavorites', 'drivingLicenceNumber', 'emailToken', 'familyName', 'gamification', 'givenName', 'mobile', 'music', 'musicFavorites', 'newsSubscription', 'oldEmail', 'oldTelephone', 'postalAddress', 'proEmail', 'proName', 'smoke', 'telephone', 'unsubscribeToken'];
    private const DELETE_AVAILABLE_MASS_PERSON_FIELDS = ['familyName', 'givenName'];
    private const PSEUDONYMISED_EMAIL_SUFFIX = '@mobicoop-anonymized.io';

    /**
     * @var User
     */
    protected $_user;

    public function __construct() {}

    public static function isUserPseudonymized(User $user): bool
    {
        return User::STATUS_PSEUDONYMIZED === $user->getStatus();
    }

    public function pseudonymizedUser(User $user): User
    {
        $this->_user = $user;

        $this->_pseudonymizedBasics();
        $this->_pseudonymizedHomeAddress();
        $this->_pseudonomyzedMassPerson();

        $this->_removeFromCommunities();
        $this->_pseudonymizedSsoAccounts();

        return $this->_user;
    }

    private function _getSetter(string $field): string
    {
        return 'set'.ucfirst($field);
    }

    private function _pseudonymizedBasics()
    {
        $today = new \DateTime('now');

        foreach (self::DELETE_AVAILABLE_USER_FIELDS as $key => $field) {
            $setter = $this->_getSetter($field);

            $this->_user->{$setter}(null);
        }

        $this->_user->setEmail($this->_user->getId().self::PSEUDONYMISED_EMAIL_SUFFIX);
        $this->_user->setPassword(password_hash($today->format('Y-m-d H:m:s'), PASSWORD_DEFAULT));
        $this->_user->setGender(User::GENDER_OTHER);
        $this->_user->setStatus(User::STATUS_PSEUDONYMIZED);
    }

    private function _pseudonymizedHomeAddress()
    {
        if (!is_null($this->_user->getHomeAddress())) {
            $this->_user->getHomeAddress()->setUser(null);
        }
    }

    private function _pseudonomyzedMassPerson()
    {
        if (!is_null($this->_user->getMassPerson())) {
            foreach (self::DELETE_AVAILABLE_MASS_PERSON_FIELDS as $key => $field) {
                $setter = $this->_getSetter($field);

                $this->_user->getMassPerson()->{$setter}(null);
            }

            $this->_user->getMassPerson()->setEmail($this->_user->getEmail());
        }
    }

    private function _removeFromCommunities()
    {
        foreach ($this->_user->getCommunities() as $community) {
            $this->_user->removeCommunity($community);
        }
    }

    private function _pseudonymizedSsoAccounts()
    {
        foreach ($this->_user->getSsoAccounts() as $ssoAccount) {
            $this->_user->removeSsoAccount($ssoAccount);
        }
    }
}