ldc-legaulois/app/Http/Controllers/CustomerController.php
2021-03-05 08:37:10 +01:00

354 lines
13 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Http\Requests\CustomerRegisterRequest;
use App\Mail\PasswordResetMail;
use App\Mail\RegisterConfirmMail;
use App\Models\Customers;
use App\Models\PasswordReset;
use App\Models\Products;
use App\Models\Recipes;
use Carbon\Carbon;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Str;
class CustomerController extends Controller
{
/**
* Affiche la page d'inscription
*/
public function registerForm() {
if (Auth::guard('customer')->check()) {
return redirect()->route('home');
}
return view('front.auth.register');
}
// TODO : Opt In et Suppression à faire et tester
/**
* Enregistre le customer dans la base de données
*/
public function register(CustomerRegisterRequest $request)
{
/** @var \LDCCRM\ApiV1 */
$crm = app('crmApi');
$crmCustomer = $crm->createCustomer(
$request->email,
$request->password,
$request->firstname,
$request->lastname,
$request->optin !== null ? 1 : 0,
$birthDate = Carbon::createFromDate(
$request->year,
$request->month,
$request->day
)->format('Y-m-d'),
isset($phone) ? $phone : null,
isset($address) ? $address : null,
null,
$request->city,
$request->postcode,
null
);
if ($crmCustomer->status === "OK") {
$customer = new Customers($request->all());
$customer->crm_id = $crmCustomer->user->crm_id;
$customer->hashcode = $crmCustomer->user->hashcode;
$customer->save();
Mail::to($request->email)->send(new RegisterConfirmMail($customer, $request->firstname));
return view('front.auth.confirm-register');
} else {
switch ($crmCustomer->code) {
case 102:
return back()->withInput()->withErrors(
"Les champs obligatoires n'ont pas été correctement remplis."
);
case 103:
return back()->withInput()->withErrors(
"Un compte est déjà associé à cette adresse email."
);
default:
return back()->withInput()->withErrors(
"Une erreur est survenue lors de l'inscription, merci de réessayer plus tard."
);
}
}
}
/**
* Retourne la page de connexion
*/
public function authenticateForm() {
if (Auth::guard('customer')->check()) {
return redirect()->route('home');
}
return view('front.auth.login');
}
/**
* Gère l'authentification des customers
*/
public function authenticate(Request $request) {
$request->validate([
'email' => 'required|email:rfc',
'password' => 'required',
]);
$email = filter_var($request->email, FILTER_SANITIZE_EMAIL);
$password = $request->password;
$remember = $request->remember !== null ? true : false;
/** @var Customers */
$customer = Customers::where('email', $email)->first();
if ($customer) {
/** @var \LDCCRM\ApiV1 */
$crm = app('crmApi');
$result = $crm->loginCustomer($email, $password);
if ($result->status === "OK") {
/** @var \Illuminate\Auth\SessionGuard */
$guard = Auth::guard('customer');
$guard->login($customer, $remember);
return redirect()->intended(route('club.index'));
} else {
switch ($result->code) {
case 115:
return back()->withErrors("Veuillez vérifier que vous avez correctement rempli les champs obligatoires.");
case 116:
Mail::to($email)->send(new RegisterConfirmMail($customer, null));
return back()->withErrors("Votre compte n'est pas activé, vérifier dans vos emails pour y trouver le mail de confirmation. Un lien d'activation vous a été renvoyer.");
case 117 || 118 || 119:
return back()->withErrors("Email ou mot de passe incorrect.");
default:
return back()->withErrors("Une erreur est survenue, merci de réessayer ultérieurement.");
}
}
} else {
return back()->withErrors("Email ou mot de passe incorrect.");
}
}
/**
* Active le compte d'un customer
*/
public function activate($hashcode) {
$hashcode = filter_var($hashcode, FILTER_SANITIZE_STRING);
$customer = Customers::select('crm_id')->where('hashcode', $hashcode)->first();
if ($customer) {
/** @var \LDCCRM\ApiV1 */
$crm = app('crmApi');
$result = $crm->activateCustomer($customer->crm_id);
if ($result->status === "OK") {
return view('front.auth.activate')->with('message', 'Votre compte a bien été activé, vous pouvez désormais vous connecter.');
} else {
return view('front.auth.activate')->with('message', "Ce lien d'activation n'est pas valide.");
}
} else {
return view('front.auth.activate')->with('message', "Ce lien d'activation n'est pas valide.");
}
}
public function logout() {
if (Auth::guard('customer')->check()) {
Auth::guard('customer')->logout();
return redirect()->route('home');
}
}
public function update(Request $request) {
// TODO : A tester avec pages Mes Informations
$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.");
}
/** @var \LDCCRM\ApiV1 */
$crm = app('crmApi');
$result = $crm->updateCustomer($customer->crm_id, $firstname, $lastname, $optin, $birthDate, $phone, $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:rfc|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.");
}
/** @var \LDCCRM\ApiV1 */
$crm = app('crmApi');
$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;
/** @var \LDCCRM\ApiV1 */
$crm = app('crmApi');
$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(Request $request) {
$recipe = Recipes::findOrFail($request->id);
$customer = Auth::guard('customer')->user();
$customer->recipes()->detach($recipe);;
}
public function addToCart($productId) {
$product = Products::findOrFail($productId);
$customer = Customers::findOrFail(Auth::guard('customer')->user()->id);
$customer->products()->attach($product);
}
public function removeFromCart(Request $request) {
$product = Products::findOrFail($request->id);
$customer = Auth::guard('customer')->user();
$customer->products()->detach($product);
}
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');
}
}