phpmentoring/webapp

View on GitHub
src/Mentoring/User/UserHydrator.php

Summary

Maintainability
B
6 hrs
Test Coverage
<?php

namespace Mentoring\User;

use Mentoring\Taxonomy\TaxonomyService;
use Mentoring\Taxonomy\TermHydrator;

class UserHydrator
{
    protected $taxonomyService;
    protected $termHydrator;

    public function __construct(TaxonomyService $taxonomyService, TermHydrator $termHydrator)
    {
        $this->taxonomyService = $taxonomyService;
        $this->termHydrator = $termHydrator;
    }

    /**
     * Extracts and returns the user data from the user object
     *
     * @param  User $object
     * @return array
     */
    public function extract(User $object)
    {
        $data = [
            'email' => $object->getEmail(),
            'id' => $object->getId(),
            'name' => $object->getName(),
            'roles' => $object->getRoles(),
            'timeCreated' => $object->getTimeCreated(),
            'isEnabled' => $object->isEnabled(),
            'githubUid' => $object->getGithubUid(),
            'githubName' => $object->getGithubName(),
            'isMentee' => $object->isMentee(),
            'isMentor' => $object->isMentor(),
            'profile' => $object->getProfile(),
            'apprenticeTags' => $object->getApprenticeTags(),
            'mentorTags' => $object->getMentorTags(),
            'languagesTags' => $object->getLanguagesTags(),
            'imageUrl' => $object->getProfileImage(),
            'timezone' => $object->getTimezone(),
            'sendNotifications' => $object->hasSendNotifications()
        ];

        if (!is_null($this->termHydrator)) {
            $apprenticeTags = $data['apprenticeTags'];
            unset($data['apprenticeTags']);
            foreach ($apprenticeTags as $key => $tag) {
                $tag = $this->termHydrator->extract($tag);
                $apprenticeTags[$key] = $tag;
            }
            $data['apprenticeTags'] = $apprenticeTags;

            $mentorTags = $data['mentorTags'];
            unset($data['mentorTags']);
            foreach ($mentorTags as $key => $tag) {
                $tag = $this->termHydrator->extract($tag);
                $mentorTags[$key] = $tag;
            }
            $data['mentorTags'] = $mentorTags;

            $languagesTags = $data['languagesTags'];
            unset($data['languagesTags']);
            foreach ($languagesTags as $key => $tag) {
                $tag = $this->termHydrator->extract($tag);
                $languagesTags[$key] = $tag;
            }
            $data['languagesTags'] = $languagesTags;
        }

        if ($data['timeCreated'] instanceof \DateTime) {
            $data['timeCreated'] = $data['timeCreated']->format(\DateTime::ISO8601);
        }

        if ($data['timezone'] instanceof \DateTimeZone) {
            $data['timezone'] = $data['timezone']->getName();
        }

        return $data;
    }

    /**
     * Hydrates a user object with the data
     *
     * @param array $data
     * @param User $object
     *
     * @return User
     */
    public function hydrate(array $data, User $object)
    {
        $object->setEmail($data['email']);
        $object->setName($data['name']);
        $object->setSendNotifications($data['sendNotifications']);

        if (isset($data['timezone'])) {
            $object->setTimezone($data['timezone']);
        }

        $object->setIsMentee($data['isMentee']);
        $object->setIsMentor($data['isMentor']);

        if (isset($data['isEnabled'])) {
            $object->setIsEnabled($data['isEnabled']);
        }

        if (isset($data['githubUid'])) {
            $object->setGithubUid($data['githubUid']);
        }

        if (isset($data['githubName'])) {
            $object->setGithubName($data['githubName']);
        }

        if (isset($data['timeCreated'])) {
            if (!$data['timeCreated'] instanceof \DateTime) {
                $createdTime = new \DateTime($data['timeCreated']);
                $object->setTimeCreated($createdTime);
            } else {
                $object->setTimeCreated($data['timeCreated']);
            }
        }

        if (isset($data['id'])) {
            $object->setId($data['id']);
        }

        if (isset($data['roles'])) {
            if (is_array($data['roles'])) {
                $object->setRoles($data['roles']);
            } else {
                $object->setRoles(unserialize($data['roles']));
            }
        }

        if (isset($data['profile'])) {
            $object->setProfile($data['profile']);
        }

        $mentoringTerm = $this->taxonomyService->fetchVocabularyByName('mentor');
        $apprenticeTerm = $this->taxonomyService->fetchVocabularyByName('apprentice');
        $languagesTerm = $this->taxonomyService->fetchVocabularyByName('languages');

        $object->setMentorTags($this->taxonomyService->fetchTermsForUser($object, $mentoringTerm));
        $object->setApprenticeTags($this->taxonomyService->fetchTermsForUser($object, $apprenticeTerm));
        $object->setLanguagesTags($this->taxonomyService->fetchTermsForUser($object, $languagesTerm));

        return $object;
    }
}