Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 82
0.00% covered (danger)
0.00%
0 / 8
CRAP
0.00% covered (danger)
0.00%
0 / 1
ServiceController
0.00% covered (danger)
0.00%
0 / 82
0.00% covered (danger)
0.00%
0 / 8
210
0.00% covered (danger)
0.00%
0 / 1
 index
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 1
12
 create
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
2
 store
0.00% covered (danger)
0.00%
0 / 19
0.00% covered (danger)
0.00%
0 / 1
6
 edit
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
2
 update
0.00% covered (danger)
0.00%
0 / 16
0.00% covered (danger)
0.00%
0 / 1
6
 show
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 destroy
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
6
 generateServicePassword
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2
3namespace App\Http\Controllers;
4
5use App\Http\Requests\GenerateServiceToken;
6use App\Http\Requests\Services\StoreServiceRequest;
7use App\Http\Requests\Services\UpdateServiceRequest;
8use App\Mail\ServiceCredentialRenewed;
9use App\Models\Brand;
10use App\Models\Service;
11use Illuminate\Http\Request;
12use Illuminate\Support\Facades\DB;
13use Illuminate\Support\Facades\Hash;
14use Illuminate\Support\Facades\Mail;
15use Illuminate\Support\Str;
16
17class ServiceController extends Controller
18{
19    /**
20     * Display a listing of the resource.
21     *
22     * @param \Illuminate\Http\Request $request
23     * @return \Illuminate\Contracts\View\View
24     */
25    public function index(Request $request): \Illuminate\Contracts\View\View
26    {
27        /** @var \Illuminate\Database\Eloquent\Builder $query */
28        $query = Service::query();
29
30        if ($request->brand) {
31            $query = $query->where('brand_id', '=', $request->brand);
32        }
33        if ($request->search) {
34            $this->searchQuery(
35                $query,
36                $request->search,
37                null,
38                'name',
39            );
40        }
41
42        $this->sortQuery($query);
43        $searchFields = trans('Nom');
44
45        $serviceModels = $query->paginate(12);
46
47        return view('services.index', compact('serviceModels', 'searchFields'));
48    }
49
50    /**
51     * Show the form for creating a new resource.
52     *
53     * @param \App\Models\Service $service
54     * @return \Illuminate\Contracts\View\View
55     */
56    public function create(Service $service): \Illuminate\Contracts\View\View
57    {
58        $brandModels = Brand::all();
59
60        return view('services.create', [
61            'serviceModel' => $service,
62            'brandModels' => $brandModels
63        ]);
64    }
65
66    /**
67     * Store a newly created resource in storage.
68     *
69     * @param \App\Http\Requests\Services\StoreServiceRequest $request
70     * @return \Illuminate\Http\RedirectResponse
71     */
72    public function store(StoreServiceRequest $request): \Illuminate\Http\RedirectResponse
73    {
74        return DB::transaction(function () use ($request) {
75            $service = new Service();
76            $service->fill($request->validated());
77            $service->generateBearerToken();
78            $this->generateServicePassword($service);
79            if ($service->saveOrFail()) {
80                return redirect()
81                    ->route('services.edit', $service)
82                    ->with('success', trans(
83                        ':model a été créé.',
84                        ['model' => Str::singular(trans('models.classes.services'))]
85                    ));
86            }
87            return redirect()
88                ->back()
89                ->with('error', trans(
90                    ':model n\'a pas été créé.',
91                    ['model' => Str::singular(trans('models.classes.services'))]
92                ));
93        });
94    }
95
96    /**
97     * Show the form for editing the specified resource.
98     *
99     * @param \App\Models\Service $service
100     * @return \Illuminate\Contracts\View\View
101     */
102    public function edit(Service $service): \Illuminate\Contracts\View\View
103    {
104        $brandModels = Brand::all();
105
106        return view('services.edit', [
107            'serviceModel' => $service,
108            'brandModels' => $brandModels
109        ]);
110    }
111
112    /**
113     * Update a spacific resource in storage.
114     *
115     * @param \App\Http\Requests\Services\UpdateServiceRequest $request
116     * @param \App\Models\Service                              $service
117     * @return \Illuminate\Contracts\View\View
118     */
119    public function update(UpdateServiceRequest $request, Service $service): \Illuminate\Contracts\View\View
120    {
121        return DB::transaction(function () use ($request, $service) {
122            $service->fill($request->validated());
123            if ($service->saveOrFail()) {
124                return redirect()
125                    ->route('services.edit', $service)
126                    ->with('success', trans(
127                        ':model a été mis à jour.',
128                        ['model' => Str::singular(trans('models.classes.services'))]
129                    ));
130            }
131            return redirect()
132                ->back()
133                ->with('error', trans(
134                    ':model n\'a pas été mis à jour.',
135                    ['model' => Str::singular(trans('models.classes.services'))]
136                ));
137        });
138    }
139
140    /**
141     * Show the specified resource.
142     *
143     * @param \App\Models\Service $service
144     * @return \Illuminate\Contracts\View\View
145     */
146    public function show(Service $service): \Illuminate\Contracts\View\View
147    {
148        return view('services.show', [
149            'serviceModel' => $service
150        ]);
151    }
152
153    /**
154     * Remove the specified resource from storage.
155     *
156     * @param \App\Models\Service $service
157     * @return \Illuminate\Http\RedirectResponse
158     */
159    public function destroy(Service $service): \Illuminate\Http\RedirectResponse
160    {
161        if ($service->deleteOrFail()) {
162            return redirect()->route('services.index')
163                ->with('success', trans(
164                    ':model a été supprimé.',
165                    ['model' => Str::singular(trans('models.classes.services'))]
166                ));
167        }
168        return redirect()->back()
169            ->with('error', trans(
170                ':model n\'a pas pu être supprimé.',
171                ['model' => Str::singular(trans('models.classes.services'))]
172            ));
173    }
174
175    /**
176     * Regen service credentials.
177     *
178     * @param \App\Http\Requests\GenerateServiceToken $request
179     * @param \App\Models\Service                     $service
180     * @return \Illuminate\Http\RedirectResponse
181     */
182    // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassAfterLastUsed, Squiz.Commenting.FunctionComment.Missing
183    public function generateServicePassword(
184        Service $service,
185        GenerateServiceToken $request = null
186    ): \Illuminate\Http\RedirectResponse {
187        /** @var \App\Models\User $user */
188        $user = auth()->user();
189
190        // * Special Condition for migration from v2 to v3.
191        $service->bearer_token = !Hash::needsRehash($service->bearer_token) ?
192            $service->generateBearerToken() : $service->bearer_token;
193
194        $bearerPwd = $service->generateBearerPassword();
195        $service->saveOrFail();
196        Mail::send(new ServiceCredentialRenewed($service, $user));
197        return back()
198            // phpcs:ignore Generic.Files.LineLength.TooLong
199            ->with('error', "ATTENTION : METTEZ À JOUR LE SITE ! \nNouveau token d'API de $service->name : '$service->bearer_token' et mot de passe '$bearerPwd'");
200    }
201}