Portfolio::removeMember()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 2
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace Helix\Asana;
4
5
use Helix\Asana\Base\AbstractEntity;
6
use Helix\Asana\Base\AbstractEntity\CrudTrait;
7
use Helix\Asana\Base\AbstractEntity\PostMutatorTrait;
8
use Helix\Asana\CustomField\FieldSetting;
9
use Helix\Asana\CustomField\FieldSettingsTrait;
10
use IteratorAggregate;
11
use Traversable;
12
13
/**
14
 * A portfolio.
15
 *
16
 * This is only available to business/enterprise accounts.
17
 *
18
 * So...
19
 *
20
 * I haven't tested this.
21
 *
22
 * If you have a biz account you want to let me play on, please contact me.
23
 *
24
 * @see https://developers.asana.com/docs/asana-portfolios
25
 * @see https://developers.asana.com/docs/portfolio
26
 *
27
 * @see Workspace::newPortfolio()
28
 *
29
 * @method $this        setWorkspace    (Workspace $workspace) @depends create-only
30
 *
31
 * @method string       getColor        ()
32
 * @method string       getCreatedAt    () RFC3339x
33
 * @method User         getCreatedBy    ()
34
 * @method User[]       getMembers      ()
35
 * @method string       getName         ()
36
 * @method User         getOwner        ()
37
 * @method Workspace    getWorkspace    ()
38
 *
39
 * @method bool         hasMembers      ()
40
 *
41
 * @method $this        setColor        (string $color)
42
 * @method $this        setMembers      (User[] $members)
43
 * @method $this        setName         (string $name)
44
 * @method $this        setOwner        (User $owner)
45
 *
46
 * @method User[]       selectMembers   (callable $filter) `fn( User $user ): bool`
47
 */
48
class Portfolio extends AbstractEntity implements IteratorAggregate {
49
50
    use CrudTrait;
51
    use FieldSettingsTrait;
52
    use PostMutatorTrait;
53
54
    const DIR = 'portfolios';
55
    const TYPE = 'portfolio';
56
57
    protected const MAP = [
58
        'created_by' => User::class,
59
        'custom_field_settings' => [FieldSetting::class],
60
        'owner' => User::class,
61
        'members' => [User::class],
62
        'workspace' => Workspace::class
63
    ];
64
65
    /**
66
     * @param User $user
67
     * @return $this
68
     */
69
    public function addMember (User $user) {
70
        return $this->addMembers([$user]);
71
    }
72
73
    /**
74
     * @param User[] $users
75
     * @return $this
76
     */
77
    public function addMembers (array $users) {
78
        return $this->_addWithPost("{$this}/addMembers", [
79
            'members' => array_column($users, 'gid')
80
        ], 'members', $users);
81
    }
82
83
    /**
84
     * @param Project $project
85
     * @return $this
86
     */
87
    public function addProject (Project $project) {
88
        $this->api->post("{$this}/addItem", ['item' => $project->getGid()]);
89
        return $this;
90
    }
91
92
    /**
93
     * No API filter is available.
94
     *
95
     * @return Traversable|Project[]
96
     */
97
    public function getIterator () {
98
        return $this->api->loadEach($this, Project::class, "{$this}/items");
99
    }
100
101
    /**
102
     * @return Project[]
103
     */
104
    public function getProjects () {
105
        return iterator_to_array($this);
106
    }
107
108
    /**
109
     * @param User $user
110
     * @return $this
111
     */
112
    public function removeMember (User $user) {
113
        return $this->removeMembers([$user]);
114
    }
115
116
    /**
117
     * @param User[] $users
118
     * @return $this
119
     */
120
    public function removeMembers (array $users) {
121
        return $this->_removeWithPost("{$this}/removeMembers", [
122
            'members' => array_column($users, 'gid')
123
        ], 'members', $users);
124
    }
125
126
    /**
127
     * @param Project $project
128
     * @return $this
129
     */
130
    public function removeProject (Project $project) {
131
        $this->api->post("{$this}/removeItem", ['item' => $project->getGid()]);
132
        return $this;
133
    }
134
135
    /**
136
     * @param callable $filter `fn( Project $project ): bool`
137
     * @return Project[]
138
     */
139
    public function selectProjects (callable $filter) {
140
        return $this->_select($this, $filter);
141
    }
142
}