Passed
Push — feature/application-review-ui ( afbf92...be3688 )
by Chris
04:21
created

ExperiencePolicy::view()   B

Complexity

Conditions 9
Paths 81

Size

Total Lines 20
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 12
dl 0
loc 20
rs 8.0555
c 1
b 0
f 0
cc 9
nc 81
nop 2
1
<?php
2
3
namespace App\Policies;
4
5
use App\Models\Applicant;
6
use App\Models\User;
7
use App\Models\JobApplication;
8
use App\Models\ExperienceWork;
9
use App\Models\ExperienceEducation;
10
use App\Models\ExperiencePersonal;
11
use App\Models\ExperienceAward;
12
use App\Models\ExperienceCommunity;
13
use App\Policies\BasePolicy;
14
use Illuminate\Auth\Access\HandlesAuthorization;
15
use Illuminate\Support\Facades\Log;
16
17
class ExperiencePolicy extends BasePolicy
18
{
19
    use HandlesAuthorization;
20
21
    /**
22
     * Determine whether the user can view the Experience object.
23
     * This includes all kinds of experience:
24
     * ExperienceWork, ExperienceAward, ExperiencePersonal, ExperienceCommunity and ExperienceEducation.
25
     *
26
     * @param  \App\Models\User  $user
27
     * @param  ExperienceWork|ExperienceEducation|ExperiencePersonal|ExperienceAward|ExperienceCommunity $experience
28
     * @return mixed
29
     */
30
    public function view(User $user, $experience)
31
    {
32
        // $experienceable is either an Applicant or a JobApplication
33
        $experienceable = $experience->experienceable;
34
35
        $authApplicant = $user->isApplicant() &&
36
            (($experienceable instanceof Applicant)
37
                ? $user->applicant->id === $experienceable->id
38
                : $user->applicant->id === $experienceable->applicant_id
39
            );
40
41
        $authManager = $user->isManager()
42
            && $experienceable instanceof JobApplication
43
            && $user->can('reviewApplicationsFor', $experienceable->job_poster);
44
45
        $authHr = $user->isHrAdvisor()
46
            && $experienceable instanceof JobApplication
47
            && $user->can('reviewApplicationsFor', $experienceable->job_poster);
48
49
        return $authApplicant || $authManager || $authHr;
50
    }
51
52
    /**
53
     * Determine whether the user can create Experience.
54
     *
55
     * @param  \App\Models\User  $user
56
     * @return mixed
57
     */
58
    public function create(User $user)
59
    {
60
        return $user->isApplicant();
61
    }
62
63
    /**
64
     * Determine whether the user can update the Experience_____ object.
65
     *
66
     * @param  \App\Models\User  $user
67
     * @param  ExperienceWork|ExperienceEducation|ExperiencePersonal|ExperienceAward|ExperienceCommunity $experience
68
     * @return mixed
69
     */
70
    public function update(User $user, $experience)
71
    {
72
        // $experienceable is either an Applicant or a JobApplication
73
        $experienceable = $experience->experienceable;
74
75
        $authApplicant = ($experienceable instanceof Applicant)
76
            && $user->applicant->id === $experienceable->id;
77
78
        $authApplication = ($experienceable instanceof JobApplication)
79
            && $user->applicant->id === $experienceable->applicant_id
80
            && $experienceable->application_status->name == 'draft'
81
            && $experienceable->job_poster->isOpen();
82
83
        return $user->isApplicant() && ($authApplicant || $authApplication);
84
    }
85
86
    /**
87
     * Determine whether the user can delete the jobApplication.
88
     *
89
     * @param  \App\Models\User  $user
90
     * @param  ExperienceWork|ExperienceEducation|ExperiencePersonal|ExperienceAward|ExperienceCommunity $experience
91
     * @return mixed
92
     */
93
    public function delete(User $user, $experience)
94
    {
95
        // Permissions are the same for updating or deleting in this case.
96
        return $this->update($user, $experience);
97
    }
98
}
99