Completed
Branch develop-3.0 (55e83a)
by Mohamed
02:53
created

IssuePolicy::notIssueCreatorAndInternalProject()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 3
eloc 2
nc 3
nop 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\Policies;
13
14
use Illuminate\Auth\Access\HandlesAuthorization;
15
use Tinyissue\Extensions\Policies\ProjectAccess;
16
use Tinyissue\Model\Project;
17
use Tinyissue\Model\Project\Issue;
18
use Tinyissue\Model\User;
19
20
class IssuePolicy
21
{
22
    use HandlesAuthorization, ProjectAccess;
23
24
    /**
25
     * @param User   $user
26
     * @param string $ability
27
     *
28
     * @return bool
29
     */
30
    public function before(User $user, $ability)
31
    {
32
        if ($ability !== 'viewLockedQuote' && $user instanceof User && ($user->isAdmin() || $user->isManager())) {
33
            return true;
34
        }
35
    }
36
37
    /**
38
     * Determine whether the user can view the issue.
39
     *
40
     * @param User    $user
41
     * @param Issue   $issue
42
     * @param Project $project
43
     *
44
     * @return bool
45
     */
46
    public function view(User $user, Issue $issue, Project $project)
47
    {
48
        // Not member or not creator and project is internal
49
        if (!$this->isPublicProject($project)
50
            && (!$project->isMember($user->id) || $this->notIssueCreatorAndInternalProject($user, $issue, $project))) {
51
            return false;
52
        }
53
54
        return true;
55
    }
56
57
    /**
58
     * @param User    $user
59
     * @param Issue   $issue
60
     * @param Project $project
61
     *
62
     * @return bool
63
     */
64
    protected function notIssueCreatorAndInternalProject(User $user, Issue $issue, Project $project)
65
    {
66
        return $project->isPrivateInternal() && $user->isUser() && !$issue->isCreatedBy($user);
67
    }
68
69
    /**
70
     * Determine whether the user can create issues.
71
     *
72
     * @param User    $user
73
     * @param Project $project
74
     *
75
     * @return bool
76
     */
77
    public function create(User $user, Project $project)
78
    {
79
        return $project->isMember($user->id) || $project->isPublic();
80
    }
81
82
    /**
83
     * Determine whether the user can update the issue.
84
     *
85
     * @param User         $user
86
     * @param Issue        $issue
87
     * @param Project|null $project
88
     *
89
     * @return bool
90
     */
91
    public function update(User $user, Issue $issue, Project $project = null)
92
    {
93
        // Issue locked by read only tag
94
        if ($issue->hasReadOnlyTag($user)) {
95
            return false;
96
        }
97
98
        if ($issue->isCreatedBy($user)) {
99
            return true;
100
        }
101
102
        $project = is_null($project) ? $issue->project : $project;
103
104
        return $this->view($user, $issue, $project);
105
    }
106
107
    /**
108
     * Determine whether the user can delete the issue.
109
     *
110
     * @param User  $user
111
     * @param Issue $issue
112
     *
113
     * @return bool
114
     */
115
    public function delete(User $user, Issue $issue)
116
    {
117
        return $this->update($user, $issue);
118
    }
119
120
    /**
121
     * Can lock quote issue.
122
     *
123
     * @param User         $user
124
     * @param Issue        $issue
125
     * @param Project|null $project
126
     *
127
     * @return bool
128
     */
129
    public function lockQuote(User $user, Issue $issue, Project $project = null)
130
    {
131
        return $this->update($user, $issue, $project) && $user->isManagerOrMore();
132
    }
133
134
    /**
135
     * Check if a user is allowed to see the issue quote.
136
     *
137
     * @param User  $user
138
     * @param Issue $issue
139
     *
140
     * @return bool
141
     */
142
    public function viewLockedQuote(User $user, Issue $issue)
143
    {
144
        // Only manager, admin, & developer can view locked quote
145
        if ($issue->time_quote > 0 && (!$issue->isQuoteLocked() || !$user->isUser())) {
146
            return true;
147
        }
148
149
        return false;
150
    }
151
}
152