2021-02-12 12:46:28 +01:00
< ? php
namespace App\Http\Controllers\Auth ;
use App\Http\Controllers\Controller ;
2021-03-19 12:52:00 +01:00
use App\Mail\VerifyEmail ;
use App\Mail\PasswordReset ;
use App\Models\User ;
use Illuminate\Http\Request ;
2021-03-11 12:31:18 +01:00
use Illuminate\Support\Facades\Auth ;
2021-02-12 12:46:28 +01:00
use Illuminate\Foundation\Auth\AuthenticatesUsers ;
2021-03-19 12:52:00 +01:00
use Illuminate\Support\Facades\Mail ;
use Illuminate\Support\Str ;
2021-03-22 10:51:23 +01:00
use Illuminate\Support\Facades\Hash ;
2021-02-12 12:46:28 +01:00
class LoginController extends Controller
{
/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen . The controller uses a trait
| to conveniently provide its functionality to your applications .
|
*/
use AuthenticatesUsers ;
2021-03-19 12:52:00 +01:00
private $apiCrm ;
2021-02-12 12:46:28 +01:00
/**
* Where to redirect users after login .
*
* @ var string
*/
2021-03-11 12:31:18 +01:00
public function redirectTo () {
$role = Auth :: user () -> role ;
switch ( $role ) {
2021-03-19 12:52:00 +01:00
case '1' :
case '2' :
return '/bo' ;
case '3' :
return '/pro' ;
default :
return '/home' ;
2021-03-11 12:31:18 +01:00
}
}
2021-02-12 12:46:28 +01:00
/**
* Create a new controller instance .
*
* @ return void
*/
public function __construct ()
{
$this -> middleware ( 'guest' ) -> except ( 'logout' );
2021-03-19 12:52:00 +01:00
$this -> apiCrm = new \LDCCRM\ApiV1 ( config ( 'crm.endpoint' ), config ( 'crm.token' ));
}
public function authenticate ( Request $request )
{
$request -> validate ([
'email' => 'required|email' ,
'password' => 'required' ,
]);
2021-03-22 10:51:23 +01:00
$email = filter_var ( $request -> email , FILTER_SANITIZE_EMAIL );
$password = $request -> password ;
$remember = $request -> remember !== null ? true : false ;
2021-03-19 12:52:00 +01:00
$userLocal = User :: where ( 'email' , $email ) -> first ();
if ( $userLocal ) {
if ( $userLocal -> email_verified === 1 ) {
2021-03-22 10:51:23 +01:00
if ( $userLocal -> role !== 1 && $userLocal -> role !== 2 ) {
2021-03-19 12:52:00 +01:00
$connect = $this -> apiCrm -> loginCustomer ( $email , $password );
if ( $connect -> status === 'OK' ) {
/** @var \Illuminate\Auth\SessionGuard */
$guard = Auth :: guard ( 'web' );
$guard -> login ( $userLocal , $remember );
$url = $this -> redirectTo ();
return redirect () -> to ( $url );
} else {
if ( $connect -> code === 500 ) {
return back () -> withInput ( $request -> except ( " password " ))
-> withErrors ( " La connexion est impossible pour le moment, veuillez réessayer plus tard. " );
} else {
return back () -> withInput ( $request -> except ( " password " ))
-> withErrors ( " Email ou mot de passe incorrect. " );
}
}
}
} else {
$userLocal -> email_verify_token = Str :: uuid ();
$userLocal -> save ();
Mail :: to ( $email ) -> send ( new VerifyEmail ( $userLocal ));
return back () -> withInput ( $request -> except ( " password " ))
-> withErrors ( " Votre compte existe mais votre email n'est pas confirmé, merci de vérifier vos emails. " );
}
} else {
//création d'un compte local car il existe en crm
$connect = $this -> apiCrm -> loginCustomer ( $email , $password );
if ( $connect -> status === 'OK' ) {
$userLocal = User :: create ([
'crm_id' => $connect -> user -> crm_id ,
'firstname' => $connect -> user -> firstname ,
'lastname' => $connect -> user -> lastname ,
'birth_date' => $connect -> user -> birth_date ,
'email' => $email ,
'password' => Hash :: make ( " MOTDEPASSE " ), // Quelle infamie!!!
'address' => $connect -> user -> address ,
'address2' => $connect -> user -> address2 ,
'town' => $connect -> user -> city ,
'postal_code' => $connect -> user -> postcode ,
'country' => $connect -> user -> country ,
'email_verified' => 1
]);
} else {
if ( $connect -> code === 116 ) { // Compte existant mais non activé
$userLocal = User :: create ([
'crm_id' => $connect -> user -> crm_id ,
'firstname' => $connect -> user -> firstname ,
'lastname' => $connect -> user -> lastname ,
'birth_date' => $connect -> user -> birth_date ,
'email' => $email ,
'password' => Hash :: make ( " MOTDEPASSE " ), // Quelle infamie!!!
'address' => $connect -> user -> address ,
'address2' => $connect -> user -> address2 ,
'town' => $connect -> user -> city ,
'postal_code' => $connect -> user -> postcode ,
'country' => $connect -> user -> country
]);
$userLocal -> email_verify_token = Str :: uuid ();
$userLocal -> save ();
Mail :: to ( $email ) -> send ( new VerifyEmail ( $userLocal ));
return back () -> withInput ( $request -> except ( " password " ))
-> withErrors ( " Votre compte existe mais votre email n'est pas confirmé, merci de vérifier vos emails. " );
} elseif ( $connect -> code === 500 ) {
return back () -> withInput ( $request -> except ( " password " ))
-> withErrors ( " La connexion est impossible pour le moment, veuillez réessayer plus tard. " );
2021-03-22 10:51:23 +01:00
} else {
2021-03-19 12:52:00 +01:00
return back () -> withInput ( $request -> except ( " password " ))
-> withErrors ( " Email ou mot de passe incorrect. " );
}
}
}
2021-03-22 10:51:23 +01:00
if ( $userLocal -> role === 1 || $userLocal -> role === 2 ) {
2021-03-19 12:52:00 +01:00
if ( Auth :: attempt ([ " email " => $email , " password " => $password ], $remember )) {
return redirect () -> route ( 'bo.dashboard' );
} else {
return back () -> withInput ( $request -> except ( 'password' )) -> withErrors ( 'Les identifiants entrés sont incorrects.' );
}
}
}
2021-03-22 10:51:23 +01:00
public function confirmEmail ( $verifyToken )
{
2021-03-19 12:52:00 +01:00
$result = false ;
$user = User :: where ( 'email_verify_token' , $verifyToken ) -> first ();
if ( ! $user ) {
return view ( 'front.confirm-email' , compact ( 'result' ));
}
$activation = $this -> apiCrm -> activateCustomer ( $user -> crm_id );
2021-03-22 10:51:23 +01:00
if ( $activation -> status === 'OK' ) {
$user -> email_verified = 1 ;
$user -> email_verify_token = null ;
2021-03-19 12:52:00 +01:00
$user -> save ();
$result = true ;
2021-03-22 10:51:23 +01:00
} else {
if ( $activation -> code === 110 ) { // User already active
$user -> email_verified = 1 ;
$user -> email_verify_token = null ;
2021-03-19 12:52:00 +01:00
$user -> save ();
$result = true ;
}
}
return view ( 'front.confirm-email' , compact ( 'result' ));
}
2021-03-22 10:51:23 +01:00
public function forgotPassword ( Request $request )
{
2021-03-19 12:52:00 +01:00
if ( $request -> tokenValid && $request -> token ) {
$tokenValid = $request -> tokenValid ;
$token = $request -> token ;
return view ( 'front.forgot-password' , compact ( 'tokenValid' , 'token' ));
}
return view ( 'front.forgot-password' );
}
2021-03-22 10:51:23 +01:00
public function forgotPasswordReset ( Request $request , $token )
{
if ( ! $request -> hasValidSignature ( false )) {
2021-03-19 12:52:00 +01:00
return redirect () -> route ( 'login' ) -> withErrors ( " Le lien de changement de votre mot de passe n'est plus valide, veuillez réessayer. " );
2021-03-22 10:51:23 +01:00
}
2021-03-19 12:52:00 +01:00
$tokenValid = false ;
$user = User :: where ( 'password_token' , $token ) -> first ();
2021-03-22 10:51:23 +01:00
if ( ! $user ) {
2021-03-19 12:52:00 +01:00
return redirect () -> route ( 'forgot-password' , compact ( 'tokenValid' )) -> withErrors ( 'Le lien de changement du mot de passe est incorrect.' );
2021-03-22 10:51:23 +01:00
}
2021-03-19 12:52:00 +01:00
$tokenValid = true ;
return redirect () -> route ( 'forgot-password' , compact ( 'tokenValid' , 'token' ));
}
2021-03-22 10:51:23 +01:00
public function mailPassword ( Request $request )
{
2021-03-19 12:52:00 +01:00
$email = filter_var ( $request -> email , FILTER_SANITIZE_STRING );
$user = User :: where ( 'email' , $email ) -> first ();
if ( ! $user ) {
$userCrm = $this -> apiCrm -> getCustomerByEmail ( $email );
2021-03-22 10:51:23 +01:00
if ( $userCrm -> status === 'OK' ) {
2021-03-19 12:52:00 +01:00
$user = User :: create ([
'crm_id' => $userCrm -> user -> crm_id ,
'firstname' => $userCrm -> user -> firstname ,
'lastname' => $userCrm -> user -> lastname ,
'birth_date' => $userCrm -> user -> birth_date ,
'email' => $email ,
'password' => Hash :: make ( " MOTDEPASSE " ), // TODO : ???
'address' => $userCrm -> user -> address ,
'address2' => $userCrm -> user -> address2 ,
'town' => $userCrm -> user -> city ,
'postal_code' => $userCrm -> user -> postcode ,
'country' => $userCrm -> user -> country ,
'email_verified' => 1
]);
if ( $userCrm -> user -> status === 0 ){
$user -> email_verified = 0 ;
$user -> email_verify_token = Str :: uuid ();
$user -> save ();
Mail :: to ( $email ) -> send ( new VerifyEmail ( $user ));
return back () -> withInput ( $request -> except ( " password " )) -> withErrors ( " Votre compte existe mais votre email n'est pas confirmé, merci de vérifier vos emails. " );
}
} else {
if ( $userCrm -> code === 101 ) {
return back () -> withInput ( $request -> only ( 'email' )) -> withErrors ( " Le mail que vous avez entré n'est pas enregistré dans nos services. " );
} else {
return back () -> withErrors ( " Une erreur est survenue, veuillez réessayer plus tard. " );
}
}
}
$user -> password_token = Str :: uuid ();
$user -> save ();
Mail :: to ( $email ) -> send ( new PasswordReset ( $user ));
return redirect () -> route ( 'login' ) -> with ( 'success' , 'Un mail de réinitialisation de votre mot de passe vous a été envoyé(e).' );
}
public function changePassword ( Request $request ) {
$request -> validate ([
'password' => 'required|min:8|confirmed' ,
]);
$user = User :: where ( 'password_token' , filter_var ( $request -> token , FILTER_SANITIZE_STRING )) -> first ();
if ( ! $user )
return back () -> withErrors ( 'Le lien de changement de votre mot de passe est incorrect, veuillez réessayer.' );
// TODO : Ajouter controle du contenu du mot de passe
$newPassword = $request -> password ;
$update = $this -> apiCrm -> changePwdCustomer ( $user -> crm_id , $newPassword );
if ( $update -> status === 'OK' ){
return redirect () -> route ( 'login' ) -> with ( 'success' , 'Vous pouvez désormais vous connecter avec votre nouveau mot de passe.' );
} else {
return back () -> withErrors ( " Une erreur est survenue, veuillez réessayer plus tard. " );
}
2021-02-12 12:46:28 +01:00
}
}