diff --git a/app/Http/Controllers/Api/v1/CustomerController.php b/app/Http/Controllers/Api/v1/CustomerController.php index 643ff3f..9c92b76 100644 --- a/app/Http/Controllers/Api/v1/CustomerController.php +++ b/app/Http/Controllers/Api/v1/CustomerController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers\Api\v1; use App\Http\Controllers\Controller; use App\Http\Resources\CustomerResource; +use App\Http\Resources\StatusResource; use App\Models\Customer; use App\Models\CustomerInfos; use App\Models\CustomerLogin; @@ -11,6 +12,7 @@ use App\Models\CustomerOptInHistory; use App\Models\SingleOptin; use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; +use Illuminate\Support\Facades\Validator; use Illuminate\Support\Str; class CustomerController extends Controller @@ -20,11 +22,11 @@ class CustomerController extends Controller /** * Store a newly created resource in storage * @param Request $request - * @return CustomerResource|\Illuminate\Http\JsonResponse + * @return CustomerResource|StatusResource */ public function store(Request $request) { - $request->validate([ + $validator = Validator::make($request->all(), [ 'email' => 'required|email', 'password' => 'required', 'firstname' => 'required', @@ -33,6 +35,9 @@ class CustomerController extends Controller 'birth_date' => 'date_format:Y-m-d' ]); + if ($validator->fails()) + return new StatusResource(['status' => 'KO', 'code' => 102, 'message' => 'Error on required fields.', 'errors' => $validator->errors()]); + $brandId = $request->brand_id; $email = filter_var($request->email, FILTER_SANITIZE_EMAIL); $firstname = filter_var($request->firstname, FILTER_SANITIZE_STRING); @@ -55,7 +60,7 @@ class CustomerController extends Controller // Récupère les infos s'ils existent déjà $customerInfos = CustomerInfos::where([['customer_id', $customer->id], ['brand_id', $brandId]])->first(); if ($customerInfos) - die("L'utilisateur est déjà inscrit sur ce site"); + return new StatusResource(['status' => 'KO', 'code' => 103, 'message' => 'User already registered on this site.']); } $customerInfos = new CustomerInfos(); @@ -101,16 +106,14 @@ class CustomerController extends Controller * Display the specified resource. * * @param int $id - * @return CustomerResource + * @return CustomerResource | StatusResource */ public function show(Request $request, $id) { $brandId = $request->brand_id; $customer = Customer::find($id); - if (!$customer){ - echo json_encode(['message'=>'Not found']); - exit; - } + if (!$customer) + return new StatusResource(['status' => 'KO', 'code' => 101, 'message' => 'User not found.']); return new CustomerResource($customer, $brandId); } @@ -119,22 +122,25 @@ class CustomerController extends Controller * * @param \Illuminate\Http\Request $request * @param int $id - * @return CustomerResource + * @return CustomerResource|StatusResource */ public function update(Request $request, $id) { - $request->validate([ + $validator = Validator::make($request->all(), [ 'firstname' => 'required', 'lastname' => 'required', 'opt_in' => 'required', 'birth_date' => 'date_format:Y-m-d' ]); + if ($validator->fails()) + return new StatusResource(['status' => 'KO', 'code' => 104, 'message' => 'Error on required fields.', 'errors' => $validator->errors()]); + $brandId = $request->brand_id; $customer = Customer::find($id); if (!$customer) - die("Cet utilisateur n'existe pas"); + return new StatusResource(['status' => 'KO', 'code' => 105, 'message' => 'User not found.']); $firstname = filter_var($request->firstname, FILTER_SANITIZE_STRING); $lastname = filter_var($request->lastname, FILTER_SANITIZE_STRING); @@ -172,14 +178,17 @@ class CustomerController extends Controller /** * Authenticate the user * @param Request $request - * @return CustomerResource + * @return CustomerResource|StatusResource */ public function authenticate(Request $request) { - $request->validate([ + $validator = Validator::make($request->all(), [ 'email' => 'required|email', 'password' => 'required', ]); + if ($validator->fails()) + return new StatusResource(['status' => 'KO', 'code' => 115, 'message' => 'Error on required fields.', 'errors' => $validator->errors()]); + $brandId = $request->brand_id; $email = filter_var($request->email, FILTER_SANITIZE_EMAIL); $password = trim($request->password); @@ -188,20 +197,24 @@ class CustomerController extends Controller $login = $customer->logins()->where('brand_id', $brandId)->first(); if ($login) { if ($login->status === 0) { - die("Le compte de l'utilisateur n'est pas activé"); + // "Le compte de l'utilisateur n'est pas activé" + return new StatusResource(['status' => 'KO', 'code' => 116, 'message' => 'Account not activated.']); } else { if (Hash::check($password, $login->password)) { $login->last_connection = now(); $customer->logins()->save($login); return new CustomerResource($customer, $brandId); } - die("Mot de passe incorrect"); + // "Mot de passe incorrect" + return new StatusResource(['status' => 'KO', 'code' => 117, 'message' => 'Authentication failed.']); } } else { - die("Ce compte n'est pas enregistré pour cette marque"); + // "Ce compte n'est pas enregistré pour cette marque" + return new StatusResource(['status' => 'KO', 'code' => 118, 'message' => 'User not found.']); } } else { - die ("Ce compte n'existe pas dans la CRM"); + // "Ce compte n'existe pas dans la CRM" + return new StatusResource(['status' => 'KO', 'code' => 119, 'message' => 'User not found.']); } } @@ -211,10 +224,13 @@ class CustomerController extends Controller * @param $id */ public function changePassword(Request $request, $id) { - $request->validate([ + $validator = Validator::make($request->all(), [ 'password' => 'required', ]); + if ($validator->fails()) + return new StatusResource(['status' => 'KO', 'code' => 107, 'message' => 'Error on required fields.', 'errors' => $validator->errors()]); + $brandId = $request->brand_id; $customer = Customer::find($id); $password = trim($request->password); @@ -225,13 +241,14 @@ class CustomerController extends Controller $customerLogin->password = Hash::make($password); $customerLogin->save(); } else { - die("Ce compte n'est pas enregistré pour cette marque"); + // "Ce compte n'est pas enregistré pour cette marque" + return new StatusResource(['status' => 'KO', 'code' => 108, 'message' => 'User not found.']); } } else { - die("Ce compte n'existe pas"); + // "Ce compte n'existe pas" + return new StatusResource(['status' => 'KO', 'code' => 109, 'message' => 'User not found.']); } - - die("Le mot de passe a bien été changé"); + return new StatusResource(['status' => 'OK', 'message' => 'Update complete.']); } /** @@ -249,22 +266,28 @@ class CustomerController extends Controller if ($login->status === 0) { $login->status = 1; $login->save(); - die("Le compte a bien été activé"); + // "Le compte a bien été activé" + return new StatusResource(['status' => 'OK', 'message' => 'Update complete.']); } else { - die("Ce compte est déjà activé"); + // "Ce compte est déjà activé" + return new StatusResource(['status' => 'KO', 'code' => 110, 'message' => 'User already active.']); } } else { - die("Ce compte n'est pas enregistré pour cette marque"); + // "Ce compte n'est pas enregistré pour cette marque" + return new StatusResource(['status' => 'KO', 'code' => 111, 'message' => 'User not found.']); } } else { - die("Cet utilisateur n'existe pas dans la CRM"); + // "Cet utilisateur n'existe pas dans la CRM" + return new StatusResource(['status' => 'KO', 'code' => 112, 'message' => 'User not found.']); } } /** * Delete the user account for the brand + * @param Request $request + * @param $id */ - public function deleteUser(Request $request, $id) { + public function delete(Request $request, $id) { die("Not implemented yet"); // TODO : A voir pour les stats, obuton dans le bo qui permet de faire les stats sur les customer puis supprimer // TODO : Gestion avec mesBR @@ -278,12 +301,14 @@ class CustomerController extends Controller if (count($customer->infos) === 0 && count($customer->logins) === 0) { $customer->optInHistory()->delete(); $customer->delete(); - die("Suppression du compte de la CRM terminée"); + // Suppression du compte de la CRM terminée + return new StatusResource(['status' => 'OK', 'message' => 'Deletion complete.']); } else { - die("Suppression des informations du compte pour la marque terminée"); + // Suppression des informations du compte pour la marque terminée + return new StatusResource(['status' => 'OK', 'message' => 'Deletion complete.']); } } else { - die("Cet utilisateur n'existe pas dans la CRM"); + return new StatusResource(['status' => 'KO', 'code' => 106, 'message' => 'User not found.']); } } @@ -310,19 +335,26 @@ class CustomerController extends Controller $optinHistory->save(); $infos->save(); - die("Changement effectué"); + // "Changement effectué" + return new StatusResource(['status' => 'OK', 'message' => 'Update complete.']); } else { - die("Ce compte n'a pas d'information liés à cette marque"); + // "Ce compte n'a pas d'information liés à cette marque" + return new StatusResource(['status' => 'KO', 'code' => 113, 'message' => 'User not found.']); } } else { - die("Cet utilisateur n'existe pas dans la CRM"); + // "Cet utilisateur n'existe pas dans la CRM" + return new StatusResource(['status' => 'KO', 'code' => 114, 'message' => 'User not found.']); } } public function addSingleOptin(Request $request) { - $request->validate([ + $validator = Validator::make($request->all(), [ 'email' => 'required|email', ]); + + if ($validator->fails()) + return new StatusResource(['status' => 'KO', 'code' => 120, 'message' => 'Error on required fields.', 'errors' => $validator->errors()]); + $brandId = $request->brand_id; $email = filter_var($request->email, FILTER_SANITIZE_EMAIL); @@ -334,9 +366,9 @@ class CustomerController extends Controller $singleOptin->brand_id = $brandId; $singleOptin->save(); } else { - die("Cet utilisateur est déjà inscrit à la newsletter pour cette marque"); + // "Cet utilisateur est déjà inscrit à la newsletter pour cette marque" + return new StatusResource(['status' => 'KO', 'code' => 121, 'message' => 'This user is already subscribed to the newsletter for this brand.']); } - - die("Optin ajoutée"); + return new StatusResource(['status' => 'OK' , 'message' => 'Optin added.']); } } diff --git a/app/Http/Resources/CustomerResource.php b/app/Http/Resources/CustomerResource.php index 8e8b051..2539016 100644 --- a/app/Http/Resources/CustomerResource.php +++ b/app/Http/Resources/CustomerResource.php @@ -24,19 +24,22 @@ class CustomerResource extends JsonResource $infos = $this->infos()->where('brand_id', $this->brandId)->first(); $login = $this->logins()->where('brand_id', $this->brandId)->first(); return [ - 'crm_id' => $this->id, - 'firstname' => $infos->firstname, - 'lastname' => $infos->lastname, - 'birth_date' => $infos->birth_date, - 'address' => $infos->address, - 'address2' => $infos->address2, - 'phone' => $infos->phone, - 'country' => $infos->country, - 'city' => $infos->city, - 'postcode' => $infos->postcode, - 'opt_in' => $infos->opt_in, - 'hashcode' => $infos->hashcode, - 'status' => $login->status, + 'status' => 'OK', + 'user' => [ + 'crm_id' => $this->id, + 'firstname' => $infos->firstname, + 'lastname' => $infos->lastname, + 'birth_date' => $infos->birth_date, + 'address' => $infos->address, + 'address2' => $infos->address2, + 'phone' => $infos->phone, + 'country' => $infos->country, + 'city' => $infos->city, + 'postcode' => $infos->postcode, + 'opt_in' => $infos->opt_in, + 'hashcode' => $infos->hashcode, + 'status' => $login->status, + ] ]; } } diff --git a/clients/LDCCRM_V1.php b/clients/LDCCRM_V1.php new file mode 100644 index 0000000..3007ef4 --- /dev/null +++ b/clients/LDCCRM_V1.php @@ -0,0 +1,114 @@ +endpoint = $endpoint; + $this->api_key = $api_key; + } + + public function getCustomer($id){ + return $this->callAPI('GET', "/customer/$id"); + } + + public function createCustomer($email, $password, $firstname, $lastname, $optin, $birthdate = null, $phone = null, $address = null, $address2 = null, $city = null, $postcode = null, $country = null){ + $user = [ + 'email' => $email, + 'password' => $password, + 'firstname' => $firstname, + 'lastname' => $lastname, + 'opt_in' => $optin, + 'birth_date' => $birthdate, + 'phone' => $phone, + 'address' => $address, + 'address2' => $address2, + 'city' => $city, + 'postcode' => $postcode, + 'country' => $country + ]; + return $this->callAPI('POST', '/customer/create', $user); + } + + public function updateCustomer($crmId, $firstname, $lastname, $optin, $birthdate = null, $phone = null, $address = null, $address2 = null, $city = null, $postcode = null, $country = null){ + $user = [ + 'firstname' => $firstname, + 'lastname' => $lastname, + 'opt_in' => $optin, + 'birth_date' => $birthdate, + 'phone' => $phone, + 'address' => $address, + 'address2' => $address2, + 'city' => $city, + 'postcode' => $postcode, + 'country' => $country + ]; + return $this->callAPI('PUT', "/customer/$crmId", $user); + } + + public function deleteCustomer($id){ + return $this->callAPI('DELETE', "/customer/$id"); + } + + public function changePwdCustomer($id, $password){ + return $this->callAPI('POST', "/customer/$id/change-password", ['password' => $password]); + } + + public function activateCustomer($id){ + return $this->callAPI('POST', "/customer/$id/activate"); + } + + public function toggleOptInCustomer($id){ + return $this->callAPI('POST', "/customer/$id/toggle-optin"); + } + + public function loginCustomer($email, $password){ + return $this->callAPI('POST', "/customer/login", ['email' => $email, 'password' => $password]); + } + + public function createSingleOptin($email){ + return $this->callAPI('POST', '/single-optin', ['email' => $email]); + } + + private function callAPI($method, $url, $data = false){ + $url = $this->endpoint . '/api/v1' . $url; + $curl = curl_init(); + switch ($method){ + case "POST": + curl_setopt($curl, CURLOPT_POST, 1); + if ($data) + curl_setopt($curl, CURLOPT_POSTFIELDS, $data); + break; + case "PUT": + curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT"); + if ($data) + curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data)); + break; + case "DELETE": + curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "DELETE"); + if ($data) + curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data)); + break; + default: + if ($data) + $url = sprintf("%s?%s", $url, http_build_query($data)); + } + curl_setopt($curl, CURLOPT_URL, $url); + curl_setopt($curl, CURLOPT_COOKIESESSION, TRUE); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curl, CURLOPT_HTTPHEADER, array( + 'Accept: application/json', + 'Authorization: Bearer ' . $this->api_key + )); + + $result = curl_exec($curl); + if(!$result){die("Connection Failure");} + curl_close($curl); + return json_decode($result); + } +} diff --git a/composer.json b/composer.json index 9d06962..7b033cb 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,9 @@ "fruitcake/laravel-cors": "^2.0", "guzzlehttp/guzzle": "^7.0.1", "laravel/framework": "^8.12", - "laravel/tinker": "^2.5" + "laravel/tinker": "^2.5", + "ext-curl": "*", + "ext-json": "*" }, "require-dev": { "facade/ignition": "^2.5", diff --git a/routes/api.php b/routes/api.php index ea5869a..f7281a3 100644 --- a/routes/api.php +++ b/routes/api.php @@ -19,7 +19,7 @@ Route::prefix('v1')->middleware(['auth:api', 'check-brand'])->group(function() { Route::get('/customer/{id}', [CustomerController::class, 'show']); Route::post('/customer/create', [CustomerController::class, 'store']); Route::put('/customer/{id}', [CustomerController::class, 'update']); - Route::delete('/customer/{id}', [CustomerController::class, 'deleteUser']); + Route::delete('/customer/{id}', [CustomerController::class, 'delete']); Route::post('/customer/{id}/change-password', [CustomerController::class, 'changePassword']); Route::post('/customer/{id}/activate', [CustomerController::class, 'activateAccount']); Route::post('/customer/{id}/toggle-optin', [CustomerController::class, 'toggleOptin']);