check()) { return redirect()->route('home'); } return view('front.auth.register'); } /** * Enregistre le customer dans la base de données */ public function register(CustomerRegisterRequest $request) { /** @var \App\Lib\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(Request $request) { if (Auth::guard('customer')->check()) { return redirect()->route('home'); } if ($request->get('url')) { Session::put('url.intended', $request->get('url')); Session::save(); } 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 \App\Lib\LDCCRM\ApiV1 */ $crm = app('crmApi'); $result = $crm->loginCustomer($email, $password); if ($result->status === "OK" || (config('app.debug') && env('NOCRM'))) { /** @var \Illuminate\Auth\SessionGuard */ $guard = Auth::guard('customer'); $guard->login($customer, $remember); $url = Session::pull('url.intended'); Session::forget('url.intended'); Session::save(); return redirect()->to($url); } 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 \App\Lib\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 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; if ($customerExist) { // Suppression des anciens tokens PasswordReset::where('email', $email)->delete(); $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)); return back()->with('success', __("La procédure pour changer votre mot de passe a été envoyé sur votre email.")); } else { return back()->withErrors(__("Cette adresse email n'est pas enregistrée dans nos services.")); } } /** * Print the view used to change the password of a user when he required it * @param $token Token used to identificate the user to change the password of * @return View The view to print */ public function viewChangePassword($token) { $pwdReset = PasswordReset::where('token', $token)->first(); if (!$pwdReset) { abort(419); } $customer = Customers::where('email', $pwdReset->email)->first(); if (!$customer) { abort(404); } return view('front.auth.password-reset', compact('customer'))->with('token', $token); } public function changePassword(Request $request, $token) { $request->validate([ 'password' => 'required|confirmed|min:8|max:255' ]); $password = $request->password; try { $passwordReset = PasswordReset::where('token', $token)->first(); $customer = Customers::where('email', $passwordReset->email)->first(); $crmId = $customer->crm_id; } catch (Exception $e) { return back()->withErrors("Changement du mot de passe impossible, les données envoyés sont incorrectes."); } /** @var \App\Lib\LDCCRM\ApiV1 */ $crm = app('crmApi'); $result = $crm->changePwdCustomer($crmId, $password); if ($result->status === "OK") { $passwordReset->delete(); return view('front.auth.password-reset-ok', compact('customer')); } else { switch ($result->code) { case 107: return back()->withErrors("Veuillez vérifier que vous avez correctement rempli les champs obligatoires."); case 108 || 109: return back()->withErrors("Changement impossible, compte inexistant."); default: return back()->withErrors("Une erreur est survenue, merci de réessayer ultérieurement."); } } } public function changePasswordWhenAuthenticated(Request $request) { $request->validate([ 'password' => 'required|min:8|confirmed|max:255' ]); $crm = app('crmApi'); $customer = $crm->changePwdCustomer(Auth::guard('customer')->user()->crm_id, $request->password); if ($customer->status === "OK") { return back()->with('success', __("Modifications enregistrés !")); } else { return back()->withErrors(__("Une erreur est survenue, merci de réessayer ultérieurement.")); } } public function changeOptin($token) { // TODO : Route et test de la méthode avec nouveau client CRM pour l'opt in die("Attente"); $crmId = Customers::where('hashcode', $token)->first()->crm_id; /** @var \App\Lib\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 setFavoriteRecipe(Recipes $recipe, bool $status) { /** @var Customer */ $customer = Auth::guard('customer')->user(); if ($status) { $customer->recipes()->attach($recipe); } else { $customer->recipes()->detach($recipe); } return response()->json(); } public function setItemInCart(Products $product, bool $status) { /** @var \App\Models\Customer */ $customer = Auth::guard('customer')->user(); if ($status) { $customer->products()->attach($product); } else { $customer->products()->detach($product); } } public function delete($id) { // TODO : Implémenter la suppression lorsque la CRM sera prête pour le faire aussi 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'); } }