- Add V1 Client

- Add StatusResource for responses
- Add OK & KO responses
- Update composer.json for dependencies
- Rename deleteUser to delete
This commit is contained in:
Vincent BRIDIER 2020-12-02 19:16:22 +01:00
parent b670f4d106
commit 87ab7fd6a3
5 changed files with 203 additions and 52 deletions

View file

@ -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.']);
}
}

View file

@ -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,
]
];
}
}

114
clients/LDCCRM_V1.php Normal file
View file

@ -0,0 +1,114 @@
<?php
namespace LDCCRM;
class ApiV1
{
private $endpoint;
private $api_key;
public function __construct($endpoint, $api_key)
{
$this->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);
}
}

View file

@ -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",

View file

@ -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']);