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