Completed
Push — develop ( 2c068d...662221 )
by Nate
13:44
created

AbstractUserAssociation::statusCodeFail()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 0
cts 0
cp 0
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
crap 2
1
<?php
2
3
/**
4
 * @copyright  Copyright (c) Flipbox Digital Limited
5
 * @license    https://flipboxfactory.com/software/domains/license
6
 * @link       https://www.flipboxfactory.com/software/domains/
7
 */
8
9
namespace flipbox\organizations\actions\users;
10
11
use Craft;
12
use craft\elements\User;
13
use flipbox\craft\ember\actions\CheckAccessTrait;
14
use flipbox\organizations\elements\Organization;
15
use yii\base\Action;
16
use yii\web\HttpException;
17
18
/**
19
 * @author Flipbox Factory <[email protected]>
20
 * @since  1.0.0
21
 */
22
abstract class AbstractUserAssociation extends Action
23
{
24
    use CheckAccessTrait;
25
26
    /**
27
     * @inheritdoc
28
     * @param User $user
29
     * @param Organization $organization
30
     * @return bool
31
     */
32
    abstract protected function performAction(User $user, Organization $organization, int $sortOrder = null): bool;
33
34
    /**
35
     * HTTP not found response code
36
     *
37
     * @return int
38
     */
39
    protected function statusCodeNotFound(): int
40
    {
41
        return $this->statusCodeNotFound ?? 404;
0 ignored issues
show
Documentation introduced by
The property statusCodeNotFound does not exist on object<flipbox\organizat...bstractUserAssociation>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
42
    }
43
44
    /**
45
     * @return string
46
     */
47
    protected function messageNotFound(): string
48
    {
49
        return $this->messageNotFound ?? 'Unable to find object.';
0 ignored issues
show
Documentation introduced by
The property messageNotFound does not exist on object<flipbox\organizat...bstractUserAssociation>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
50
    }
51
52
    /**
53
     * @return null
54
     * @throws HttpException
55
     */
56
    protected function handleNotFoundResponse()
57
    {
58
        throw new HttpException(
59
            $this->statusCodeNotFound(),
60
            $this->messageNotFound()
61
        );
62
    }
63
64
    /**
65
     * @param string|int $identifier
66
     * @return User|null
67
     */
68
    protected function findUser($identifier)
69
    {
70
        if (is_numeric($identifier)) {
71
            return Craft::$app->getUsers()->getUserById($identifier);
72
        }
73
74
        return Craft::$app->getUsers()->getUserByUsernameOrEmail($identifier);
75
    }
76
77
    /**
78
     * @param string $user
79
     * @param string $organization
80
     * @param int|null $sortOrder
81
     * @return null|\yii\base\Model|\yii\web\Response
82
     * @throws HttpException
83
     */
84
    public function run(
85
        string $user,
86
        string $organization,
87
        int $sortOrder = null
88
    ) {
89
        if (null === ($user = $this->findUser($user))) {
90
            return $this->handleNotFoundResponse();
91
        }
92
93
        if (null === ($organization = Organization::findOne($organization))) {
94
            return $this->handleNotFoundResponse();
95
        }
96
97
        return $this->runInternal($user, $organization, $sortOrder);
0 ignored issues
show
Documentation introduced by
$organization is of type object<craft\base\ElementInterface>|array, but the function expects a object<flipbox\organizat...\elements\Organization>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
98
    }
99
100
    /**
101
     * @param User $user
102
     * @param Organization $organization
103
     * @param int|null $sortOrder
104
     * @return mixed
105
     * @throws \yii\web\UnauthorizedHttpException
106
     */
107
    protected function runInternal(User $user, Organization $organization, int $sortOrder = null)
108
    {
109
        // Check access
110
        if (($access = $this->checkAccess($user, $organization, $sortOrder)) !== true) {
111
            return $access;
112
        }
113
114
        if (!$this->performAction($user, $organization, $sortOrder)) {
115
            return $this->handleFailResponse($user);
116
        }
117
118
        return $this->handleSuccessResponse($user);
119
    }
120
121
    /**
122
     * HTTP success response code
123
     *
124
     * @return int
125
     */
126
    protected function statusCodeSuccess(): int
127
    {
128
        return $this->statusCodeSuccess ?? 200;
0 ignored issues
show
Documentation introduced by
The property statusCodeSuccess does not exist on object<flipbox\organizat...bstractUserAssociation>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
129
    }
130
131
    /**
132
     * HTTP fail response code
133
     *
134
     * @return int
135
     */
136
    protected function statusCodeFail(): int
137
    {
138
        return $this->statusCodeFail ?? 400;
0 ignored issues
show
Documentation introduced by
The property statusCodeFail does not exist on object<flipbox\organizat...bstractUserAssociation>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
139
    }
140
141
    /**
142
     * @param $data
143
     * @return mixed
144
     */
145
    protected function handleSuccessResponse($data)
146
    {
147
        // Success status code
148
        Craft::$app->getResponse()->setStatusCode($this->statusCodeSuccess());
149
        return $data;
150
    }
151
152
    /**
153
     * @param $data
154
     * @return mixed
155
     */
156
    protected function handleFailResponse($data)
157
    {
158
        Craft::$app->getResponse()->setStatusCode($this->statusCodeFail());
159
        return $data;
160
    }
161
}
162