Passed
Push — task/applicant-classification-... ( ae016f...314e04 )
by Yonathan
05:22
created

ExperienceSkillsController::batchDestroy()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 11
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 7
c 1
b 0
f 0
dl 0
loc 11
rs 10
cc 2
nc 2
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 Illuminate\Http\Request;
10
use Illuminate\Http\Resources\Json\JsonResource;
11
use Illuminate\Support\Facades\DB;
12
13
class ExperienceSkillsController extends Controller
14
{
15
    public function store(StoreExperienceSkill $request)
16
    {
17
        $validatedData = $request->validated();
18
        // Restore soft deleted experienceSkill if it exists, otherwise create a new one.
19
        $softDeletedExperienceSkill = ExperienceSkill::onlyTrashed()
20
            ->where([
21
            ['skill_id', $validatedData['skill_id']],
22
            ['experience_id', $validatedData['experience_id']],
23
            ['experience_type', $validatedData['experience_type']]
24
        ])->first();
25
        if ($softDeletedExperienceSkill) {
26
            if ($validatedData['justification'] !== null && $validatedData['justification'] !== '') {
27
                $softDeletedExperienceSkill->justification = $validatedData['justification'];
28
            }
29
            $softDeletedExperienceSkill->restore();
30
            $softDeletedExperienceSkill->save();
31
            return new JsonResource($softDeletedExperienceSkill->fresh());
32
        } else {
33
            $experienceSkill = new ExperienceSkill($validatedData);
34
            $experienceSkill->skill_id = $validatedData['skill_id'];
35
            $experienceSkill->experience_id = $validatedData['experience_id'];
36
            $experienceSkill->experience_type = $validatedData['experience_type'];
37
            $experienceSkill->justification = $validatedData['justification'];
38
            $experienceSkill->save();
39
            return new JsonResource($experienceSkill->fresh());
40
        }
41
    }
42
43
    public function update(Request $request, ExperienceSkill $experienceSkill)
44
    {
45
        $validatedData = $request->validate([
46
            'justification' => 'nullable|string',
47
        ]);
48
        $experienceSkill->fill($validatedData);
49
        $experienceSkill->save();
50
        return new JsonResource($experienceSkill->fresh());
51
    }
52
53
    public function destroy(ExperienceSkill $experienceSkill)
54
    {
55
        $experienceSkill->delete();
56
    }
57
58
    public function batchStore(BatchStoreExperienceSkill $request)
59
    {
60
        $validatedResult = $request->validated();
61
        $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

61
        $newExperienceSkills = /** @scrutinizer ignore-call */ collect($validatedResult);
Loading history...
62
        $response = [];
63
64
        DB::transaction(function () use ($newExperienceSkills, &$response) {
65
            foreach ($newExperienceSkills as $newExperienceSkill) {
66
                // Restore soft deleted experienceSkill if it exists, otherwise create a new one.
67
                $softDeletedExperienceSkill = ExperienceSkill::withTrashed()
68
                    ->where([
69
                    ['skill_id', $newExperienceSkill['skill_id']],
70
                    ['experience_id', $newExperienceSkill['experience_id']],
71
                    ['experience_type', $newExperienceSkill['experience_type']]
72
                ])->first();
73
                if ($softDeletedExperienceSkill) {
74
                    $softDeletedExperienceSkill->restore();
75
                    if ($newExperienceSkill['justification'] !== null && $newExperienceSkill['justification'] !== '') {
76
                        $softDeletedExperienceSkill->justification = $newExperienceSkill['justification'];
77
                    }
78
                    $softDeletedExperienceSkill->save();
79
                    array_push($response, $softDeletedExperienceSkill);
80
                } else {
81
                    $experienceSkill = new ExperienceSkill($newExperienceSkill);
82
                    $experienceSkill->skill_id = $newExperienceSkill['skill_id'];
83
                    $experienceSkill->experience_id = $newExperienceSkill['experience_id'];
84
                    $experienceSkill->experience_type = $newExperienceSkill['experience_type'];
85
                    $experienceSkill->justification = $newExperienceSkill['justification'];
86
                    $experienceSkill->save();
87
                    $experienceSkill->fresh();
88
                    array_push($response, $experienceSkill);
89
                }
90
            }
91
        }, 3); // Retry transaction up to three times if deadlock occurs.
92
93
        return JsonResource::collection($response);
94
    }
95
96
    public function batchUpdate(BatchUpdateExperienceSkill $request)
97
    {
98
        $validatedResult = $request->validated();
99
        $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

99
        $inputData = /** @scrutinizer ignore-call */ collect($validatedResult);
Loading history...
100
        $experienceSkills = ExperienceSkill::whereIn('id', $inputData->pluck('id')->all())->get();
101
102
        DB::transaction(function () use ($experienceSkills, $inputData) {
103
            foreach ($experienceSkills as $experienceSkill) {
104
                $updatedExperienceSkill = $inputData->firstWhere('id', $experienceSkill->id);
105
                $experienceSkill->fill($updatedExperienceSkill);
106
                $experienceSkill->save();
107
            }
108
        }, 3); // Retry transaction up to three times if deadlock occurs.
109
110
        return JsonResource::collection($experienceSkills->fresh());
111
    }
112
113
    public function batchDestroy(Request $request)
114
    {
115
        $experienceSkillIds = $request->validate([
116
            '*.id' => 'required|exists:App\Models\ExperienceSkill,id',
117
        ]);
118
        $experienceSkills = ExperienceSkill::whereIn('id', $experienceSkillIds);
119
        foreach ($experienceSkills as $experienceSkill) {
120
            $this->authorize('delete', $experienceSkill);
121
        }
122
        $experienceSkills->delete();
123
        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

123
        return /** @scrutinizer ignore-call */ response()->json(['success' => 'success'], 200);
Loading history...
124
    }
125
}
126