Passed
Push — feature/profile-skills-finaliz... ( 961836...9d523b )
by Tristan
06:45
created

ExperienceSkillsController   A

Complexity

Total Complexity 18

Size/Duplication

Total Lines 143
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 18
eloc 82
c 1
b 0
f 0
dl 0
loc 143
rs 10

7 Methods

Rating   Name   Duplication   Size   Complexity  
A destroy() 0 3 1
B store() 0 39 6
A batchUpdate() 0 15 2
A update() 0 8 1
A batchStore() 0 36 5
A indexForApplicant() 0 4 1
A batchDestroy() 0 11 2
1
<?php
2
namespace App\Http\Controllers\Api;
3
4
use App\Http\Controllers\Controller;
5
use App\Http\Requests\BatchStoreExperienceSkill;
6
use App\Http\Requests\BatchUpdateExperienceSkill;
7
use App\Http\Requests\StoreExperienceSkill;
8
use App\Models\Applicant;
9
use App\Models\ExperienceSkill;
10
use App\Models\Experience;
11
use Illuminate\Http\Request;
12
use Illuminate\Http\Resources\Json\JsonResource;
13
use Illuminate\Support\Facades\DB;
14
15
class ExperienceSkillsController extends Controller
16
{
17
    public function indexForApplicant(Applicant $applicant)
18
    {
19
        $experienceSkills = $applicant->experienceSkillsQuery()->get();
20
        return JsonResource::collection($experienceSkills);
21
    }
22
23
    public function store(StoreExperienceSkill $request)
24
    {
25
        $validatedData = $request->validated();
26
        // Restore soft deleted experienceSkill if it exists, otherwise create a new one.
27
        $softDeletedExperienceSkill = ExperienceSkill::onlyTrashed()
28
            ->where([
29
            ['skill_id', $validatedData['skill_id']],
30
            ['experience_id', $validatedData['experience_id']],
31
            ['experience_type', $validatedData['experience_type']]
32
        ])->first();
33
34
        // Attach skill to applicant if not already attached.
35
        $experience = new Experience();
36
        $experienceInstance = $experience->getExperienceInstance($validatedData['experience_type'], $validatedData['experience_id']);
37
        $applicantInstance = $experience->getApplicantInstance($experienceInstance);
38
        if ($applicantInstance !== null) {
39
            $skillApplicantRelationshipExists = $applicantInstance->skills()
40
            ->where('skills.id', $validatedData['skill_id'])
41
            ->exists();
42
            if ($skillApplicantRelationshipExists !== true) {
43
                $applicantInstance->skills()->attach($validatedData['skill_id']);
44
            }
45
        }
46
47
        if ($softDeletedExperienceSkill) {
48
            if ($validatedData['justification'] !== null && $validatedData['justification'] !== '') {
49
                $softDeletedExperienceSkill->justification = $validatedData['justification'];
50
            }
51
            $softDeletedExperienceSkill->restore();
52
            $softDeletedExperienceSkill->save();
53
            return new JsonResource($softDeletedExperienceSkill->fresh());
54
        } else {
55
            $experienceSkill = new ExperienceSkill($validatedData);
56
            $experienceSkill->skill_id = $validatedData['skill_id'];
57
            $experienceSkill->experience_id = $validatedData['experience_id'];
58
            $experienceSkill->experience_type = $validatedData['experience_type'];
59
            $experienceSkill->justification = $validatedData['justification'];
60
            $experienceSkill->save();
61
            return new JsonResource($experienceSkill->fresh());
62
        }
63
    }
64
65
    public function update(Request $request, ExperienceSkill $experienceSkill)
66
    {
67
        $validatedData = $request->validate([
68
            'justification' => 'nullable|string',
69
        ]);
70
        $experienceSkill->fill($validatedData);
71
        $experienceSkill->save();
72
        return new JsonResource($experienceSkill->fresh());
73
    }
74
75
    public function destroy(ExperienceSkill $experienceSkill)
76
    {
77
        $experienceSkill->delete();
78
    }
79
80
    /**
81
     * Create many new ExperienceSkills at once.
82
     *
83
     * @param BatchStoreExperienceSkill $request
84
     * @return void
85
     */
86
    public function batchStore(BatchStoreExperienceSkill $request)
87
    {
88
        $validatedResult = $request->validated();
89
        $newExperienceSkills = collect($validatedResult);
0 ignored issues
show
Bug introduced by
The function collect was not found. Maybe you did not declare it correctly or list all dependencies? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

89
        $newExperienceSkills = /** @scrutinizer ignore-call */ collect($validatedResult);
Loading history...
90
        $response = [];
91
92
        DB::transaction(function () use ($newExperienceSkills, &$response) {
93
            foreach ($newExperienceSkills as $newExperienceSkill) {
94
                // Restore soft deleted experienceSkill if it exists, otherwise create a new one.
95
                $softDeletedExperienceSkill = ExperienceSkill::withTrashed()
96
                    ->where([
97
                    ['skill_id', $newExperienceSkill['skill_id']],
98
                    ['experience_id', $newExperienceSkill['experience_id']],
99
                    ['experience_type', $newExperienceSkill['experience_type']]
100
                ])->first();
101
                if ($softDeletedExperienceSkill) {
102
                    $softDeletedExperienceSkill->restore();
103
                    if ($newExperienceSkill['justification'] !== null && $newExperienceSkill['justification'] !== '') {
104
                        $softDeletedExperienceSkill->justification = $newExperienceSkill['justification'];
105
                    }
106
                    $softDeletedExperienceSkill->save();
107
                    array_push($response, $softDeletedExperienceSkill);
108
                } else {
109
                    $experienceSkill = new ExperienceSkill($newExperienceSkill);
110
                    $experienceSkill->skill_id = $newExperienceSkill['skill_id'];
111
                    $experienceSkill->experience_id = $newExperienceSkill['experience_id'];
112
                    $experienceSkill->experience_type = $newExperienceSkill['experience_type'];
113
                    $experienceSkill->justification = $newExperienceSkill['justification'];
114
                    $experienceSkill->save();
115
                    $experienceSkill->fresh();
116
                    array_push($response, $experienceSkill);
117
                }
118
            }
119
        }, 3); // Retry transaction up to three times if deadlock occurs.
120
121
        return JsonResource::collection($response);
122
    }
123
124
    /**
125
     * Update many existing ExperienceSkills at once.
126
     *
127
     * @param BatchUpdateExperienceSkill $request
128
     * @return void
129
     */
130
    public function batchUpdate(BatchUpdateExperienceSkill $request)
131
    {
132
        $validatedResult = $request->validated();
133
        $inputData = collect($validatedResult);
0 ignored issues
show
Bug introduced by
The function collect was not found. Maybe you did not declare it correctly or list all dependencies? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

133
        $inputData = /** @scrutinizer ignore-call */ collect($validatedResult);
Loading history...
134
        $experienceSkills = ExperienceSkill::whereIn('id', $inputData->pluck('id')->all())->get();
135
136
        DB::transaction(function () use ($experienceSkills, $inputData) {
137
            foreach ($experienceSkills as $experienceSkill) {
138
                $updatedExperienceSkill = $inputData->firstWhere('id', $experienceSkill->id);
139
                $experienceSkill->fill($updatedExperienceSkill);
140
                $experienceSkill->save();
141
            }
142
        }, 3); // Retry transaction up to three times if deadlock occurs.
143
144
        return JsonResource::collection($experienceSkills->fresh());
145
    }
146
147
    public function batchDestroy(Request $request)
148
    {
149
        $experienceSkillIds = $request->validate([
150
            '*.id' => 'required|exists:App\Models\ExperienceSkill,id',
151
        ]);
152
        $experienceSkills = ExperienceSkill::whereIn('id', $experienceSkillIds);
153
        foreach ($experienceSkills as $experienceSkill) {
154
            $this->authorize('delete', $experienceSkill);
155
        }
156
        $experienceSkills->delete();
157
        return response()->json(['success' => 'success'], 200);
0 ignored issues
show
Bug introduced by
The function response was not found. Maybe you did not declare it correctly or list all dependencies? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

157
        return /** @scrutinizer ignore-call */ response()->json(['success' => 'success'], 200);
Loading history...
158
    }
159
}
160