Passed
Push — task/applicant-skill-save-api ( 2ebd5d...fa7a9c )
by
unknown
06:31 queued 10s
created

ExperienceSkillsController::store()   B

Complexity

Conditions 6
Paths 9

Size

Total Lines 39
Code Lines 30

Duplication

Lines 0
Ratio 0 %

Importance

Changes 5
Bugs 0 Features 0
Metric Value
eloc 30
c 5
b 0
f 0
dl 0
loc 39
rs 8.8177
cc 6
nc 9
nop 1
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\ExperienceSkill;
9
use App\Models\Experience;
10
use Illuminate\Http\Request;
11
use Illuminate\Http\Resources\Json\JsonResource;
12
use Illuminate\Support\Facades\DB;
13
14
class ExperienceSkillsController extends Controller
15
{
16
    public function store(StoreExperienceSkill $request)
17
    {
18
        $validatedData = $request->validated();
19
        // Restore soft deleted experienceSkill if it exists, otherwise create a new one.
20
        $softDeletedExperienceSkill = ExperienceSkill::onlyTrashed()
21
            ->where([
22
            ['skill_id', $validatedData['skill_id']],
23
            ['experience_id', $validatedData['experience_id']],
24
            ['experience_type', $validatedData['experience_type']]
25
        ])->first();
26
27
        // Attach skill to applicant if not already attached.
28
        $experience = new Experience();
29
        $experienceInstance = $experience->getExperienceInstance($validatedData['experience_type'], $validatedData['experience_id']);
30
        $applicantInstance = $experience->getApplicantInstance($experienceInstance);
31
        if ($applicantInstance !== null) {
32
            $skillApplicantRelationshipExists = $applicantInstance->skills()
33
            ->where('skills.id', $validatedData['skill_id'])
34
            ->exists();
35
            if ($skillApplicantRelationshipExists !== true) {
36
                $applicantInstance->skills()->attach($validatedData['skill_id']);
37
            }
38
        }
39
40
        if ($softDeletedExperienceSkill) {
41
            if ($validatedData['justification'] !== null && $validatedData['justification'] !== '') {
42
                $softDeletedExperienceSkill->justification = $validatedData['justification'];
43
            }
44
            $softDeletedExperienceSkill->restore();
45
            $softDeletedExperienceSkill->save();
46
            return new JsonResource($softDeletedExperienceSkill->fresh());
47
        } else {
48
            $experienceSkill = new ExperienceSkill($validatedData);
49
            $experienceSkill->skill_id = $validatedData['skill_id'];
50
            $experienceSkill->experience_id = $validatedData['experience_id'];
51
            $experienceSkill->experience_type = $validatedData['experience_type'];
52
            $experienceSkill->justification = $validatedData['justification'];
53
            $experienceSkill->save();
54
            return new JsonResource($experienceSkill->fresh());
55
        }
56
    }
57
58
    public function update(Request $request, ExperienceSkill $experienceSkill)
59
    {
60
        $validatedData = $request->validate([
61
            'justification' => 'nullable|string',
62
        ]);
63
        $experienceSkill->fill($validatedData);
64
        $experienceSkill->save();
65
        return new JsonResource($experienceSkill->fresh());
66
    }
67
68
    public function destroy(ExperienceSkill $experienceSkill)
69
    {
70
        $experienceSkill->delete();
71
    }
72
73
    public function batchStore(BatchStoreExperienceSkill $request)
74
    {
75
        $validatedResult = $request->validated();
76
        $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

76
        $newExperienceSkills = /** @scrutinizer ignore-call */ collect($validatedResult);
Loading history...
77
        $response = [];
78
79
        DB::transaction(function () use ($newExperienceSkills, &$response) {
80
            foreach ($newExperienceSkills as $newExperienceSkill) {
81
                // Restore soft deleted experienceSkill if it exists, otherwise create a new one.
82
                $softDeletedExperienceSkill = ExperienceSkill::withTrashed()
83
                    ->where([
84
                    ['skill_id', $newExperienceSkill['skill_id']],
85
                    ['experience_id', $newExperienceSkill['experience_id']],
86
                    ['experience_type', $newExperienceSkill['experience_type']]
87
                ])->first();
88
                if ($softDeletedExperienceSkill) {
89
                    $softDeletedExperienceSkill->restore();
90
                    if ($newExperienceSkill['justification'] !== null && $newExperienceSkill['justification'] !== '') {
91
                        $softDeletedExperienceSkill->justification = $newExperienceSkill['justification'];
92
                    }
93
                    $softDeletedExperienceSkill->save();
94
                    array_push($response, $softDeletedExperienceSkill);
95
                } else {
96
                    $experienceSkill = new ExperienceSkill($newExperienceSkill);
97
                    $experienceSkill->skill_id = $newExperienceSkill['skill_id'];
98
                    $experienceSkill->experience_id = $newExperienceSkill['experience_id'];
99
                    $experienceSkill->experience_type = $newExperienceSkill['experience_type'];
100
                    $experienceSkill->justification = $newExperienceSkill['justification'];
101
                    $experienceSkill->save();
102
                    $experienceSkill->fresh();
103
                    array_push($response, $experienceSkill);
104
                }
105
            }
106
        }, 3); // Retry transaction up to three times if deadlock occurs.
107
108
        return JsonResource::collection($response);
109
    }
110
111
    public function batchUpdate(BatchUpdateExperienceSkill $request)
112
    {
113
        $validatedResult = $request->validated();
114
        $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

114
        $inputData = /** @scrutinizer ignore-call */ collect($validatedResult);
Loading history...
115
        $experienceSkills = ExperienceSkill::whereIn('id', $inputData->pluck('id')->all())->get();
116
117
        DB::transaction(function () use ($experienceSkills, $inputData) {
118
            foreach ($experienceSkills as $experienceSkill) {
119
                $updatedExperienceSkill = $inputData->firstWhere('id', $experienceSkill->id);
120
                $experienceSkill->fill($updatedExperienceSkill);
121
                $experienceSkill->save();
122
            }
123
        }, 3); // Retry transaction up to three times if deadlock occurs.
124
125
        return JsonResource::collection($experienceSkills->fresh());
126
    }
127
128
    public function batchDestroy(Request $request)
129
    {
130
        $experienceSkillIds = $request->validate([
131
            '*.id' => 'required|exists:App\Models\ExperienceSkill,id',
132
        ]);
133
        $experienceSkills = ExperienceSkill::whereIn('id', $experienceSkillIds);
134
        foreach ($experienceSkills as $experienceSkill) {
135
            $this->authorize('delete', $experienceSkill);
136
        }
137
        $experienceSkills->delete();
138
        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

138
        return /** @scrutinizer ignore-call */ response()->json(['success' => 'success'], 200);
Loading history...
139
    }
140
}
141