Completed
Push — master ( 5d951f...f67c03 )
by Nate
13:58 queued 11:06
created

OrganizationUserAssociations::init()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 8
ccs 0
cts 7
cp 0
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 5
nc 1
nop 0
crap 2
1
<?php
2
3
/**
4
 * @copyright  Copyright (c) Flipbox Digital Limited
5
 * @license    https://flipboxfactory.com/software/organization/license
6
 * @link       https://www.flipboxfactory.com/software/organization/
7
 */
8
9
namespace flipbox\organizations\services;
10
11
use Craft;
12
use flipbox\craft\sortable\associations\db\SortableAssociationQueryInterface;
13
use flipbox\craft\sortable\associations\records\SortableAssociationInterface;
14
use flipbox\craft\sortable\associations\services\SortableAssociations;
15
use flipbox\ember\helpers\QueryHelper;
16
use flipbox\ember\services\traits\records\Accessor;
17
use flipbox\organizations\db\OrganizationUserAssociationQuery;
18
use flipbox\organizations\db\UserOrganizationAssociationQuery;
19
use flipbox\organizations\Organizations as OrganizationPlugin;
20
use flipbox\organizations\records\UserAssociation;
21
22
/**
23
 * Manage the User associations for an Organization.  An Organization may have multiple user associations.
24
 *
25
 * @author Flipbox Factory <[email protected]>
26
 * @since 1.0.0
27
 *
28
 * @method UserAssociation create(array $attributes = [])
29
 * @method UserAssociation find($identifier)
30
 * @method UserAssociation get($identifier)
31
 * @method UserAssociation findByCondition($condition = [])
32
 * @method UserAssociation getByCondition($condition = [])
33
 * @method UserAssociation findByCriteria($criteria = [])
34
 * @method UserAssociation getByCriteria($criteria = [])
35
 * @method UserAssociation[] findAllByCondition($condition = [])
36
 * @method UserAssociation[] getAllByCondition($condition = [])
37
 * @method UserAssociation[] findAllByCriteria($criteria = [])
38
 * @method UserAssociation[] getAllByCriteria($criteria = [])
39
 */
40
class OrganizationUserAssociations extends SortableAssociations
41
{
42
    use Accessor;
43
44
    /**
45
     * @inheritdoc
46
     */
47
    public function init()
48
    {
49
        $settings = OrganizationPlugin::getInstance()->getSettings();
50
        $this->cacheDuration = $settings->organizationUserAssociationsCacheDuration;
51
        $this->cacheDependency = $settings->organizationUserAssociationsCacheDependency;
52
53
        parent::init();
54
    }
55
56
    /**
57
     * @return string
58
     */
59
    const SOURCE_ATTRIBUTE = UserAssociation::SOURCE_ATTRIBUTE;
60
61
    /**
62
     * @return string
63
     */
64
    const TARGET_ATTRIBUTE = UserAssociation::TARGET_ATTRIBUTE;
65
66
    /**
67
     * @return string
68
     */
69
    const SORT_ORDER_ATTRIBUTE = 'organizationOrder';
70
71
    /**
72
     * @inheritdoc
73
     */
74
    protected static function tableAlias(): string
75
    {
76
        return UserAssociation::tableAlias();
77
    }
78
79
    /**
80
     * @inheritdoc
81
     * @return OrganizationUserAssociationQuery
82
     */
83
    public function getQuery($config = []): SortableAssociationQueryInterface
84
    {
85
        /** @var OrganizationUserAssociationQuery $query */
86
        $query = Craft::createObject(
87
            OrganizationUserAssociationQuery::class,
88
            [UserAssociation::class]
89
        );
90
91
        QueryHelper::configure(
92
            $query,
93
            $this->prepareQueryConfig($config)
94
        );
95
96
        return $query;
97
    }
98
99
    /**
100
     * @return string
101
     */
102
    public static function recordClass()
103
    {
104
        return UserAssociation::class;
105
    }
106
107
    /**
108
     * @param SortableAssociationInterface|UserAssociation $record
109
     * @return SortableAssociationQueryInterface|UserOrganizationAssociationQuery
110
     */
111
    protected function associationQuery(
112
        SortableAssociationInterface $record
113
    ): SortableAssociationQueryInterface {
114
        return $this->query(
115
            $record->{static::SOURCE_ATTRIBUTE}
116
        );
117
    }
118
119
    /**
120
     * @param SortableAssociationQueryInterface|UserOrganizationAssociationQuery $query
121
     * @return array
122
     */
123
    protected function existingAssociations(
124
        SortableAssociationQueryInterface $query
125
    ): array {
126
        $source = $this->resolveStringAttribute($query, static::SOURCE_ATTRIBUTE);
127
128
        if ($source === null) {
129
            return [];
130
        }
131
132
        return $this->associations($source);
133
    }
134
135
    /**
136
     * @param $source
137
     * @return SortableAssociationQueryInterface|UserOrganizationAssociationQuery
138
     */
139
    private function query(
140
        $source
141
    ): SortableAssociationQueryInterface {
142
        /** @var UserOrganizationAssociationQuery $query */
143
        $query = $this->getQuery();
144
        return $query->where([
145
            static::SOURCE_ATTRIBUTE => $source
146
        ])
147
            ->orderBy([static::SORT_ORDER_ATTRIBUTE => SORT_ASC]);
148
    }
149
150
    /**
151
     * @param $source
152
     * @return array
153
     */
154
    private function associations(
155
        $source
156
    ): array {
157
        /** @var UserOrganizationAssociationQuery $query */
158
        $query = $this->query($source);
159
        return $query->indexBy(static::TARGET_ATTRIBUTE)
160
            ->all();
161
    }
162
}
163