358 lines
15 KiB
PHP
358 lines
15 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Mail\PasswordResetMail;
|
|
use App\Models\Customers;
|
|
use App\Models\PasswordReset;
|
|
use App\Models\Products;
|
|
use App\Models\Recipes;
|
|
use Exception;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Facades\Mail;
|
|
use LDCCRM\ApiV1;
|
|
use Illuminate\Support\Str;
|
|
|
|
class CustomerController extends Controller
|
|
{
|
|
// TODO : Opt In et Suppression à faire et tester
|
|
public function store(Request $request) {
|
|
$request->validate([
|
|
'email' => 'required|email|max:255',
|
|
'username' => 'required|string|max:255|unique:customers,username',
|
|
'firstname' => 'required|string|max:255',
|
|
'lastname' => 'required|string|max:255',
|
|
'birth_date' => 'required',
|
|
'address' => 'string|max:255',
|
|
'phone' => 'max:255',
|
|
'country' => 'required|string|max:255',
|
|
'city' => 'required|string|max:255',
|
|
'postcode' => 'required',
|
|
'password' => 'required|confirmed|min:8|max:255',
|
|
]);
|
|
|
|
$email = filter_var($request->email, FILTER_SANITIZE_EMAIL);
|
|
$username = filter_var($request->username, FILTER_SANITIZE_STRING);
|
|
$firstname = filter_var($request->firstname, FILTER_SANITIZE_STRING);
|
|
$lastname = filter_var($request->lastname, FILTER_SANITIZE_STRING);
|
|
$birthDate = $request->birth_date;
|
|
if ($request->address !== null)
|
|
$address = filter_var($request->address, FILTER_SANITIZE_STRING);
|
|
if ($request->phone !== null)
|
|
$phone = filter_var($request->phone, FILTER_SANITIZE_STRING);
|
|
$country = filter_var($request->country,FILTER_SANITIZE_STRING);
|
|
$city = filter_var($request->city, FILTER_SANITIZE_STRING);
|
|
$postcode = filter_var($request->postcode, FILTER_SANITIZE_STRING);
|
|
$password = $request->password;
|
|
$optin = $request->optin !== null ? 1 : 0;
|
|
|
|
$crm = new ApiV1(config('crm.CRM_ENDPOINT'), config('crm.CRM_API_TOKEN'));
|
|
$crmCustomer = $crm->createCustomer($email, $password, $firstname, $lastname, $optin, $birthDate, isset($phone) ? $phone : null, isset($address) ? $address : null, null, $city, $postcode, $country);
|
|
|
|
if ($crmCustomer->status === "OK") {
|
|
$customer = new Customers();
|
|
$customer->crm_id = $crmCustomer->user->crm_id;
|
|
$customer->hashcode = $crmCustomer->user->hashcode;
|
|
$customer->email = $email;
|
|
$customer->username = $username;
|
|
$customer->save();
|
|
|
|
// TODO : Return sur la page d'inscription OK
|
|
dd("OK !");
|
|
} else {
|
|
// TODO : Retour correct, enlevé les dd
|
|
switch ($crmCustomer->code) {
|
|
case 102:
|
|
dd("KO 102");
|
|
return back()->withErrors("Les champs obligatoires n'ont pas été correctement remplis.");
|
|
case 103:
|
|
dd("KO 103");
|
|
return back()->withErrors("Un compte est déjà associé à cette adresse email.");
|
|
default:
|
|
dd("KO default");
|
|
return back()->withErrors("Une erreur est survenue lors de l'inscription, merci de réessayer plus tard.");
|
|
}
|
|
}
|
|
}
|
|
|
|
public function authenticateForm() {
|
|
if (Auth::guard('customer')->check()) {
|
|
return redirect()->route('home');
|
|
}
|
|
return view('front.auth.login');
|
|
}
|
|
|
|
public function authenticate(Request $request) {
|
|
$request->validate([
|
|
'email' => 'required|email',
|
|
'password' => 'required',
|
|
]);
|
|
|
|
// TODO : Retour correct
|
|
$email = filter_var($request->email, FILTER_SANITIZE_EMAIL);
|
|
$password = $request->password;
|
|
$remember = $request->remember !== null ? true : false;
|
|
|
|
$customer = Customers::where('email', $email)->first();
|
|
if ($customer) {
|
|
$crm = new ApiV1(config('crm.CRM_ENDPOINT'), config('crm.CRM_API_TOKEN'));
|
|
$result = $crm->loginCustomer($email, $password);
|
|
if ($result->status === "OK") {
|
|
dd("OK");
|
|
Auth::guard('customer')->login($customer);
|
|
return redirect()->route('club.index');
|
|
} else {
|
|
switch ($result->code) {
|
|
case 115:
|
|
dd("KO 115");
|
|
return back()->withErrors("Veuillez vérifier que vous avez correctement rempli les champs obligatoires.");
|
|
case 116:
|
|
dd("KO 116");
|
|
return back()->withErrors("Votre compte n'est pas activé, vérifier dans vos emails pour y trouver le mail de confirmation.");
|
|
case 117:
|
|
dd("KO 117");
|
|
return back()->withErrors("Email ou mot de passe incorrect.");
|
|
case 118 || 119:
|
|
dd("KO 118 ou 119");
|
|
return back()->withErrors("Connexion impossible, ce compte n'existe pas.");
|
|
default:
|
|
dd("KO default");
|
|
return back()->withErrors("Une erreur est survenue, merci de réessayer ultérieurement.");
|
|
}
|
|
}
|
|
} else {
|
|
return back()->withErrors("Connexion impossible, ce compte n'existe pas.");
|
|
}
|
|
}
|
|
|
|
public function activate(Request $request) {
|
|
// TODO : Retour sur les bonnes pages
|
|
$hashcode = filter_var($request->hashcode, FILTER_SANITIZE_STRING);
|
|
$customer = Customers::select('crm_id')->where('hashcode', $hashcode)->first();
|
|
if ($customer) {
|
|
$crm = new ApiV1(config('crm.CRM_ENDPOINT'), config('crm.CRM_API_TOKEN'));
|
|
$result = $crm->activateCustomer($customer->crm_id);
|
|
if ($result->status === "OK") {
|
|
dd("OK");
|
|
return back()->with('success', 'Votre compte a bien été activé, vous pouvez désormais vous connecter.');
|
|
} else {
|
|
switch ($result->code) {
|
|
case 110:
|
|
dd("KO 110");
|
|
return back()->withErrors("Votre compte est déjà activé, vous pouvez vous connecter.");
|
|
case 111 || 112:
|
|
dd("KO 111 ou 112");
|
|
return back()->withErrors("Activation impossible, compte inexistant.");
|
|
default:
|
|
dd("KO default");
|
|
return back()->withErrors("Une erreur est survenue, merci de réessayer ultérieurement.");
|
|
}
|
|
}
|
|
} else {
|
|
dd("KO sur le hashcode local");
|
|
return back()->withErrors("Le lien de confirmation est invalide.");
|
|
}
|
|
}
|
|
|
|
public function logout() {
|
|
if (Auth::guard('customer')->check()) {
|
|
Auth::guard('customer')->logout();
|
|
return redirect()->route('home');
|
|
}
|
|
}
|
|
|
|
public function update(Request $request) {
|
|
// TODO : A tester
|
|
$request->validate([
|
|
'username' => 'required|string|max:255|unique:customers,username',
|
|
'firstname' => 'required|string|max:255',
|
|
'lastname' => 'required|string|max:255',
|
|
'birth_date' => 'required',
|
|
'address' => 'string|max:255',
|
|
'phone' => 'max:255',
|
|
'country' => 'required|string|max:255',
|
|
'city' => 'required|string|max:255',
|
|
'postcode' => 'required',
|
|
]);
|
|
|
|
$username = filter_var($request->username, FILTER_SANITIZE_STRING);
|
|
$firstname = filter_var($request->firstname, FILTER_SANITIZE_STRING);
|
|
$lastname = filter_var($request->lastname, FILTER_SANITIZE_STRING);
|
|
$birthDate = $request->birth_date;
|
|
if ($request->address !== null)
|
|
$address = filter_var($request->address, FILTER_SANITIZE_STRING);
|
|
if ($request->phone !== null)
|
|
$phone = filter_var($request->phone, FILTER_SANITIZE_STRING);
|
|
$country = filter_var($request->country,FILTER_SANITIZE_STRING);
|
|
$city = filter_var($request->city, FILTER_SANITIZE_STRING);
|
|
$postcode = filter_var($request->postcode, FILTER_SANITIZE_STRING);
|
|
$optin = $request->optin !== null ? 1 : 0;
|
|
|
|
$customer = Customers::where('email', Auth::guard('customer')->user()->email)->first();
|
|
|
|
if (!$customer) {
|
|
return back()->withErrors("Une erreur est survenue, merci de réessayer.");
|
|
}
|
|
|
|
$crm = new ApiV1(config('crm.CRM_ENDPOINT'), config('crm.CRM_API_TOKEN'));
|
|
$result = $crm->updateCustomer($customer->crm_id, $firstname, $lastname, $optin, $birthDate, null, $address, null, $city, $postcode, $country);
|
|
|
|
if ($result->status === "OK") {
|
|
$customer->username = $username;
|
|
$customer->save();
|
|
return back()->with('success', 'Modifications enregistrés !');
|
|
} else {
|
|
// TODO : Retour correct
|
|
switch ($result->code) {
|
|
case 104:
|
|
dd("KO 104");
|
|
return back()->withErrors("Veuillez vérifier que vous avez correctement rempli les champs obligatoires.");
|
|
case 105:
|
|
dd("KO 105");
|
|
return back()->withErrors("Une erreur est survenue, merci de réessayer.");
|
|
default:
|
|
dd("KO default");
|
|
return back()->withErrors("Une erreur est survenue, merci de réessayer ultérieurement.");
|
|
}
|
|
}
|
|
}
|
|
|
|
public function passwordReset(Request $request) {
|
|
$request->validate([
|
|
'email' => 'required|email|max:255',
|
|
]);
|
|
|
|
$email = filter_var($request->email, FILTER_SANITIZE_EMAIL);
|
|
|
|
$customerExist = Customers::where('email', $email)->count() === 0 ? false : true;
|
|
|
|
// TODO : Enlever les dd de test
|
|
if ($customerExist) {
|
|
$token = Str::random(80);
|
|
|
|
$passwordReset = new PasswordReset();
|
|
$passwordReset->email = $email;
|
|
$passwordReset->token = $token;
|
|
$passwordReset->created_at = now();
|
|
$passwordReset->save();
|
|
|
|
Mail::to($email)->send(new PasswordResetMail($token));
|
|
|
|
dd("OK");
|
|
return back()->with('success', 'Un email de réinitialisation a bien été envoyé sur votre adresse email.');
|
|
} else {
|
|
|
|
dd("KO");
|
|
return back()->withErrors("Cette adresse email n'est pas enregistrée dans nos services.");
|
|
}
|
|
}
|
|
|
|
public function changePassword(Request $request, $token) {
|
|
// TODO : Faire la méthode qui appel la vue qui redirige ici une fois les infos rentrée
|
|
$request->validate([
|
|
'password' => 'required|confirmed|min:8|max:255'
|
|
]);
|
|
|
|
$password = $request->password;
|
|
|
|
try {
|
|
$passwordReset = PasswordReset::where('token', $token)->first();
|
|
$crmId = Customers::where('email', $passwordReset->email)->first()->crm_id;
|
|
} catch (Exception $e) {
|
|
dd("KO pas de données");
|
|
return back()->withErrors("Changement du mot de passe impossible, les données envoyés sont incorrectes.");
|
|
}
|
|
$crm = new ApiV1(config('crm.CRM_ENDPOINT'), config('crm.CRM_API_TOKEN'));
|
|
$result = $crm->changePwdCustomer($crmId, $password);
|
|
// TODO : Retourner les bonnes vues au lieu des dd
|
|
if ($result->status === "OK") {
|
|
$passwordReset->delete();
|
|
dd("OK !");
|
|
} else {
|
|
switch ($result->code) {
|
|
case 107:
|
|
dd("KO 107");
|
|
return back()->withErrors("Veuillez vérifier que vous avez correctement rempli les champs obligatoires.");
|
|
case 108 || 109:
|
|
dd("KO 108 ou 109");
|
|
return back()->withErrors("Changement impossible, compte inexistant.");
|
|
default:
|
|
dd("KO default");
|
|
return back()->withErrors("Une erreur est survenue, merci de réessayer ultérieurement.");
|
|
}
|
|
}
|
|
}
|
|
|
|
public function changeOptin() {
|
|
// TODO : Récupération de l'utilisateur par le système d'Auth et tester la méthode, enlever les dd
|
|
die("Attente");
|
|
$crmId = Auth::guard('customer')->user()->crm_id;
|
|
|
|
$crm = new ApiV1(config('crm.CRM_ENDPOINT'), config('crm.CRM_API_TOKEN'));
|
|
$result = $crm->toggleOptInCustomer($crmId);
|
|
if ($result->status === "OK") {
|
|
dd("OK");
|
|
return back()->with('success', 'Modification enregistrée !');
|
|
} else {
|
|
switch ($result->code) {
|
|
case 113 || 114:
|
|
dd("KO 113 ou 114");
|
|
return back()->withErrors("Mise à jour impossible, compte inexistant.");
|
|
default:
|
|
dd("KO default");
|
|
return back()->withErrors("Une erreur est survenue, merci de réessayer ultérieurement.");
|
|
}
|
|
}
|
|
}
|
|
|
|
public function addFavoriteRecipe($recipeId) {
|
|
$recipe = Recipes::findOrFail($recipeId);
|
|
$customer = Customers::findOrFail(Auth::guard('customer')->user()->id);
|
|
$customer->recipes()->attach($recipe);
|
|
|
|
return back()->with('success', 'Recette ajoutée à vos recettes favorites.');
|
|
}
|
|
|
|
public function removeFavoriteRecipe($recipeId) {
|
|
$recipe = Recipes::findOrFail($recipeId);
|
|
$customer = Customers::findOrFail(Auth::guard('customer')->user()->id);
|
|
$customer->recipes()->detach($recipe);
|
|
|
|
return back()->with('success', 'Recette retirée de vos recettes favorites.');
|
|
}
|
|
|
|
public function addToCart($productId) {
|
|
$product = Products::findOrFail($productId);
|
|
$customer = Customers::findOrFail(Auth::guard('customer')->user()->id);
|
|
$customer->products()->attach($product);
|
|
|
|
return back()->with('success', 'Produit ajouté à votre liste de course.');
|
|
}
|
|
|
|
public function removeFromCart($productId) {
|
|
$product = Products::findOrFail($productId);
|
|
$customer = Customers::findOrFail(Auth::guard('customer')->user()->id);
|
|
$customer->products()->detach($product);
|
|
|
|
return back()->with('success', 'Produit retiré de votre liste de course.');
|
|
}
|
|
|
|
public function delete($id) {
|
|
die('Not implemented yet');
|
|
// Suppression d'un compte client
|
|
$customer = Customers::findOrFail($id);
|
|
$customer->recipes()->delete();
|
|
$customer->products()->delete();
|
|
$customer->answers()->delete();
|
|
$customer->forums()->delete();
|
|
|
|
// TODO : Suppression via la CRM
|
|
|
|
if (Auth::guard('customer')->user()->id === $customer->id)
|
|
Auth::guard('customer')->logout();
|
|
$customer->delete();
|
|
|
|
return redirect()->route('home');
|
|
}
|
|
}
|