1<?php
2
3namespace Kanboard\Core\User;
4
5use Kanboard\Core\Base;
6
7/**
8 * User Synchronization
9 *
10 * @package  user
11 * @author   Frederic Guillot
12 */
13class UserSync extends Base
14{
15    /**
16     * Synchronize user profile
17     *
18     * @access public
19     * @param  UserProviderInterface $user
20     * @return array
21     */
22    public function synchronize(UserProviderInterface $user)
23    {
24        $profile = $this->userModel->getByExternalId($user->getExternalIdColumn(), $user->getExternalId());
25        $properties = UserProperty::getProperties($user);
26
27        if (! empty($profile)) {
28            $profile = $this->updateUser($profile, $properties);
29        } elseif ($user->isUserCreationAllowed()) {
30            $profile = $this->createUser($user, $properties);
31        }
32
33        return $profile;
34    }
35
36    /**
37     * Update user profile
38     *
39     * @access public
40     * @param  array    $profile
41     * @param  array    $properties
42     * @return array
43     */
44    private function updateUser(array $profile, array $properties)
45    {
46        $values = UserProperty::filterProperties($profile, $properties);
47
48        if (! empty($values)) {
49            $values['id'] = $profile['id'];
50            $result = $this->userModel->update($values);
51            return $result ? array_merge($profile, $properties) : $profile;
52        }
53
54        return $profile;
55    }
56
57    /**
58     * Create user
59     *
60     * @access public
61     * @param  UserProviderInterface  $user
62     * @param  array                  $properties
63     * @return array
64     */
65    private function createUser(UserProviderInterface $user, array $properties)
66    {
67        $userId = $this->userModel->create($properties);
68
69        if ($userId === false) {
70            $this->logger->error('Unable to create user profile: '.$user->getExternalId());
71            return array();
72        }
73
74        return $this->userModel->getById($userId);
75    }
76}
77