diff --git a/.gitignore b/.gitignore index 978c867..df42b85 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,5 @@ Homestead.yaml /resources/views/vendor /storage/api-docs /public/swagger-ui-assets +public/insurances-subscriptions-docs composer.lock diff --git a/app/Http/Controllers/ImageController.php b/app/Http/Controllers/ImageController.php new file mode 100644 index 0000000..df82dbd --- /dev/null +++ b/app/Http/Controllers/ImageController.php @@ -0,0 +1,27 @@ +json(['message' => 'Image not found.'], 404); + } + + $file = File::get($path); + $type = File::mimeType($path); + + $response = Response::make($file, 200); + $response->header("Content-Type", $type); + + return $response; + } +} diff --git a/app/Http/Controllers/InsuranceController.php b/app/Http/Controllers/InsuranceController.php index ac9a0db..10efc3a 100644 --- a/app/Http/Controllers/InsuranceController.php +++ b/app/Http/Controllers/InsuranceController.php @@ -14,6 +14,7 @@ use App\Models\NhNetworksConfig; use App\Traits\Helper; use Illuminate\Database\Eloquent\Collection; use Illuminate\Http\Request; +use Illuminate\Http\UploadedFile; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Event; use Illuminate\Support\Facades\Log; @@ -339,6 +340,12 @@ class InsuranceController extends Controller if (!isset($networkConfig) || $networkConfig->configWallet->type != 'ilink_sante') return $this->errorResponse(trans('errors.nano_health_not_activated')); + // Verification de l'age du beneficiaire + $insuredAge = date_diff(date_create($identification->birthdate), date_create('now'))->y; + if ($insuredAge < $networkConfig->age_limit_of_insured_and_spouse) { + return $this->errorResponse(trans('errors.minimal_age_required')); + } + $networkConfig = NhNetworksConfig::where('network_id', $request->input('network_id'))->first(); if (sizeof($request->input('beneficiaries')) > $networkConfig->max_number_of_beneficiaries) return $this->errorResponse(trans('errors.number_of_beneficiaries_exceeded')); @@ -389,6 +396,55 @@ class InsuranceController extends Controller } + /** + * @OA\Post( + * path="/insurances/upload-images", + * summary="Uploader les images de l'assurance", + * tags={"Assurances"}, + * security={{"api_key":{}}}, + * @OA\RequestBody( + * description="Corps de la requete", + * required=true, + * @OA\MediaType( + * mediaType="multipart/form-data", + * @OA\Schema( + * @OA\Property( + * property="files[]", + * description = "Liste des documents à uploader", + * type="array", + * @OA\Items(type="string", format="binary") + * ) + * ), + * ) + * ), + * @OA\Response( + * response=200, + * description="OK", + * @OA\JsonContent( + * ref="#/components/schemas/ApiResponse", + * example = {"status":200,"response":"Transaction réussie","error":null} + * ) + * ) + * ) + */ + public function uploadImages(Request $request) + { + $this->validate($request, [ + 'files' => 'required', + 'files.*' => 'mimes:jpeg,png,jpg,jpeg|max:6144' + ]); + + $files = []; + if ($request->hasfile('files')) { + foreach ($request->file('files') as $file) { + $filename = $this->uploadImage($file, 'NH', 'insurances-subscriptions-docs'); + array_push($files, $filename); + } + } + + return $this->successResponse($files); + } + private function generateSubscriptionID(): string { do { diff --git a/app/Traits/Helper.php b/app/Traits/Helper.php index e4d351a..68125a1 100644 --- a/app/Traits/Helper.php +++ b/app/Traits/Helper.php @@ -7,6 +7,7 @@ namespace App\Traits; use App\Models\Country; use Brick\Money\Context\AutoContext; use Brick\Money\Money; +use Illuminate\Http\UploadedFile; use Illuminate\Support\Facades\DB; trait Helper @@ -49,4 +50,54 @@ trait Helper $encrypted_password_to_check = base64_encode(sha1($password . $salt, true) . $salt); return $encrypted_password_to_check == $encrypted_password; } + + public function uploadImage(UploadedFile $file, $imageCode, $folderName) + { + $original_filename = $file->getClientOriginalName(); + $original_filename_arr = explode('.', $original_filename); + $file_ext = end($original_filename_arr); + $image = $imageCode . '-' . time() . '.' . $file_ext; + + //Check if the directory already exists. + $directoryName = './' . $folderName; + if (!is_dir($directoryName)) { + //Directory does not exist, so lets create it. + mkdir($directoryName, 0755); + } + + $compressedImage = $this->compressImage($file, './' . $folderName . '/' . $image, 70); + if ($compressedImage) { + return $image; + } else { + return $this->errorResponse(trans('errors.compression_failed')); + } + } + + private function compressImage($source, $destination, $quality) + { + // Get image info + $imgInfo = getimagesize($source); + $mime = $imgInfo['mime']; + + // Create a new image from file + switch ($mime) { + case 'image/jpeg': + $image = imagecreatefromjpeg($source); + break; + case 'image/png': + $image = imagecreatefrompng($source); + break; + case 'image/gif': + $image = imagecreatefromgif($source); + break; + default: + $image = imagecreatefromjpeg($source); + } + + // Save image + imagejpeg($image, $destination, $quality); + + // Return compressed image + return $destination; + } } diff --git a/composer.json b/composer.json index a9c4b2b..9d2a810 100644 --- a/composer.json +++ b/composer.json @@ -11,7 +11,8 @@ "guzzlehttp/guzzle": "^7.3", "kitloong/laravel-migrations-generator": "^5.0", "laravel/lumen-framework": "^8.0", - "ext-json": "*" + "ext-json": "*", + "ext-gd": "*" }, "require-dev": { "fakerphp/faker": "^1.9.1", diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json new file mode 100644 index 0000000..c9ef47e --- /dev/null +++ b/node_modules/.package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "nanoSanteService", + "lockfileVersion": 2, + "requires": true, + "packages": {} +} diff --git a/resources/lang/en/errors.php b/resources/lang/en/errors.php index 7576d8c..7a1e086 100755 --- a/resources/lang/en/errors.php +++ b/resources/lang/en/errors.php @@ -25,4 +25,5 @@ return [ 'nano_health_not_activated' => "Nano health is not activated for this network", 'number_of_beneficiaries_exceeded' => 'The number of beneficiaries is greater than the authorized limit', 'incorrect_selected_amount' => 'The amount selected is incorrect', + 'minimal_age_required' => "You do not have the minimum age required to subscribe to this insurance" ]; diff --git a/resources/lang/fr/errors.php b/resources/lang/fr/errors.php index 3e31d6b..b25cb3a 100755 --- a/resources/lang/fr/errors.php +++ b/resources/lang/fr/errors.php @@ -25,4 +25,5 @@ return [ 'nano_health_not_activated' => "Le nano santé n'est pas activé pour ce réseau", 'number_of_beneficiaries_exceeded' => "Le nombre d'ayant droit est superieur à la limite autorisée", 'incorrect_selected_amount' => 'Le montant choisi est incorrect', + 'minimal_age_required' => "Vous n'avez pas l'âge minimum requis pour souscrire à cette assurance" ]; diff --git a/routes/web.php b/routes/web.php index f42471f..69f15dc 100644 --- a/routes/web.php +++ b/routes/web.php @@ -18,5 +18,6 @@ $router->group(['prefix' => '', 'middleware' => 'auth'], function () use ($route $router->get('countries/{countryId}', 'InsuranceController@getInsurancesByCountryId'); $router->post('bonus-amount', 'InsuranceController@calculateBonusAmount'); $router->post('subscribe', 'InsuranceController@subscribe'); + $router->post('upload-images', 'InsuranceController@uploadImages'); }); });