Passed
Push — master ( 7073d8...993609 )
by y
01:42
created

User::getCacheKeys()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 4
nc 2
nop 0
dl 0
loc 9
rs 10
c 1
b 0
f 0
1
<?php
2
3
namespace Helix\Asana;
4
5
use Helix\Asana\Base\AbstractEntity;
6
use Helix\Asana\User\Photo;
7
use Helix\Asana\User\TaskList;
8
9
/**
10
 * A user.
11
 *
12
 * @see https://developers.asana.com/docs/asana-users
13
 * @see https://developers.asana.com/docs/user
14
 *
15
 * @immutable Users cannot be altered via the API.
16
 *
17
 * @method string       getEmail        ()
18
 * @method string       getName         ()
19
 * @method null|Photo   getPhoto        ()
20
 * @method Workspace[]  getWorkspaces   ()
21
 */
22
class User extends AbstractEntity {
23
24
    const TYPE = 'user';
25
26
    protected static $map = [
27
        'photo' => Photo::class,
28
        'workspaces' => [Workspace::class]
29
    ];
30
31
    final public function __toString (): string {
32
        return "users/{$this->getGid()}";
33
    }
34
35
    /**
36
     * @param Workspace $workspace
37
     * @return $this
38
     */
39
    public function addToWorkspace (Workspace $workspace) {
40
        $this->api->post("{$workspace}/addUser", ['user' => $this->getGid()]);
41
        $this->_merge('workspaces', [$workspace]);
42
        return $this;
43
    }
44
45
    /**
46
     * @return string[]
47
     */
48
    public function getCacheKeys () {
49
        $keys = parent::getCacheKeys();
50
51
        // only include email as a key if it's loaded
52
        if (isset($this->data['email'])) {
53
            $keys[] = $this->data['email'];
54
        }
55
56
        return $keys;
57
    }
58
59
    /**
60
     * @param Workspace $workspace
61
     * @return Portfolio[]
62
     */
63
    public function getFavoritePortfolios (Workspace $workspace) {
64
        return $this->getFavorites(Portfolio::class, Portfolio::TYPE, $workspace);
65
    }
66
67
    /**
68
     * @param Workspace $workspace
69
     * @return Project[]
70
     */
71
    public function getFavoriteProjects (Workspace $workspace) {
72
        return $this->getFavorites(Project::class, Project::TYPE, $workspace);
73
    }
74
75
    /**
76
     * @param Workspace $workspace
77
     * @return Tag[]
78
     */
79
    public function getFavoriteTags (Workspace $workspace) {
80
        return $this->getFavorites(Tag::class, Tag::TYPE, $workspace);
81
    }
82
83
    /**
84
     * @param Workspace $workspace
85
     * @return Team[]
86
     */
87
    public function getFavoriteTeams (Workspace $workspace) {
88
        return $this->getFavorites(Team::class, Team::TYPE, $workspace);
89
    }
90
91
    /**
92
     * @param Workspace $workspace
93
     * @return User[]
94
     */
95
    public function getFavoriteUsers (Workspace $workspace) {
96
        return $this->getFavorites(self::class, self::TYPE, $workspace);
97
    }
98
99
    /**
100
     * @param string $class
101
     * @param string $resourceType
102
     * @param Workspace $workspace
103
     * @return array
104
     */
105
    protected function getFavorites (string $class, string $resourceType, Workspace $workspace) {
106
        return $this->loadAll($class, "{$this}/favorites", [
107
            'resource_type' => $resourceType,
108
            'workspace' => $workspace->getGid()
109
        ]);
110
    }
111
112
    /**
113
     * Returns all incomplete tasks in the given workspace that are assigned to the user.
114
     *
115
     * @see https://developers.asana.com/docs/get-multiple-tasks
116
     *
117
     * @param Workspace $workspace
118
     * @return Task[]
119
     */
120
    public function getIncompleteTasks (Workspace $workspace) {
121
        return $this->loadAll(Task::class, 'tasks', [
122
            'assignee' => $this->getGid(),
123
            'workspace' => $workspace->getGid(),
124
            'completed_since' => 'now'
125
        ]);
126
    }
127
128
    /**
129
     * @param Workspace $workspace
130
     * @return Portfolio[]
131
     */
132
    public function getPortfolios (Workspace $workspace) {
133
        return $this->loadAll(Portfolio::class, "portfolios", [
134
            'workspace' => $workspace->getGid(),
135
            'owner' => $this->getGid()
136
        ]);
137
    }
138
139
    /**
140
     * @param Workspace $workspace
141
     * @return TaskList
142
     */
143
    public function getTaskList (Workspace $workspace) {
144
        return $this->load(TaskList::class, "{$this}/user_task_list", [
145
            'workspace' => $workspace->getGid()
146
        ]);
147
    }
148
149
    /**
150
     * Returns all tasks in the given workspace that are assigned to the user.
151
     *
152
     * @see https://developers.asana.com/docs/get-multiple-tasks
153
     *
154
     * @param Workspace $workspace
155
     * @param string[] $filter
156
     * @return Task[]
157
     */
158
    public function getTasks (Workspace $workspace, array $filter = []) {
159
        $filter['assignee'] = $this->getGid();
160
        $filter['workspace'] = $workspace->getGid();
161
        return $this->loadAll(Task::class, 'tasks', $filter);
162
    }
163
164
    /**
165
     * @param Workspace $organization
166
     * @return Team[]
167
     */
168
    public function getTeams (Workspace $organization) {
169
        return $this->loadAll(Team::class, "{$this}/teams", [
170
            'organization' => $organization->getGid()
171
        ]);
172
    }
173
174
    public function getUrl (): string {
175
        return "https://app.asana.com/0/{$this->getGid()}/list";
176
    }
177
178
    /**
179
     * @param Workspace $workspace
180
     * @return $this
181
     */
182
    public function removeFromWorkspace (Workspace $workspace) {
183
        $this->api->post("{$workspace}/removeUser", ['user' => $this->getGid()]);
184
        $this->_remove('workspaces', [$workspace]);
185
        return $this;
186
    }
187
}