Completed
Push — develop ( 688bc1...4964b4 )
by Mohamed
07:24
created

User::permission()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 11
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 3

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 11
ccs 6
cts 6
cp 1
rs 9.4285
cc 3
eloc 6
nc 3
nop 1
crap 3
1
<?php
2
3
/*
4
 * This file is part of the Tinyissue package.
5
 *
6
 * (c) Mohamed Alsharaf <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Tinyissue\Model;
13
14
use Auth as Auth;
15
use Illuminate\Auth\Authenticatable;
16
use Illuminate\Auth\Passwords\CanResetPassword;
17
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
18
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;
19
use Illuminate\Database\Eloquent;
20
use Illuminate\Database\Eloquent\Model;
21
use Illuminate\Routing\Route;
22
use Tinyissue\Model\Project\Issue;
23
24
/**
25
 * User is model class for users.
26
 *
27
 * @author Mohamed Alsharaf <[email protected]>
28
 *
29
 * @property int    $id
30
 * @property int    $deleted
31
 * @property int    $role_id
32
 * @property string $language
33
 * @property string $email
34
 * @property string $password
35
 * @property string $firstname
36
 * @property string $lastname
37
 * @property string $fullname
38
 * @property int    $status
39
 */
40
class User extends Model implements AuthenticatableContract, CanResetPasswordContract
41
{
42
    use Authenticatable,
43
        CanResetPassword,
44
        Traits\User\CountTrait,
45
        Traits\User\RelationTrait,
46
        Traits\User\CrudTrait,
47
        Traits\User\QueryTrait;
48
49
    /**
50
     * User name is private.
51
     *
52
     * @var int
53
     */
54
    const PRIVATE_YES = 1;
55
56
    /**
57
     * User name is public.
58
     *
59
     * @var int
60
     */
61
    const PRIVATE_NO = 0;
62
63
    /**
64
     * User status Deleted.
65
     *
66
     * @var int
67
     */
68
    const DELETED_USERS = 1;
69
70
    /**
71
     * User status not deleted.
72
     *
73
     * @var int
74
     */
75
    const NOT_DELETED_USERS = 0;
76
77
    /**
78
     * User status active. (Standard).
79
     *
80
     * @var int
81
     */
82
    const ACTIVE_USER = 1;
83
84
    /**
85
     * User status blocked. (Too many login attempts).
86
     *
87
     * @var int
88
     */
89
    const BLOCKED_USER = 2;
90
91
    /**
92
     * User status inactive. (Cannot login at the moment).
93
     *
94
     * @var int
95
     */
96
    const INACTIVE_USER = 0;
97
98
    /**
99
     * The database table used by the model.
100
     *
101
     * @var string
102
     */
103
    protected $table = 'users';
104
105
    /**
106
     * The attributes that are mass assignable.
107
     *
108
     * @var array
109
     */
110
    protected $fillable = ['deleted', 'email', 'password', 'firstname', 'lastname', 'role_id', 'private', 'language', 'status'];
111
112
    /**
113
     * The attributes excluded from the model's JSON form.
114
     *
115
     * @var array
116
     */
117
    protected $hidden = ['password', 'remember_token'];
118
119
    /**
120
     * Collection of user permissions.
121
     *
122
     * @var Eloquent\Collection
123
     */
124
    protected $permission;
125
126
    /**
127
     * Get available languages from translations folder.
128
     *
129
     * @return array
130
     */
131 3
    public static function getLanguages()
132
    {
133 3
        $languages = [];
134
135 3
        $cdir = scandir(__DIR__ . '/../../resources/lang');
136 3
        foreach ($cdir as $value) {
137 3
            if (!in_array($value, ['.', '..'])) {
138 3
                $languages[$value] = $value;
139
            }
140
        }
141
142 3
        return $languages;
143
    }
144
145
    /**
146
     * Checks to see if $this user is current user.
147
     *
148
     * @return bool
149
     */
150 3
    public function me()
151
    {
152 3
        return $this->id == \Auth::user()->id;
153
    }
154
155
    /**
156
     * Whether or not the user has a valid permission in current context
157
     * e.g. can access the issue or the project.
158
     *
159
     * @param Route $route
160
     *
161
     * @return bool
162
     */
163 39
    public function permissionInContext(Route $route)
164
    {
165
        // Can access all projects
166 39
        if ($this->permission(Permission::PERM_PROJECT_ALL)) {
167 35
            return true;
168
        }
169
170 8
        $project = $route->getParameter('project');
171 8
        $issue   = $route->getParameter('issue');
172 8
        if (!$project instanceof Project && $issue instanceof Issue) {
173
            $project = $issue->project;
174
        }
175
176
        // Is member of the project
177 8
        if ($project instanceof Project && !$project->isMember($this->id)) {
178 5
            return false;
179
        }
180
181
        // Check if issue is in readonly tag
182 7
        $permission = array_get($route->getAction(), 'permission');
183 7
        if ($issue instanceof Issue && $permission === Permission::PERM_ISSUE_MODIFY) {
184 2
            return !$issue->hasReadOnlyTag($this);
185
        }
186
187 7
        return true;
188
    }
189
190
    /**
191
     * Whether or not the user has a permission.
192
     *
193
     * @param string $key
194
     *
195
     * @return bool
196
     */
197 60
    public function permission($key)
198
    {
199 60
        $this->loadPermissions();
200 60
        foreach ($this->permission as $permission) {
201 60
            if ($permission->permission->isEqual($key)) {
202 60
                return true;
203
            }
204
        }
205
206 27
        return false;
207
    }
208
209
    /**
210
     * Return user full name with property "fullname".
211
     *
212
     * @return string
213
     */
214 44
    public function getFullNameAttribute()
215
    {
216 44
        if ($this->private && (Auth::guest() || !Auth::user()->permission('administration'))) {
0 ignored issues
show
Documentation introduced by
The property private does not exist on object<Tinyissue\Model\User>. 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...
217 1
            return trans('tinyissue.anonymous');
218
        }
219
220 44
        return $this->attributes['firstname'] . ' ' . $this->attributes['lastname'];
221
    }
222
223
    /**
224
     * Return user image.
225
     *
226
     * @return string
227
     */
228 5
    public function getImageAttribute()
229
    {
230 5
        return app('gravatar')->src($this->email);
231
    }
232
233
    /**
234
     * Returns list of user statuses.
235
     *
236
     * @return array
237
     */
238 2
    public static function getStatuses()
239
    {
240
        return [
241 2
            static::ACTIVE_USER     => trans('tinyissue.active'),
242 2
            static::BLOCKED_USER    => trans('tinyissue.blocked'),
243 2
            static::INACTIVE_USER   => trans('tinyissue.inactive'),
244
        ];
245
    }
246
247
    /**
248
     * Whether or not the user is active.
249
     *
250
     * @return bool
251
     */
252 7
    public function isActive()
253
    {
254 7
        return (int) $this->status === static::ACTIVE_USER;
255
    }
256
257
    /**
258
     * Whether or not the user is inactive.
259
     *
260
     * @return bool
261
     */
262
    public function isInactive()
263
    {
264
        return (int) $this->status === static::INACTIVE_USER;
265
    }
266
267
    /**
268
     * Whether or not the user is blocked.
269
     *
270
     * @return bool
271
     */
272
    public function isBlocked()
273
    {
274
        return (int) $this->status === static::BLOCKED_USER;
275
    }
276
277
    /**
278
     * Whether or not the user is normal user role.
279
     *
280
     * @return bool
281
     */
282 20
    public function isUser()
283
    {
284 20
        return $this->role->role === Role::ROLE_USER;
0 ignored issues
show
Documentation introduced by
The property role does not exist on object<Tinyissue\Model\User>. 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...
285
    }
286
}
287