Passed
Push — task/application-profile-react... ( 95a834...f06e77 )
by Yonathan
08:39
created

ExperienceSkillsController::batchStore()   A

Complexity

Conditions 5
Paths 1

Size

Total Lines 36
Code Lines 27

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 27
dl 0
loc 36
rs 9.1768
c 0
b 0
f 0
cc 5
nc 1
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
    /**
74
     * Create many new ExperienceSkills at once.
75
     *
76
     * @param BatchStoreExperienceSkill $request
77
     * @return void
78
     */
79
    public function batchStore(BatchStoreExperienceSkill $request)
80
    {
81
        $validatedResult = $request->validated();
82
        $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

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

126
        $inputData = /** @scrutinizer ignore-call */ collect($validatedResult);
Loading history...
127
        $experienceSkills = ExperienceSkill::whereIn('id', $inputData->pluck('id')->all())->get();
128
129
        DB::transaction(function () use ($experienceSkills, $inputData) {
130
            foreach ($experienceSkills as $experienceSkill) {
131
                $updatedExperienceSkill = $inputData->firstWhere('id', $experienceSkill->id);
132
                $experienceSkill->fill($updatedExperienceSkill);
133
                $experienceSkill->save();
134
            }
135
        }, 3); // Retry transaction up to three times if deadlock occurs.
136
137
        return JsonResource::collection($experienceSkills->fresh());
138
    }
139
140
    public function batchDestroy(Request $request)
141
    {
142
        $experienceSkillIds = $request->validate([
143
            '*.id' => 'required|exists:App\Models\ExperienceSkill,id',
144
        ]);
145
        $experienceSkills = ExperienceSkill::whereIn('id', $experienceSkillIds);
146
        foreach ($experienceSkills as $experienceSkill) {
147
            $this->authorize('delete', $experienceSkill);
148
        }
149
        $experienceSkills->delete();
150
        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

150
        return /** @scrutinizer ignore-call */ response()->json(['success' => 'success'], 200);
Loading history...
151
    }
152
}
153