2021-03-25 17:59:02 +01:00
< ? php
namespace App\Http\Controllers ;
use App\Http\Requests\CustomerRegisterRequest ;
2021-04-13 13:50:25 +02:00
use App\Http\Requests\UpdateInfosRequest ;
2021-03-25 17:59:02 +01:00
use App\Mail\PasswordResetMail ;
use App\Mail\RegisterConfirmMail ;
use App\Models\Customers ;
use App\Models\PasswordReset ;
use Exception ;
use Illuminate\Http\Request ;
use Illuminate\Support\Facades\Auth ;
use Illuminate\Support\Facades\Mail ;
use Illuminate\Support\Facades\Session ;
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 ( '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 ,
2021-03-26 16:10:56 +01:00
$request -> birth_date ,
2021-03-25 17:59:02 +01:00
isset ( $phone ) ? $phone : null ,
isset ( $address ) ? $address : null ,
null ,
2021-03-26 16:10:56 +01:00
$request -> town ,
$request -> postal_code ,
2021-03-25 17:59:02 +01:00
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 ));
2021-03-26 16:10:56 +01:00
return view ( 'auth.register-success' , [ 'mail' => $request -> email ]);
2021-03-25 17:59:02 +01:00
} 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 ()) {
2021-04-13 13:50:25 +02:00
return redirect () -> route ( 'account.dashboard' );
2021-03-25 17:59:02 +01:00
}
if ( $request -> get ( 'url' )) {
Session :: put ( 'url.intended' , $request -> get ( 'url' ));
Session :: save ();
}
2021-03-26 16:10:56 +01:00
return view ( 'auth.login' );
2021-03-25 17:59:02 +01:00
}
/**
* 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 " ) {
/** @var \Illuminate\Auth\SessionGuard */
$guard = Auth :: guard ( 'customer' );
$guard -> login ( $customer , $remember );
$url = Session :: pull ( 'url.intended' );
Session :: forget ( 'url.intended' );
Session :: save ();
2021-04-13 13:50:25 +02:00
if ( empty ( $url )) {
return redirect () -> route ( 'account.dashboard' );
}
2021-03-25 17:59:02 +01:00
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 " ) {
2021-03-26 16:10:56 +01:00
return view ( 'auth.activate' ) -> with ( 'message' , 'Votre compte a bien été activé, vous pouvez désormais vous connecter.' );
2021-03-25 17:59:02 +01:00
} else {
2021-03-26 16:10:56 +01:00
return view ( 'auth.activate' ) -> with ( 'message' , " Ce lien d'activation n'est pas valide. " );
2021-03-25 17:59:02 +01:00
}
} else {
2021-03-26 16:10:56 +01:00
return view ( 'auth.activate' ) -> with ( 'message' , " Ce lien d'activation n'est pas valide. " );
2021-03-25 17:59:02 +01:00
}
}
public function logout ()
{
if ( Auth :: guard ( 'customer' ) -> check ()) {
Auth :: guard ( 'customer' ) -> logout ();
return redirect () -> route ( 'home' );
}
}
2021-03-26 16:10:56 +01:00
public function forgotPasswordForm ( Request $request )
{
return view ( 'auth.passwords.forgot' );
}
2021-03-25 17:59:02 +01:00
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 );
}
2021-03-26 16:10:56 +01:00
return view ( 'auth.passwords.reset' , compact ( 'customer' )) -> with ( 'token' , $token );
2021-03-25 17:59:02 +01:00
}
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 ();
2021-03-26 16:10:56 +01:00
return view ( 'auth.passwords.reset-ok' , compact ( 'customer' ));
2021-03-25 17:59:02 +01:00
} else {
switch ( $result -> code ) {
case 107 :
return back () -> withErrors ( " Veuillez vérifier que vous avez correctement rempli les champs obligatoires. " );
2021-03-26 16:10:56 +01:00
case 108 :
case 109 :
2021-03-25 17:59:02 +01:00
return back () -> withErrors ( " Changement impossible, compte inexistant. " );
default :
return back () -> withErrors ( " Une erreur est survenue, merci de réessayer ultérieurement. " );
}
}
}
2021-04-13 13:50:25 +02:00
public function dashboard ( Request $request )
{
2021-03-26 16:10:56 +01:00
2021-04-13 13:50:25 +02:00
//show Profile
$customer = Auth :: guard ( 'customer' ) -> user ();
if ( ! $customer ) {
abort ( 404 );
}
2021-03-26 16:10:56 +01:00
2021-04-13 13:50:25 +02:00
/** @var \App\Lib\LDCCRM\ApiV1 */
$crm = app ( 'crmApi' );
$crmCustomer = $crm -> getCustomer ( $customer -> crm_id );
if ( $crmCustomer -> status === " KO " ) {
abort ( 503 );
}
$crmInfos = $crmCustomer -> user ;
$birthDate = explode ( '-' , $crmInfos -> birth_date );
return view ( 'customer.dashboard' , compact ( 'customer' , 'crmInfos' , 'birthDate' ));
}
/**
* Send a request to the CRM to change the given customer ' s informations
* @ param Request $request
*/
public function updateInfos ( UpdateInfosRequest $request )
{
// TODO : Activer le changement d'email quand ce sera possible dans la CRM
/** @var \App\Lib\LDCCRM\ApiV1 */
$crm = app ( 'crmApi' );
$crmCustomer = $crm -> updateCustomer (
Auth :: guard ( 'customer' ) -> user () -> crm_id ,
$request -> firstname ,
$request -> lastname ,
$request -> optin !== null ? 1 : 0 ,
$request -> year . '-' . $request -> month . '-' . $request -> day ,
$request -> phone ,
$request -> address ,
null ,
$request -> city ,
$request -> postcode ,
null
);
if ( $crmCustomer -> status === " KO " ) {
return redirect () -> route ( 'account.dashboard' )
-> withErrors ( __ ( " Une erreur est survenue, merci de réessayer ultérieurement. " ));
}
return redirect () -> route ( 'account.dashboard' )
-> with ( 'success' , __ ( " Vos informations ont bien été enregistrées. " ));
}
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-26 16:10:56 +01:00
// 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.");
// }
// }
// }
2021-03-25 17:59:02 +01:00
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' );
}
}