Passed
Push — feature/connect-application-st... ( fd5d08 )
by Tristan
07:08 queued 10s
created

ExperiencePolicy::delete()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

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