diff --git a/app/Http/Controllers/Api/MeasuresController.php b/app/Http/Controllers/Api/MeasuresController.php index f1e97e156e8604b0d5df0d08fba8c6b9efce0159..708b02902736f52912f65c22f2441c8a2e6d10b5 100644 --- a/app/Http/Controllers/Api/MeasuresController.php +++ b/app/Http/Controllers/Api/MeasuresController.php @@ -20,7 +20,9 @@ class MeasuresController extends Controller { public function all() { - return Measure::all(); + return Measure::all()->map(function(Measure $m) { + return $m->withConvertedLevels(); + }); } public function save(MeasureRequest $request, $id = null) @@ -44,53 +46,39 @@ public function save(MeasureRequest $request, $id = null) $measure->name = $data['name']; $measure->short_name = $data['short_name']; - $measure->level1_actual_label = $data['level1_actual_label']; - $measure->level1_preconized_label = $data['level1_preconized_label']; - $measure->level1_description = $data['level1_description'] ?? null; - $measure->level1_difficulty = $data['level1_difficulty']; - $measure->level1_cost = $data['level1_cost']; - $measure->level1_duration = $data['level1_duration']; - $measure->level1_assistance = $data['level1_assistance']; - $measure->level1_info = $data['level1_info'] ?? null; - - $measure->level2_actual_label = $data['level2_actual_label']; - $measure->level2_preconized_label = $data['level2_preconized_label']; - $measure->level2_description = $data['level2_description'] ?? null; - $measure->level2_difficulty = $data['level2_difficulty']; - $measure->level2_cost = $data['level2_cost']; - $measure->level2_duration = $data['level2_duration']; - $measure->level2_assistance = $data['level2_assistance']; - $measure->level2_info = $data['level2_info'] ?? null; - - $measure->level3_actual_label = $data['level3_actual_label']; - $measure->level3_preconized_label = $data['level3_preconized_label']; - $measure->level3_description = $data['level3_description'] ?? null; - $measure->level3_difficulty = $data['level3_difficulty'] ; - $measure->level3_cost = $data['level3_cost']; - $measure->level3_duration = $data['level3_duration'] ; - $measure->level3_assistance = $data['level3_assistance'] ; - $measure->level3_info = $data['level3_info'] ?? null; - - $measure->save(); - if (isset($data['level1_file'])){ - $measure->level1_file = $this->storeFileLevel($data['level1_file'],$measure,1); - } - if (isset($data['level2_file'])) { - $measure->level2_file = $this->storeFileLevel($data['level2_file'], $measure, 2); - } - if (isset($data['level3_file'])) { - $measure->level3_file = $this->storeFileLevel($data['level3_file'], $measure, 3); + for ($i=0; $i< 3;$i++) { + $this->saveLevel($measure, $data, $i); } $measure->save(); - return $measure; + return $measure->withConvertedLevels(); } abort(403); } - public function storeFileLevel($file, $measure,$niveau){ + private function saveLevel(Measure $measure, $data, $level) + { + $niveau = $level + 1; + if ($data['levels'] && is_array($data['levels']) && count($data['levels']) > $level) { + $measure->{'level'.$niveau.'_actual_label'} = $data['levels'][$level]['actual_label']; + $measure->{'level'.$niveau.'_preconized_label'} = $data['levels'][$level]['preconized_label']; + $measure->{'level'.$niveau.'_description'} = $data['levels'][$level]['description'] ?? null; + $measure->{'level'.$niveau.'_difficulty'} = $data['levels'][$level]['difficulty']; + $measure->{'level'.$niveau.'_cost'} = $data['levels'][$level]['cost']; + $measure->{'level'.$niveau.'_duration'} = $data['levels'][$level]['duration']; + $measure->{'level'.$niveau.'_assistance'} = $data['levels'][$level]['assistance']; + $measure->{'level'.$niveau.'_info'} = $data['levels'][$level]['info'] ?? null; + + if (isset($data['levels'][$level]['file'])) { + $measure->{'level'.$niveau.'_file'} = $this->storeFileLevel($data['levels'][$level]['file'], $measure, $niveau); + } + } + } + + private function storeFileLevel($file, Measure $measure, int $niveau): string + { // todo mettre le bon contenu dans le fichier $image_parts = explode(";base64,", $file); $image_type_aux = explode("/", $image_parts[0]); diff --git a/app/Http/Requests/MeasureRequest.php b/app/Http/Requests/MeasureRequest.php index c5d7a30acffec45dc2df6fad99f52d4f46f598de..f46a0c798c7a692b5dd95127fd079b3046550305 100644 --- a/app/Http/Requests/MeasureRequest.php +++ b/app/Http/Requests/MeasureRequest.php @@ -26,33 +26,16 @@ public function rules() return [ 'name' => 'string|required|max:255', 'short_name' => 'string|required|max:255', - 'level1_actual_label' => 'string|required|max:255', - 'level1_preconized_label' => 'string|required|max:255', - 'level1_file' => 'string|nullable', - 'level1_description' => 'string|required', - 'level1_difficulty' => 'int|required', - 'level1_cost' => 'int|required', - 'level1_duration' => 'int|required', - 'level1_assistance' => 'int|required', - 'level1_info' => 'string|nullable', - 'level2_actual_label' => 'string|required|max:255', - 'level2_preconized_label' => 'string|required|max:255', - 'level2_file' => 'string|nullable', - 'level2_description' => 'string|required', - 'level2_difficulty' => 'int|required', - 'level2_cost' => 'int|required', - 'level2_duration' => 'int|required', - 'level2_assistance' => 'int|required', - 'level2_info' => 'string|nullable', - 'level3_actual_label' => 'string|required|max:255', - 'level3_preconized_label' => 'string|required|max:255', - 'level3_file' => 'string|nullable', - 'level3_description' => 'string|required', - 'level3_difficulty' => 'int|required', - 'level3_cost' => 'int|required', - 'level3_duration' => 'int|required', - 'level3_assistance' => 'int|required', - 'level3_info' => 'string|nullable', + 'levels' => 'array|min:3|max:3', + 'levels.*.actual_label' => 'string|required|max:255', + 'levels.*.preconized_label' => 'string|required|max:255', + 'levels.*.file' => 'string|nullable', + 'levels.*.description' => 'string|required', + 'levels.*.difficulty' => 'int|required', + 'levels.*.cost' => 'int|required', + 'levels.*.duration' => 'int|required', + 'levels.*.assistance' => 'int|required', + 'levels.*.info' => 'string|nullable', ]; } } diff --git a/app/Models/Measure.php b/app/Models/Measure.php index 958b959c3311567cee5de698472dfc9c094de9ad..8fc2756b700d011d96ed71ea4ebf468fbdc13ed8 100644 --- a/app/Models/Measure.php +++ b/app/Models/Measure.php @@ -44,4 +44,43 @@ class Measure extends Model { use HasFactory; use HasTimestamps; + + protected $casts = [ + 'level1_difficulty' => 'int', + 'level1_cost' => 'int', + 'level1_duration' => 'int', + 'level1_assistance' => 'int', + 'level2_difficulty' => 'int', + 'level2_cost' => 'int', + 'level2_duration' => 'int', + 'level2_assistance' => 'int', + 'level3_difficulty' => 'int', + 'level3_cost' => 'int', + 'level3_duration' => 'int', + 'level3_assistance' => 'int', + ]; + + public function withConvertedLevels(): array + { + $m = $this->toArray(); + + $m['levels'] = []; + + for ($i=0; $i < 3; $i++) { + $niveau = $i+1; + $m['levels'][$i] = [ + 'actual_label' => $this->{'level'.$niveau.'_actual_label'}, + 'preconized_label' => $this->{'level'.$niveau.'_preconized_label'}, + 'description' => $this->{'level'.$niveau.'_description'}, + 'difficulty' => $this->{'level'.$niveau.'_difficulty'}, + 'cost' => $this->{'level'.$niveau.'_cost'}, + 'duration' => $this->{'level'.$niveau.'_duration'}, + 'assistance' => $this->{'level'.$niveau.'_assistance'}, + 'info' => $this->{'level'.$niveau.'_info'}, + 'file' => $this->{'level'.$niveau.'_file'}, + ]; + } + + return $m; + } } diff --git a/tests/Feature/MeasuresControllerTest.php b/tests/Feature/MeasuresControllerTest.php index 379959d16057f6e8107e54d6a740cb1da7eddeb2..cb32750b1d50764449a9b3b917ca5d0a57326ebc 100644 --- a/tests/Feature/MeasuresControllerTest.php +++ b/tests/Feature/MeasuresControllerTest.php @@ -28,7 +28,9 @@ public function testAdminCanGetAll() $response->assertOk(); - $m = Measure::all(); + $m = Measure::all()->map(function(Measure $m) { + return $m->withConvertedLevels(); + }); $this->assertEquals($m->toArray(), $response->json()); } @@ -49,7 +51,9 @@ public function testUserCanGetAll() $response->assertOk(); - $m = Measure::all(); + $m = Measure::all()->map(function(Measure $m) { + return $m->withConvertedLevels(); + }); $this->assertEquals($m->toArray(), $response->json()); } @@ -65,34 +69,42 @@ public function testAdminCanUpdateMeasure() $m = Measure::first()->toArray(); - $response = $this->actingAs($user)->putJson(route('api.measures.put', ['id' => $m['id'], + $response = $this->actingAs($user)->putJson(route('api.measures.put', ['id' => $m['id']]), + [ 'name' => 'NAME', 'short_name' => 'SHORT_NAME', - 'level1_actual_label' => 'LEVEL 1 ACTUAL LABEL', - 'level1_preconized_label' => 'LEVEL 1 PRECONIZED LABEL', - 'level1_description' => 1, - 'level1_difficulty' => 2, - 'level1_file' => null, - 'level1_cost' => 3, - 'level1_duration' => 4, - 'level1_assistance' => 5, - 'level2_actual_label' => 'LEVEL 2 ACTUAL LABEL', - 'level2_preconized_label' => 'LEVEL 2 PRECONIZED LABEL', - 'level2_description' => 1, - 'level2_file' => null, - 'level2_difficulty' => 2, - 'level2_cost' => 3, - 'level2_duration' => 4, - 'level2_assistance' => 5, - 'level3_actual_label' => 'LEVEL 3 ACTUAL LABEL', - 'level3_preconized_label' => 'LEVEL 3 PRECONIZED LABEL', - 'level3_description' => 1, - 'level3_file' => null, - 'level3_difficulty' => 2, - 'level3_cost' => 3, - 'level3_duration' => 4, - 'level3_assistance' => 5] - )); + 'levels' => [ + [ + 'actual_label' => 'LEVEL 1 ACTUAL LABEL', + 'preconized_label' => 'LEVEL 1 PRECONIZED LABEL', + 'description' => "test1", + 'difficulty' => 2, + 'cost' => 3, + 'duration' => 4, + 'assistance' => 5, + 'file' => 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII', + ], + [ + 'actual_label' => 'LEVEL 2 ACTUAL LABEL', + 'preconized_label' => 'LEVEL 2 PRECONIZED LABEL', + 'description' => "test2", + 'difficulty' => 2, + 'cost' => 3, + 'duration' => 4, + 'assistance' => 5, + ], + [ + 'actual_label' => 'LEVEL 3 ACTUAL LABEL', + 'preconized_label' => 'LEVEL 3 PRECONIZED LABEL', + 'description' => "test3", + 'difficulty' => 2, + 'cost' => 3, + 'duration' => 4, + 'assistance' => 5, + ], + ] + ] + ); if ($response->exception) { dump($response->exception); @@ -103,18 +115,17 @@ public function testAdminCanUpdateMeasure() $m = Measure::find($m['id']); - $this->assertEquals($m->toArray(), $data); - $this->assertEquals('LEVEL 1 ACTUAL LABEL', $data['level1_actual_label']); + $this->assertEquals('LEVEL 1 ACTUAL LABEL', $data['levels'][0]['actual_label']); $this->assertEquals('LEVEL 1 ACTUAL LABEL', $m->level1_actual_label); - $this->assertEquals('LEVEL 2 ACTUAL LABEL', $data['level2_actual_label']); + $this->assertEquals('LEVEL 2 ACTUAL LABEL', $data['levels'][1]['actual_label']); $this->assertEquals('LEVEL 2 ACTUAL LABEL', $m->level2_actual_label); - $this->assertEquals('LEVEL 3 ACTUAL LABEL', $data['level3_actual_label']); + $this->assertEquals('LEVEL 3 ACTUAL LABEL', $data['levels'][2]['actual_label']); $this->assertEquals('LEVEL 3 ACTUAL LABEL', $m->level3_actual_label); - $this->assertEquals('LEVEL 1 PRECONIZED LABEL', $data['level1_preconized_label']); + $this->assertEquals('LEVEL 1 PRECONIZED LABEL', $data['levels'][0]['preconized_label']); $this->assertEquals('LEVEL 1 PRECONIZED LABEL', $m->level1_preconized_label); - $this->assertEquals('LEVEL 2 PRECONIZED LABEL', $data['level2_preconized_label']); + $this->assertEquals('LEVEL 2 PRECONIZED LABEL', $data['levels'][1]['preconized_label']); $this->assertEquals('LEVEL 2 PRECONIZED LABEL', $m->level2_preconized_label); - $this->assertEquals('LEVEL 3 PRECONIZED LABEL', $data['level3_preconized_label']); + $this->assertEquals('LEVEL 3 PRECONIZED LABEL', $data['levels'][2]['preconized_label']); $this->assertEquals('LEVEL 3 PRECONIZED LABEL', $m->level3_preconized_label); } @@ -141,28 +152,39 @@ public function testAdminCanUploadFileToMeasure() $response = $this->actingAs($user)->putJson(route('api.measures.put', ['id' => $m['id'], 'name' => 'name', 'short_name' => 'SHORT_NAME', - 'level1_actual_label' => 'LEVEL 1 ACTUAL LABEL', - 'level1_preconized_label' => 'LEVEL 1 PRECONIZED LABEL', - 'level1_description' => 1, - 'level1_difficulty' => 2, - 'level1_cost' => 3, - 'level1_duration' => 4, - 'level1_assistance' => 5, - 'level1_file' => 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII', - 'level2_actual_label' => 'LEVEL 2 ACTUAL LABEL', - 'level2_preconized_label' => 'LEVEL 2 PRECONIZED LABEL', - 'level2_description' => 1, - 'level2_difficulty' => 2, - 'level2_cost' => 3, - 'level2_duration' => 4, - 'level2_assistance' => 5, - 'level3_actual_label' => 'LEVEL 3 ACTUAL LABEL', - 'level3_preconized_label' => 'LEVEL 3 PRECONIZED LABEL', - 'level3_description' => 1, - 'level3_difficulty' => 2, - 'level3_cost' => 3, - 'level3_duration' => 4, - 'level3_assistance' => 5] + 'levels' => [ + [ + 'actual_label' => 'LEVEL 1 ACTUAL LABEL', + 'preconized_label' => 'LEVEL 1 PRECONIZED LABEL', + 'description' => "test1", + 'difficulty' => 2, + 'cost' => 3, + 'duration' => 4, + 'assistance' => 5, + 'file' => 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII', + ], + [ + 'actual_label' => 'LEVEL 2 ACTUAL LABEL', + 'preconized_label' => 'LEVEL 2 PRECONIZED LABEL', + 'description' => "test2", + 'difficulty' => 2, + 'cost' => 3, + 'duration' => 4, + 'assistance' => 5, + ], + [ + 'actual_label' => 'LEVEL 3 ACTUAL LABEL', + 'preconized_label' => 'LEVEL 3 PRECONIZED LABEL', + 'description' => "test3", + 'difficulty' => 2, + 'cost' => 3, + 'duration' => 4, + 'assistance' => 5, + ], + ] + + + ] )); if ($response->exception) { @@ -174,7 +196,7 @@ public function testAdminCanUploadFileToMeasure() $m = Measure::find($m['id']); - $this->assertEquals($m->toArray(), $data); + $this->assertEquals($m->withConvertedLevels(), $data); $this->assertTrue(file_exists($fullPath)); @@ -182,18 +204,18 @@ public function testAdminCanUploadFileToMeasure() $this->assertNotNull($file); - $this->assertEquals('/'.$docName, $data['level1_file']); - $this->assertEquals('LEVEL 1 ACTUAL LABEL', $data['level1_actual_label']); + $this->assertEquals('/'.$docName, $data['levels'][0]['file']); + $this->assertEquals('LEVEL 1 ACTUAL LABEL', $data['levels'][0]['actual_label']); $this->assertEquals('LEVEL 1 ACTUAL LABEL', $m->level1_actual_label); - $this->assertEquals('LEVEL 2 ACTUAL LABEL', $data['level2_actual_label']); + $this->assertEquals('LEVEL 2 ACTUAL LABEL', $data['levels'][1]['actual_label']); $this->assertEquals('LEVEL 2 ACTUAL LABEL', $m->level2_actual_label); - $this->assertEquals('LEVEL 3 ACTUAL LABEL', $data['level3_actual_label']); + $this->assertEquals('LEVEL 3 ACTUAL LABEL', $data['levels'][2]['actual_label']); $this->assertEquals('LEVEL 3 ACTUAL LABEL', $m->level3_actual_label); - $this->assertEquals('LEVEL 1 PRECONIZED LABEL', $data['level1_preconized_label']); + $this->assertEquals('LEVEL 1 PRECONIZED LABEL', $data['levels'][0]['preconized_label']); $this->assertEquals('LEVEL 1 PRECONIZED LABEL', $m->level1_preconized_label); - $this->assertEquals('LEVEL 2 PRECONIZED LABEL', $data['level2_preconized_label']); + $this->assertEquals('LEVEL 2 PRECONIZED LABEL', $data['levels'][1]['preconized_label']); $this->assertEquals('LEVEL 2 PRECONIZED LABEL', $m->level2_preconized_label); - $this->assertEquals('LEVEL 3 PRECONIZED LABEL', $data['level3_preconized_label']); + $this->assertEquals('LEVEL 3 PRECONIZED LABEL', $data['levels'][2]['preconized_label']); $this->assertEquals('LEVEL 3 PRECONIZED LABEL', $m->level3_preconized_label); } @@ -212,27 +234,37 @@ public function testNonAdminCannotUpdateMeasure() $response = $this->actingAs($user)->putJson(route('api.measures.put', ['id' => $m['id'], 'name' => 'NAME', 'short_name' => 'SHORT_NAME', - 'level1_actual_label' => 'LEVEL 1 ACTUAL LABEL', - 'level1_preconized_label' => 'LEVEL 1 PRECONIZED LABEL', - 'level1_description' => 1, - 'level1_difficulty' => 2, - 'level1_cost' => 3, - 'level1_duration' => 4, - 'level1_assistance' => 5, - 'level2_actual_label' => 'LEVEL 2 ACTUAL LABEL', - 'level2_preconized_label' => 'LEVEL 2 PRECONIZED LABEL', - 'level2_description' => 1, - 'level2_difficulty' => 2, - 'level2_cost' => 3, - 'level2_duration' => 4, - 'level2_assistance' => 5, - 'level3_actual_label' => 'LEVEL 3 ACTUAL LABEL', - 'level3_preconized_label' => 'LEVEL 3 PRECONIZED LABEL', - 'level3_description' => 1, - 'level3_difficulty' => 2, - 'level3_cost' => 3, - 'level3_duration' => 4, - 'level3_assistance' => 5] + 'levels' => [ + [ + 'actual_label' => 'LEVEL 1 ACTUAL LABEL', + 'preconized_label' => 'LEVEL 1 PRECONIZED LABEL', + 'description' => 1, + 'difficulty' => 2, + 'cost' => 3, + 'duration' => 4, + 'assistance' => 5, + 'file' => 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII', + ], + [ + 'actual_label' => 'LEVEL 2 ACTUAL LABEL', + 'preconized_label' => 'LEVEL 2 PRECONIZED LABEL', + 'description' => 1, + 'difficulty' => 2, + 'cost' => 3, + 'duration' => 4, + 'assistance' => 5, + ], + [ + 'actual_label' => 'LEVEL 3 ACTUAL LABEL', + 'preconized_label' => 'LEVEL 3 PRECONIZED LABEL', + 'description' => 1, + 'difficulty' => 2, + 'cost' => 3, + 'duration' => 4, + 'assistance' => 5, + ], + ] + ] )); $response->assertStatus(403);