2020-12-10 12:13:33 +01:00
< ? php
namespace App\Http\Controllers ;
2021-03-05 08:17:35 +01:00
use App\Http\Requests\CustomerRegisterRequest ;
2020-12-10 12:13:33 +01:00
use App\Mail\PasswordResetMail ;
2021-02-15 10:57:43 +01:00
use App\Mail\RegisterConfirmMail ;
2020-12-10 12:13:33 +01:00
use App\Models\Customers ;
use App\Models\PasswordReset ;
use App\Models\Products ;
use App\Models\Recipes ;
2021-02-15 10:57:43 +01:00
use Carbon\Carbon ;
2020-12-10 12:13:33 +01:00
use Exception ;
use Illuminate\Http\Request ;
use Illuminate\Support\Facades\Auth ;
use Illuminate\Support\Facades\Mail ;
2021-03-08 11:24:20 +01:00
use Illuminate\Support\Facades\Session ;
2020-12-10 12:13:33 +01:00
use Illuminate\Support\Str ;
class CustomerController extends Controller
{
2021-02-09 11:45:26 +01:00
/**
* Affiche la page d ' inscription
*/
2021-03-05 15:55:22 +01:00
public function registerForm ()
{
2021-02-09 11:45:26 +01:00
if ( Auth :: guard ( 'customer' ) -> check ()) {
return redirect () -> route ( 'home' );
}
return view ( 'front.auth.register' );
}
/**
* Enregistre le customer dans la base de données
*/
2021-03-05 08:17:35 +01:00
public function register ( CustomerRegisterRequest $request )
2021-03-05 15:55:22 +01:00
{
2021-03-05 15:43:56 +01:00
/** @var \App\Lib\LDCCRM\ApiV1 */
2021-03-02 15:46:24 +01:00
$crm = app ( 'crmApi' );
2021-03-05 08:17:35 +01:00
$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
);
2020-12-10 12:13:33 +01:00
if ( $crmCustomer -> status === " OK " ) {
2021-03-05 08:17:35 +01:00
$customer = new Customers ( $request -> all ());
2020-12-10 12:13:33 +01:00
$customer -> crm_id = $crmCustomer -> user -> crm_id ;
$customer -> hashcode = $crmCustomer -> user -> hashcode ;
$customer -> save ();
2021-03-05 08:17:35 +01:00
Mail :: to ( $request -> email ) -> send ( new RegisterConfirmMail ( $customer , $request -> firstname ));
2021-02-15 10:57:43 +01:00
return view ( 'front.auth.confirm-register' );
2020-12-10 12:13:33 +01:00
} else {
switch ( $crmCustomer -> code ) {
case 102 :
2021-03-05 08:17:35 +01:00
return back () -> withInput () -> withErrors (
" Les champs obligatoires n'ont pas été correctement remplis. "
);
2020-12-10 12:13:33 +01:00
case 103 :
2021-03-05 08:17:35 +01:00
return back () -> withInput () -> withErrors (
" Un compte est déjà associé à cette adresse email. "
);
2020-12-10 12:13:33 +01:00
default :
2021-03-05 08:17:35 +01:00
return back () -> withInput () -> withErrors (
" Une erreur est survenue lors de l'inscription, merci de réessayer plus tard. "
);
2020-12-10 12:13:33 +01:00
}
}
}
2021-02-09 11:45:26 +01:00
/**
* Retourne la page de connexion
*/
2021-03-08 17:53:35 +01:00
public function authenticateForm ( Request $request )
2021-03-05 15:55:22 +01:00
{
2020-12-10 12:13:33 +01:00
if ( Auth :: guard ( 'customer' ) -> check ()) {
return redirect () -> route ( 'home' );
}
2021-03-08 17:53:35 +01:00
if ( $request -> get ( 'url' )) {
Session :: put ( 'url.intended' , $request -> get ( 'url' ));
Session :: save ();
}
2020-12-10 12:13:33 +01:00
return view ( 'front.auth.login' );
}
2021-02-09 11:45:26 +01:00
/**
* Gère l ' authentification des customers
*/
2021-03-05 15:55:22 +01:00
public function authenticate ( Request $request )
{
2020-12-10 12:13:33 +01:00
$request -> validate ([
2021-03-04 16:38:00 +01:00
'email' => 'required|email:rfc' ,
2020-12-10 12:13:33 +01:00
'password' => 'required' ,
]);
$email = filter_var ( $request -> email , FILTER_SANITIZE_EMAIL );
$password = $request -> password ;
$remember = $request -> remember !== null ? true : false ;
2021-03-02 15:46:24 +01:00
/** @var Customers */
2020-12-10 12:13:33 +01:00
$customer = Customers :: where ( 'email' , $email ) -> first ();
if ( $customer ) {
2021-03-05 15:43:56 +01:00
/** @var \App\Lib\LDCCRM\ApiV1 */
2021-03-02 15:46:24 +01:00
$crm = app ( 'crmApi' );
2020-12-10 12:13:33 +01:00
$result = $crm -> loginCustomer ( $email , $password );
2021-03-20 08:36:08 +01:00
if ( $result -> status === " OK " || ( config ( 'app.debug' ) && env ( 'NOCRM' ))) {
2021-03-02 15:46:24 +01:00
/** @var \Illuminate\Auth\SessionGuard */
$guard = Auth :: guard ( 'customer' );
$guard -> login ( $customer , $remember );
2021-03-08 11:24:20 +01:00
$url = Session :: pull ( 'url.intended' );
Session :: forget ( 'url.intended' );
Session :: save ();
return redirect () -> to ( $url );
2020-12-10 12:13:33 +01:00
} else {
switch ( $result -> code ) {
case 115 :
2021-03-21 22:51:19 +01:00
return back ()
-> withErrors ( __ ( 'Veuillez vérifier que vous avez correctement rempli les champs obligatoires.' ));
2020-12-10 12:13:33 +01:00
case 116 :
2021-03-04 09:41:41 +01:00
Mail :: to ( $email ) -> send ( new RegisterConfirmMail ( $customer , null ));
2021-03-21 22:51:19 +01:00
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é renvoyé.' ));
2021-02-09 11:45:26 +01:00
case 117 || 118 || 119 :
2020-12-10 12:13:33 +01:00
return back () -> withErrors ( " Email ou mot de passe incorrect. " );
default :
return back () -> withErrors ( " Une erreur est survenue, merci de réessayer ultérieurement. " );
}
}
} else {
2021-02-09 11:45:26 +01:00
return back () -> withErrors ( " Email ou mot de passe incorrect. " );
2020-12-10 12:13:33 +01:00
}
}
2021-02-09 11:45:26 +01:00
/**
* Active le compte d ' un customer
*/
2021-03-05 15:55:22 +01:00
public function activate ( $hashcode )
{
2021-02-15 10:57:43 +01:00
$hashcode = filter_var ( $hashcode , FILTER_SANITIZE_STRING );
2020-12-10 12:13:33 +01:00
$customer = Customers :: select ( 'crm_id' ) -> where ( 'hashcode' , $hashcode ) -> first ();
if ( $customer ) {
2021-03-05 15:43:56 +01:00
/** @var \App\Lib\LDCCRM\ApiV1 */
2021-03-02 15:46:24 +01:00
$crm = app ( 'crmApi' );
2020-12-10 12:13:33 +01:00
$result = $crm -> activateCustomer ( $customer -> crm_id );
if ( $result -> status === " OK " ) {
2021-02-15 10:57:43 +01:00
return view ( 'front.auth.activate' ) -> with ( 'message' , 'Votre compte a bien été activé, vous pouvez désormais vous connecter.' );
2020-12-10 12:13:33 +01:00
} else {
2021-02-15 10:57:43 +01:00
return view ( 'front.auth.activate' ) -> with ( 'message' , " Ce lien d'activation n'est pas valide. " );
2020-12-10 12:13:33 +01:00
}
} else {
2021-02-15 10:57:43 +01:00
return view ( 'front.auth.activate' ) -> with ( 'message' , " Ce lien d'activation n'est pas valide. " );
2020-12-10 12:13:33 +01:00
}
}
2021-03-05 15:55:22 +01:00
public function logout ()
{
2020-12-10 12:13:33 +01:00
if ( Auth :: guard ( 'customer' ) -> check ()) {
Auth :: guard ( 'customer' ) -> logout ();
return redirect () -> route ( 'home' );
}
}
2021-03-05 15:55:22 +01:00
public function passwordReset ( Request $request )
{
2020-12-10 12:13:33 +01:00
$request -> validate ([
2021-03-04 16:38:00 +01:00
'email' => 'required|email:rfc|max:255' ,
2020-12-10 12:13:33 +01:00
]);
$email = filter_var ( $request -> email , FILTER_SANITIZE_EMAIL );
$customerExist = Customers :: where ( 'email' , $email ) -> count () === 0 ? false : true ;
if ( $customerExist ) {
2021-03-08 11:35:20 +01:00
// Suppression des anciens tokens
PasswordReset :: where ( 'email' , $email ) -> delete ();
2020-12-10 12:13:33 +01:00
$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 ));
2021-03-08 11:35:20 +01:00
return back () -> with ( 'success' , __ ( " La procédure pour changer votre mot de passe a été envoyé sur votre email. " ));
2020-12-10 12:13:33 +01:00
} else {
2021-03-08 11:35:20 +01:00
return back () -> withErrors ( __ ( " Cette adresse email n'est pas enregistrée dans nos services. " ));
}
}
2020-12-10 12:13:33 +01:00
2021-03-08 11:35:20 +01:00
/**
* 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 ) {
2021-03-08 12:00:46 +01:00
abort ( 419 );
2020-12-10 12:13:33 +01:00
}
2021-03-08 11:35:20 +01:00
$customer = Customers :: where ( 'email' , $pwdReset -> email ) -> first ();
if ( ! $customer ) {
2021-03-08 12:00:46 +01:00
abort ( 404 );
2021-03-08 11:35:20 +01:00
}
return view ( 'front.auth.password-reset' , compact ( 'customer' )) -> with ( 'token' , $token );
2020-12-10 12:13:33 +01:00
}
2021-03-05 15:55:22 +01:00
public function changePassword ( Request $request , $token )
{
2020-12-10 12:13:33 +01:00
$request -> validate ([
'password' => 'required|confirmed|min:8|max:255'
]);
$password = $request -> password ;
try {
$passwordReset = PasswordReset :: where ( 'token' , $token ) -> first ();
2021-03-08 11:35:20 +01:00
$customer = Customers :: where ( 'email' , $passwordReset -> email ) -> first ();
$crmId = $customer -> crm_id ;
2020-12-10 12:13:33 +01:00
} catch ( Exception $e ) {
return back () -> withErrors ( " Changement du mot de passe impossible, les données envoyés sont incorrectes. " );
}
2021-03-05 15:43:56 +01:00
/** @var \App\Lib\LDCCRM\ApiV1 */
2021-03-02 15:46:24 +01:00
$crm = app ( 'crmApi' );
2020-12-10 12:13:33 +01:00
$result = $crm -> changePwdCustomer ( $crmId , $password );
if ( $result -> status === " OK " ) {
$passwordReset -> delete ();
2021-03-08 11:35:20 +01:00
return view ( 'front.auth.password-reset-ok' , compact ( 'customer' ));
2020-12-10 12:13:33 +01:00
} else {
switch ( $result -> code ) {
case 107 :
2021-03-21 22:51:19 +01:00
return back ()
-> withErrors ( " Veuillez vérifier que vous avez correctement rempli les champs obligatoires. " );
2020-12-10 12:13:33 +01:00
case 108 || 109 :
2021-03-21 22:51:19 +01:00
return back ()
-> withErrors ( " Changement impossible, compte inexistant. " );
2020-12-10 12:13:33 +01:00
default :
2021-03-21 22:51:19 +01:00
return back ()
-> withErrors ( " Une erreur est survenue, merci de réessayer ultérieurement. " );
2020-12-10 12:13:33 +01:00
}
}
}
2021-03-05 15:55:22 +01:00
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. " ));
}
}
2021-03-09 10:47:23 +01:00
public function changeOptin ( $token )
2021-03-05 15:55:22 +01:00
{
2021-03-09 10:47:23 +01:00
// TODO : Route et test de la méthode avec nouveau client CRM pour l'opt in
2020-12-10 12:13:33 +01:00
die ( " Attente " );
2021-03-09 10:47:23 +01:00
$crmId = Customers :: where ( 'hashcode' , $token ) -> first () -> crm_id ;
2020-12-10 12:13:33 +01:00
2021-03-05 15:43:56 +01:00
/** @var \App\Lib\LDCCRM\ApiV1 */
2021-03-02 15:46:24 +01:00
$crm = app ( 'crmApi' );
2020-12-10 12:13:33 +01:00
$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. " );
}
}
}
2021-03-05 09:53:08 +01:00
public function setFavoriteRecipe ( Recipes $recipe , bool $status )
2021-03-05 15:55:22 +01:00
{
2021-03-05 09:53:08 +01:00
/** @var Customer */
2021-02-24 16:04:53 +01:00
$customer = Auth :: guard ( 'customer' ) -> user ();
2021-03-05 09:53:08 +01:00
if ( $status ) {
$customer -> recipes () -> attach ( $recipe );
} else {
$customer -> recipes () -> detach ( $recipe );
}
return response () -> json ();
2020-12-10 12:13:33 +01:00
}
2021-03-05 12:47:02 +01:00
public function setItemInCart ( Products $product , bool $status )
2021-03-05 15:55:22 +01:00
{
2021-03-05 12:47:02 +01:00
/** @var \App\Models\Customer */
2021-02-24 16:04:53 +01:00
$customer = Auth :: guard ( 'customer' ) -> user ();
2021-03-08 15:56:47 +01:00
if ( $status ) {
2021-03-05 12:47:02 +01:00
$customer -> products () -> attach ( $product );
} else {
$customer -> products () -> detach ( $product );
}
2020-12-10 12:13:33 +01:00
}
2021-03-05 15:55:22 +01:00
public function delete ( $id )
{
2021-03-09 10:47:23 +01:00
// TODO : Implémenter la suppression lorsque la CRM sera prête pour le faire aussi
2020-12-10 12:13:33 +01:00
die ( 'Not implemented yet' );
// Suppression d'un compte client
$customer = Customers :: findOrFail ( $id );
$customer -> recipes () -> delete ();
$customer -> products () -> delete ();
$customer -> answers () -> delete ();
// TODO : Suppression via la CRM
2021-03-20 14:38:15 +01:00
if ( Auth :: guard ( 'customer' ) -> user () -> id === $customer -> id ) {
2020-12-10 12:13:33 +01:00
Auth :: guard ( 'customer' ) -> logout ();
2021-03-20 14:38:15 +01:00
}
2020-12-10 12:13:33 +01:00
$customer -> delete ();
return redirect () -> route ( 'home' );
}
}