Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
68.00% |
17 / 25 |
CRAP | |
89.87% |
204 / 227 |
SiteController | |
0.00% |
0 / 1 |
|
68.00% |
17 / 25 |
68.26 | |
89.87% |
204 / 227 |
__construct | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
index | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
superAdminIndex | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
userIndex | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
store | |
0.00% |
0 / 1 |
4.13 | |
80.00% |
12 / 15 |
|||
show | |
0.00% |
0 / 1 |
2.21 | |
62.50% |
5 / 8 |
|||
update | |
0.00% |
0 / 1 |
2.03 | |
80.00% |
12 / 15 |
|||
getOfferSlots | |
100.00% |
1 / 1 |
1 | |
100.00% |
14 / 14 |
|||
getSponsorSites | |
100.00% |
1 / 1 |
1 | |
100.00% |
8 / 8 |
|||
getAll | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
addOrRemoveOffer | |
100.00% |
1 / 1 |
3 | |
100.00% |
16 / 16 |
|||
addOrRemoveSponsor | |
100.00% |
1 / 1 |
3 | |
100.00% |
12 / 12 |
|||
updateState | |
100.00% |
1 / 1 |
2 | |
100.00% |
14 / 14 |
|||
creationState | |
100.00% |
1 / 1 |
1 | |
100.00% |
12 / 12 |
|||
createOrUpdateSiteV2 | |
100.00% |
1 / 1 |
7 | |
100.00% |
29 / 29 |
|||
setJsonPatternValidation | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
refreshUploads | |
100.00% |
1 / 1 |
2 | |
100.00% |
10 / 10 |
|||
refreshImagesList | |
100.00% |
1 / 1 |
8 | |
100.00% |
19 / 19 |
|||
refreshOtherFile | |
100.00% |
1 / 1 |
7 | |
100.00% |
9 / 9 |
|||
updateRequestWithDotNotation | |
0.00% |
0 / 1 |
8.10 | |
88.24% |
15 / 17 |
|||
storeBase64toFile | |
100.00% |
1 / 1 |
2 | |
100.00% |
8 / 8 |
|||
deleteFileInStorage | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
createNewOperation | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 5 |
|||
getDefaultStructure | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
getNameOperation | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 4 |
1 | <?php |
2 | |
3 | namespace Qmp\Laravel\SiteGeneratorDetail\Controllers; |
4 | |
5 | use Illuminate\Http\Response; |
6 | use Illuminate\Http\Request; |
7 | use Illuminate\Support\Facades\Log; |
8 | use Illuminate\Support\Facades\Redis; |
9 | use Illuminate\Support\Facades\Storage; |
10 | use Illuminate\Support\Str; |
11 | use Qmp\Laravel\ApiDigitalV2\Api\DigitalV2InterfaceProvider; |
12 | use Qmp\Laravel\MicroService\Controllers\AbstractMicroServiceController; |
13 | use Qmp\Laravel\SiteGeneratorDetail\Models\Site; |
14 | use Qmp\Laravel\SiteGeneratorDetail\Rules\CheckSiteDetailsImagesListRule; |
15 | use Qmp\Laravel\SiteGeneratorDetail\Rules\CheckSiteDetailsOtherFilesRule; |
16 | |
17 | class SiteController extends AbstractMicroServiceController |
18 | { |
19 | private $jsonPatternValidation = [ |
20 | 'api' => 'required', |
21 | 'id' => 'required', |
22 | 'text' => 'required', |
23 | 'config.domain.id' => 'present', |
24 | 'config.domain.text' => 'present', |
25 | 'config.url' => 'present', |
26 | 'config.urlHash' => 'present', |
27 | 'config.date.start' => 'present', |
28 | 'config.date.end' => 'present', |
29 | 'config.state.value' => 'required', |
30 | 'config.redirection.badDate' => 'present', |
31 | 'config.redirection.noRoutes' => 'present', |
32 | 'config.redirection.alreadyOptin' => 'present', |
33 | 'config.sponsorsList' => 'array', |
34 | 'config.sponsorsToDisplay' => 'present|integer', |
35 | 'template.name' => 'present', |
36 | 'template.siteType' => 'present', |
37 | 'template.images.list' => 'array', |
38 | 'template.images.affectation' => 'present', |
39 | 'template.css.file' => 'present', |
40 | 'template.css.content' => 'present', |
41 | 'template.js.file' => 'present', |
42 | 'template.js.content' => 'present', |
43 | 'template.thema' => 'present', |
44 | 'template.textContent' => 'present', |
45 | 'template.breadcrumbs' => 'required', |
46 | 'template.regulationFile' => 'required', |
47 | 'template.termsFile' => 'required', |
48 | 'template.footer' => 'required', |
49 | 'template.activeExternalLinks' => 'required', |
50 | 'template.externalLinks' => 'present', |
51 | 'routes.0.id' => 'required', |
52 | 'routes.0.text' => 'present', |
53 | 'routes.0.conditions.type' => 'present', |
54 | 'routes.0.conditions.rows' => 'present', |
55 | 'routes.0.pages.0.id' => 'required', |
56 | 'routes.0.pages.0.type' => 'present', |
57 | 'routes.0.pages.0.name' => 'present', |
58 | 'routes.0.pages.0.editMode' => 'present', |
59 | 'routes.0.pages.0.sponsors' => 'present', |
60 | 'routes.0.pages.0.sponsorsToDisplay' => 'required', |
61 | 'routes.0.pages.0.blocks' => 'present', |
62 | 'welcomeMails.active' => 'present', |
63 | 'welcomeMails.welcomeMail' => 'present', |
64 | 'welcomeMails.object' => 'present', |
65 | 'welcomeMails.aliasSender' => 'present', |
66 | 'welcomeMails.title' => 'present', |
67 | 'welcomeMails.content' => 'present', |
68 | 'welcomeMails.image' => 'present' |
69 | ]; |
70 | |
71 | protected $operationTypeId = 1; |
72 | |
73 | public function __construct(Request $request) |
74 | { |
75 | parent::__construct($request); |
76 | } |
77 | |
78 | /** |
79 | * Display a listing of the resource. |
80 | * |
81 | * @return \Illuminate\Http\Response |
82 | */ |
83 | public function index() |
84 | { |
85 | return response()->json($this->assignedIndex()); |
86 | } |
87 | |
88 | protected function superAdminIndex() { |
89 | Log::debug('super_admin'); |
90 | return Site::orderBy('created_at', 'desc')->get(); |
91 | } |
92 | |
93 | protected function userIndex($ids) { |
94 | Log::debug('user_index'); |
95 | return Site::whereIn('id', $ids)->orderBy('created_at', 'desc')->get(); |
96 | } |
97 | |
98 | /** |
99 | * Store a newly created resource in storage. |
100 | * |
101 | * @param \Illuminate\Http\Request $request |
102 | * @return \Illuminate\Http\JsonResponse |
103 | */ |
104 | |
105 | public function store(Request $request) |
106 | { |
107 | $request->validate( |
108 | $this->setJsonPatternValidation([ |
109 | 'id' => 'required|in:0', |
110 | 'template.images.list' => ['array', new CheckSiteDetailsImagesListRule()], |
111 | 'template.regulationFile' => ['required', new CheckSiteDetailsOtherFilesRule()], |
112 | 'template.termsFile' => ['required', new CheckSiteDetailsOtherFilesRule()] |
113 | ]) |
114 | ); |
115 | |
116 | try { |
117 | if (!$request->has('id') || $request->id === "0") { |
118 | $request->merge(['id' => uniqid()]); |
119 | } |
120 | |
121 | $request = $this->refreshUploads($request); |
122 | |
123 | $site = Site::create($request->all()); |
124 | Redis::publish('site-generator-config', json_encode(['action' => 'save-site', 'siteId' => $site->id])); |
125 | return response()->json(["status" => "ok", "datas" => $site->toArray()], Response::HTTP_CREATED); |
126 | } catch (\Exception $e) { |
127 | Log::debug('Unable to store entity:' . var_export(['message' => $e->getMessage(), 'line' => $e->getLine(), 'file' => $e->getFile()], true)); |
128 | return response()->json(["status" => "ko", "message" => $e->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY); |
129 | } |
130 | } |
131 | |
132 | /** |
133 | * Display the specified resource. |
134 | * |
135 | * @param Site $site |
136 | * @return \Illuminate\Http\JsonResponse |
137 | */ |
138 | public function show(Site $site) |
139 | { |
140 | try { |
141 | $this->checkOperationAssignment($site->id); |
142 | |
143 | $siteArray = $site->toArray(); |
144 | $siteArray['progress'] = $site->progress; |
145 | return response()->json([ |
146 | 'site_detail' => $siteArray, |
147 | ]); |
148 | } catch (\Exception $e) { |
149 | Log::debug('Unable to show entity:' . var_export(['message' => $e->getMessage(), 'line' => $e->getLine(), 'file' => $e->getFile()], true)); |
150 | return response()->json(["status" => "ko", "message" => $e->getMessage()], $this->getHttpCode($e)); |
151 | } |
152 | } |
153 | |
154 | /** |
155 | * Update the specified resource in storage. |
156 | * |
157 | * @param \Illuminate\Http\Request $request |
158 | * @return \Illuminate\Http\JsonResponse |
159 | */ |
160 | public function update(Request $request, $site) |
161 | { |
162 | $request->validate( |
163 | $this->setJsonPatternValidation([ |
164 | 'id' => 'required|in:' . $site, |
165 | 'template.images.list' => ['array', new CheckSiteDetailsImagesListRule()], |
166 | 'template.regulationFile' => ['required', new CheckSiteDetailsOtherFilesRule()], |
167 | 'template.termsFile' => ['required', new CheckSiteDetailsOtherFilesRule()] |
168 | ]) |
169 | ); |
170 | |
171 | try { |
172 | $this->checkOperationAssignment($request->id); |
173 | $site = Site::findOrFail($site); |
174 | |
175 | $request = $this->refreshUploads($request, $site); |
176 | |
177 | $site->update($request->except('id')); |
178 | Redis::publish('site-generator-config', json_encode(['action' => 'save-site', 'siteId' => $site->id])); |
179 | return response()->json(["status" => "ok", "datas" => $site->toArray()], Response::HTTP_OK); |
180 | } catch (\Exception $e) { |
181 | Log::debug('Unable to update entity:' . var_export(['message' => $e->getMessage(), 'line' => $e->getLine(), 'file' => $e->getFile()], true)); |
182 | return response()->json(["status" => "ko", "message" => $e->getMessage()], $this->getHttpCode($e)); |
183 | } |
184 | } |
185 | |
186 | /** |
187 | * Get All available offer slots |
188 | * |
189 | * @param String $id |
190 | * @return \Illuminate\Http\JsonResponse |
191 | */ |
192 | public function getOfferSlots($id) |
193 | { |
194 | $slots = Site::pipeline() |
195 | ->unwind('routes') |
196 | ->unwind('routes.pages') |
197 | ->unwind('routes.pages.blocks') |
198 | ->match('routes.pages.blocks.value', 2) |
199 | ->project('{ |
200 | "final": { |
201 | "k": "$text", |
202 | "v": { |
203 | "siteId": "$id", |
204 | "routeId": "$routes.id", |
205 | "pageId": "$routes.pages.id", |
206 | "blockId": "$routes.pages.blocks.id", |
207 | "text": { |
208 | "$concat": [ |
209 | "$routes.text", |
210 | " / ", |
211 | "$routes.pages.name", |
212 | " / ", |
213 | "$routes.pages.blocks.block.text" |
214 | ] |
215 | }, |
216 | "value": { |
217 | "$in": [ |
218 | "' . $id . '", |
219 | "$routes.pages.blocks.block.offers.value" |
220 | ] |
221 | } |
222 | } |
223 | } |
224 | }') |
225 | ->group('$_id', '{ |
226 | "siteTitle": { |
227 | "$first": "$final.k" |
228 | }, |
229 | "slots": { |
230 | "$push": "$final.v" |
231 | } |
232 | }') |
233 | ->sort('siteTitle', 'asc') |
234 | ->group(null, '{ |
235 | "final": { |
236 | "$push": { |
237 | "$arrayToObject": [ |
238 | [ |
239 | { |
240 | "k": "$siteTitle", |
241 | "v": "$slots" |
242 | } |
243 | ] |
244 | ] |
245 | } |
246 | } |
247 | }') |
248 | ->replaceRoot('{ "$mergeObjects": "$final" }') |
249 | ->aggregate() |
250 | ->first(); |
251 | |
252 | return response()->json($slots); |
253 | } |
254 | |
255 | |
256 | /** |
257 | * Get All Sites with sponsor id in sponsorsList |
258 | * |
259 | * @param $id |
260 | * @return \Illuminate\Http\JsonResponse |
261 | */ |
262 | public function getSponsorSites($id) |
263 | { |
264 | |
265 | $sites = Site::pipeline() |
266 | ->unwind('config.sponsorsList') |
267 | ->match('config.sponsorsList.id', $id) |
268 | ->project('{"id": "$id"}') |
269 | ->aggregate() |
270 | ->toArray(); |
271 | |
272 | $sites = array_column($sites, 'id'); |
273 | |
274 | return response()->json($sites); |
275 | } |
276 | |
277 | /** |
278 | * Get all siteDetails |
279 | * |
280 | * @return \Illuminate\Http\JsonResponse |
281 | */ |
282 | public function getAll() |
283 | { |
284 | return response()->json(Site::all()); |
285 | } |
286 | |
287 | /** |
288 | * Add or remove offer in siteDetail |
289 | * |
290 | * @param \Illuminate\Http\Request $request |
291 | * @param \Qmp\Laravel\SiteGeneratorDetail\Models\Site $site |
292 | * @return \Illuminate\Http\JsonResponse |
293 | */ |
294 | public function addOrRemoveOffer(Request $request, $site) |
295 | { |
296 | |
297 | $request->validate([ |
298 | 'action' => 'required|in:add,remove', |
299 | 'path' => 'required', |
300 | 'offer' => 'required' |
301 | ]); |
302 | |
303 | try { |
304 | $site = Site::findOrFail($site); |
305 | |
306 | $offer = $request->offer; |
307 | $column = 'routes.$id.pages.$id.blocks.$id.block.offers'; |
308 | |
309 | $options = [ |
310 | $request->path['routeId'], |
311 | $request->path['pageId'], |
312 | $request->path['blockId'] |
313 | ]; |
314 | |
315 | |
316 | if ($request->action === 'add') { |
317 | $site->pushFilter($column, $offer, $options); |
318 | } else { |
319 | $offerToRemove = ['value' => $offer['value']]; |
320 | $site->pullFilter($column, $offerToRemove, $options); |
321 | } |
322 | |
323 | return response()->json(["status" => "ok", "datas" => $site->toArray()], Response::HTTP_OK); |
324 | } catch (\Exception $e) { |
325 | Log::debug('Unable to add or remove offer:' . var_export(['message' => $e->getMessage(), 'line' => $e->getLine(), 'file' => $e->getFile()], true)); |
326 | return response()->json(["status" => "ko", "message" => $e->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY); |
327 | } |
328 | } |
329 | |
330 | /** |
331 | * Add or remove sponsor in siteDetail |
332 | * |
333 | * @param Request $request |
334 | * @param $site |
335 | * @return \Illuminate\Http\JsonResponse |
336 | */ |
337 | public function addOrRemoveSponsor(Request $request, $site) |
338 | { |
339 | $request->validate([ |
340 | 'action' => 'required|in:add,remove', |
341 | 'sponsor' => 'required|array' |
342 | ]); |
343 | |
344 | try { |
345 | $site = Site::findOrFail($site); |
346 | |
347 | $sponsor = $request->sponsor; |
348 | |
349 | if ($request->action === 'add') { |
350 | Site::where('id', $site->id)->push('config.sponsorsList', $sponsor); |
351 | } else { |
352 | $sponsorToRemove = ['id' => $sponsor['id']]; |
353 | Site::where('id', $site->id)->pull('config.sponsorsList', $sponsorToRemove); |
354 | } |
355 | |
356 | return response()->json(["status" => "ok", "datas" => $site->toArray()], Response::HTTP_OK); |
357 | } catch (\Exception $e) { |
358 | Log::debug('Unable to add or remove sponsor:' . var_export(['message' => $e->getMessage(), 'line' => $e->getLine(), 'file' => $e->getFile()], true)); |
359 | return response()->json(["status" => "ko", "message" => $e->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY); |
360 | } |
361 | } |
362 | |
363 | /** |
364 | * Update state in siteDetail |
365 | * |
366 | * @param \Illuminate\Http\Request $request |
367 | * @param [Type] $id |
368 | * @return \Illuminate\Http\JsonResponse |
369 | */ |
370 | public function updateState(Request $request, $site) |
371 | { |
372 | $request->validate([ |
373 | 'id' => 'required|in:' . $site, |
374 | 'value.value' => 'required|in:1,2', |
375 | 'value.text' => 'required' |
376 | ]); |
377 | |
378 | try { |
379 | $site = Site::findOrFail($site); |
380 | $config = $site->config; |
381 | $config['state'] = collect($request->value)->only(['value', 'text'])->toArray(); |
382 | $site->config = $config; |
383 | $site->save(); |
384 | Redis::publish('site-generator-config', json_encode(['action' => 'update-sites', 'siteId' => $site->id])); |
385 | return response()->json(["status" => "ok", "datas" => $site->toArray()], Response::HTTP_OK); |
386 | } catch (\Exception $e) { |
387 | Log::debug('Unable to update state:' . var_export(['message' => $e->getMessage(), 'line' => $e->getLine(), 'file' => $e->getFile()], true)); |
388 | return response()->json(["status" => "ko", "message" => $e->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY); |
389 | } |
390 | } |
391 | |
392 | public function creationState(Request $request, $site) |
393 | { |
394 | $request->validate([ |
395 | 'siteId' => 'required|in:' . $site, |
396 | 'channel' => 'required', |
397 | 'action' => 'required', |
398 | 'message' => 'required' |
399 | ]); |
400 | |
401 | $site = Site::findOrFail($site); |
402 | $site->push('creation_state', [ |
403 | 'datetime' => (new \DateTime())->format('Y-m-d H:i:s'), |
404 | 'channel' => $request->channel, |
405 | 'action' => $request->action, |
406 | 'message' => $request->message, |
407 | ]); |
408 | |
409 | return response()->json(["status" => "ok"], Response::HTTP_OK); |
410 | } |
411 | |
412 | /** |
413 | * Create or update site on digital v2 |
414 | * |
415 | * @param $site |
416 | * @return \Illuminate\Http\JsonResponse |
417 | */ |
418 | public function createOrUpdateSiteV2($id) |
419 | { |
420 | try { |
421 | |
422 | $site = Site::findOrFail($id); |
423 | $siteV2 = $site->digitalv2 ? resolve(DigitalV2InterfaceProvider::class)->updateSite($site) : resolve(DigitalV2InterfaceProvider::class)->createSite($site); |
424 | |
425 | $site->setKey('digitalv2.id', strval($siteV2['id'])); |
426 | |
427 | foreach ($siteV2['containers'] as $container) { |
428 | $column = 'routes.$id.pages.$id.blocks.$id.block'; |
429 | |
430 | $options = [ |
431 | $container['routeId'], |
432 | $container['pageId'], |
433 | $container['blockId'] |
434 | ]; |
435 | |
436 | if ($container['tag']) { |
437 | $site->setKeyFilter($column, 'tag', $container['tag'], $options); |
438 | } |
439 | |
440 | $site->setKeyFilter($column, 'id_container', strval($container['id']), $options); |
441 | } |
442 | |
443 | foreach ($siteV2['webservices'] as $webservice) { |
444 | $column = 'config.sponsorsList.$id'; |
445 | |
446 | $options = [strval($webservice['id_offer'])]; |
447 | |
448 | $site->setKeyFilter($column, 'ws', $webservice['ws'], $options); |
449 | } |
450 | |
451 | foreach ($siteV2['visuals'] as $visual) { |
452 | $column = 'routes.$id.pages.$id.blocks.$id.block.offers.$value'; |
453 | |
454 | $options = [ |
455 | $visual['routeId'], |
456 | $visual['pageId'], |
457 | $visual['blockId'], |
458 | $visual['id'] |
459 | ]; |
460 | |
461 | $site->setKeyFilter($column, 'url', $visual['url'], $options); |
462 | $site->setKeyFilter($column, 'img', $visual['img'], $options); |
463 | $site->setKeyFilter($column, 'planning', $visual['id_planning'], $options); |
464 | } |
465 | |
466 | Redis::publish('site-generator-config', json_encode(['action' => 'update-sites', 'siteId' => $id])); |
467 | return response()->json(["status" => "ok"], Response::HTTP_OK); |
468 | } catch (\Exception $e) { |
469 | Log::debug('Unable to update digital v2 site:' . var_export(['message' => $e->getMessage(), 'line' => $e->getLine(), 'file' => $e->getFile()], true)); |
470 | return response()->json(["status" => "ko", "message" => $e->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY); |
471 | } |
472 | } |
473 | |
474 | /** |
475 | * Set JsonPatternValidation with another validation rules |
476 | * |
477 | * @param array $newValidationRules |
478 | * @return array |
479 | */ |
480 | private function setJsonPatternValidation(array $newValidationRules) |
481 | { |
482 | return array_merge($this->jsonPatternValidation, $newValidationRules); |
483 | } |
484 | |
485 | /** |
486 | * refresh uploads file in request before store or update site |
487 | * |
488 | * @param \Illuminate\Http\Request $request |
489 | * @param \Qmp\Laravel\SiteGeneratorDetail\Models\Site|null $site |
490 | * @return Request |
491 | */ |
492 | private function refreshUploads(Request $request, Site $site = null) |
493 | { |
494 | $modelRegulationFile = null; |
495 | $modelTermsFile = null; |
496 | |
497 | if ($site) { |
498 | $site = collect($site->toArray()); |
499 | $modelRegulationFile = $site->dotGet('template.regulationFile'); |
500 | $modelTermsFile = $site->dotGet('template.termsFile'); |
501 | } |
502 | |
503 | $request = $this->refreshImagesList($request); |
504 | $request = $this->refreshOtherFile($request, 'template.regulationFile', $modelRegulationFile); |
505 | $request = $this->refreshOtherFile($request, 'template.termsFile', $modelTermsFile); |
506 | |
507 | return $request; |
508 | } |
509 | |
510 | /** |
511 | * Refresh images list in siteDetail |
512 | * |
513 | * @param \Illuminate\Http\Request $request |
514 | * @return Request |
515 | */ |
516 | private function refreshImagesList(Request $request) |
517 | { |
518 | $images = $request->input('template.images.list'); |
519 | $affectations = $request->input('template.images.affectation'); |
520 | foreach ($images as $k => $image) { |
521 | if (isset($image['active']) && !$image['active']) { |
522 | $this->deleteFileInStorage($image['name']); |
523 | unset($images[$k]); |
524 | } |
525 | |
526 | if (isset($image['upload']) && isset($image['status'])) { |
527 | $file = $this->storeBase64toFile($request->input('id'), $image, true); |
528 | |
529 | foreach ($affectations as $key => $affectation) { |
530 | $affectations[$key]['value'] = $affectation['value'] === $image['upload']['filename'] ? $file['name'] : $affectation['value']; |
531 | } |
532 | |
533 | $newImage = [ |
534 | 'active' => true, |
535 | 'name' => $file['name'], |
536 | 'dataURL' => $file['dataURL'] |
537 | ]; |
538 | |
539 | $images[$k] = $newImage; |
540 | } |
541 | } |
542 | |
543 | $template = $request->input('template'); |
544 | $template['images']['list'] = $images; |
545 | $template['images']['affectation'] = $affectations; |
546 | |
547 | $request->merge(['template' => $template]); |
548 | |
549 | return $request; |
550 | } |
551 | |
552 | /** |
553 | * Refresh other files in siteDetail |
554 | * |
555 | * @param \Illuminate\Http\Request $request |
556 | * @param String $pathRequest |
557 | * @param mixed $modelFile |
558 | * @return Request |
559 | */ |
560 | private function refreshOtherFile(Request $request, $pathRequest, $modelFile) |
561 | { |
562 | if ($request->input($pathRequest) && !preg_match('/' . $request->input('id') . '/', $request->input($pathRequest . '.name'))) { |
563 | $file = $this->storeBase64toFile($request->input('id'), $request->input($pathRequest)); |
564 | if (isset($modelFile['name']) && $request->input($pathRequest) !== $modelFile) { |
565 | $this->deleteFileInStorage($modelFile['name']); |
566 | } |
567 | |
568 | $otherFile = ['name' => $file['name'], 'dataURL' => $file['dataURL']]; |
569 | |
570 | $this->updateRequestWithDotNotation($pathRequest, null, $otherFile, $request); |
571 | } |
572 | |
573 | if (!$request->input($pathRequest) && $modelFile) { |
574 | $this->deleteFileInStorage($modelFile['name']); |
575 | } |
576 | |
577 | return $request; |
578 | } |
579 | |
580 | private function updateRequestWithDotNotation($dotNotation, $array = null, $value = null, $request = null) |
581 | { |
582 | $path = explode('.', $dotNotation); |
583 | $inputName = ''; |
584 | if ($request !== null && isset($path[0])) { |
585 | $inputName = $path[0]; |
586 | $array = $request->input($inputName); |
587 | array_shift($path); |
588 | } |
589 | |
590 | if (isset($path[0]) && $path[0] !== '') { |
591 | $key = array_shift($path); |
592 | if (!isset($array[$key])) { |
593 | $array[$key] = []; |
594 | } |
595 | $array[$key] = $this->updateRequestWithDotNotation(implode('.', $path), $array[$key], $value); |
596 | |
597 | if ($request !== null) { |
598 | $request->merge([$inputName => $array]); |
599 | } |
600 | |
601 | return $array; |
602 | } else { |
603 | if ($request !== null) { |
604 | $request->merge([$inputName => $value]); |
605 | } |
606 | return $value; |
607 | } |
608 | } |
609 | |
610 | /** |
611 | * Store base64 datas to file in storage |
612 | * |
613 | * @param String $idSite |
614 | * @param array $file |
615 | * @param bool|null $image |
616 | * @return array |
617 | */ |
618 | private function storeBase64toFile(string $idSite, array $file, bool $image = null) |
619 | { |
620 | $path = $image ? $file['upload']['filename'] : $file['name']; |
621 | $explode = explode('.', $path); |
622 | $ext = end($explode); |
623 | |
624 | $filename = $idSite . '_' . Str::random(10) . '.' . $ext; |
625 | |
626 | $explode = explode(',', $file['dataURL']); |
627 | $document = str_replace(' ', '+', $explode[1]); |
628 | |
629 | Storage::disk('site_generator')->put($filename, base64_decode($document)); |
630 | |
631 | return ['name' => $filename, 'dataURL' => str_replace(Storage::disk('public')->path(''), '/', Storage::disk('site_generator')->path($filename))]; |
632 | } |
633 | |
634 | /** |
635 | * Delete file in storage |
636 | * |
637 | * @param String $filename |
638 | */ |
639 | private function deleteFileInStorage(string $filename) |
640 | { |
641 | Storage::disk('site_generator')->delete($filename); |
642 | } |
643 | |
644 | public function createNewOperation(Request $request) |
645 | { |
646 | $request->merge($this->getDefaultStructure()); |
647 | |
648 | $response = $this->store($request); |
649 | |
650 | if (Str::startsWith($response->status(), '2')) { |
651 | return $this->GetResponseForCreatedOperation($response->getOriginalContent()['datas']['id']); |
652 | } |
653 | |
654 | return $response; |
655 | } |
656 | |
657 | private function getDefaultStructure() |
658 | { |
659 | return include(__DIR__ . '/../DefaultStructure/SiteStructure.php'); |
660 | } |
661 | |
662 | public function getNameOperation($id) |
663 | { |
664 | $session = Site::findOrFail($id, ['id', 'text']); |
665 | |
666 | $session = [ |
667 | 'id' => $session->id, |
668 | 'name' => $session->text |
669 | ]; |
670 | |
671 | return response()->json($session); |
672 | } |
673 | } |