2020-12-10 12:13:33 +01:00
< ? php
namespace App\Http\Controllers ;
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 ;
use Illuminate\Support\Str ;
class CustomerController extends Controller
{
2021-02-09 11:45:26 +01:00
/**
* Affiche la page d ' inscription
*/
public function registerForm () {
if ( Auth :: guard ( 'customer' ) -> check ()) {
return redirect () -> route ( 'home' );
}
return view ( 'front.auth.register' );
}
2020-12-10 12:13:33 +01:00
// TODO : Opt In et Suppression à faire et tester
2021-02-09 11:45:26 +01:00
/**
* Enregistre le customer dans la base de données
*/
public function register ( Request $request ) {
2020-12-10 12:13:33 +01:00
$request -> validate ([
2021-03-04 16:38:00 +01:00
'email' => 'required|email:rfc,dns,spoof|max:255' ,
2020-12-10 12:13:33 +01:00
'username' => 'required|string|max:255|unique:customers,username' ,
'firstname' => 'required|string|max:255' ,
'lastname' => 'required|string|max:255' ,
2021-02-15 10:57:43 +01:00
'day' => 'required|alpha_num|gt:0|lt:32' ,
'month' => 'required|alpha_num|gt:0|lt:13' ,
'year' => 'required|alpha_num|gt:' . ( date ( 'Y' ) - 101 ) . '|lt:' . ( date ( 'Y' ) + 1 ),
'address' => 'max:255' ,
2020-12-10 12:13:33 +01:00
'phone' => 'max:255' ,
'city' => 'required|string|max:255' ,
'postcode' => 'required' ,
'password' => 'required|confirmed|min:8|max:255' ,
]);
$email = filter_var ( $request -> email , FILTER_SANITIZE_EMAIL );
$username = filter_var ( $request -> username , FILTER_SANITIZE_STRING );
$firstname = filter_var ( $request -> firstname , FILTER_SANITIZE_STRING );
$lastname = filter_var ( $request -> lastname , FILTER_SANITIZE_STRING );
2021-02-15 10:57:43 +01:00
$day = filter_var ( $request -> day , FILTER_SANITIZE_NUMBER_INT );
$month = filter_var ( $request -> month , FILTER_SANITIZE_NUMBER_INT );
$year = filter_var ( $request -> year , FILTER_SANITIZE_NUMBER_INT );
$birthDate = Carbon :: createFromDate ( $year , $month , $day );
if ( $birthDate -> format ( 'dmY' ) !== $day . $month . $year || $birthDate > Carbon :: now ())
return back () -> withInput () -> withErrors ( 'Veuillez entrer une date de naissance valide' );
2020-12-10 12:13:33 +01:00
if ( $request -> address !== null )
$address = filter_var ( $request -> address , FILTER_SANITIZE_STRING );
if ( $request -> phone !== null )
$phone = filter_var ( $request -> phone , FILTER_SANITIZE_STRING );
$city = filter_var ( $request -> city , FILTER_SANITIZE_STRING );
$postcode = filter_var ( $request -> postcode , FILTER_SANITIZE_STRING );
$password = $request -> password ;
$optin = $request -> optin !== null ? 1 : 0 ;
2021-03-02 15:46:24 +01:00
/** @var \LDCCRM\ApiV1 */
$crm = app ( 'crmApi' );
2021-02-19 12:18:18 +01:00
$crmCustomer = $crm -> createCustomer ( $email , $password , $firstname , $lastname , $optin , $birthDate -> format ( 'Y-m-d' ), isset ( $phone ) ? $phone : null , isset ( $address ) ? $address : null , null , $city , $postcode , null );
2020-12-10 12:13:33 +01:00
if ( $crmCustomer -> status === " OK " ) {
$customer = new Customers ();
$customer -> crm_id = $crmCustomer -> user -> crm_id ;
$customer -> hashcode = $crmCustomer -> user -> hashcode ;
$customer -> email = $email ;
$customer -> username = $username ;
$customer -> save ();
2021-02-15 10:57:43 +01:00
Mail :: to ( $email ) -> send ( new RegisterConfirmMail ( $customer , $firstname ));
return view ( 'front.auth.confirm-register' );
2020-12-10 12:13:33 +01:00
} else {
switch ( $crmCustomer -> code ) {
case 102 :
2021-02-15 10:57:43 +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-02-15 10:57:43 +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-02-15 10:57:43 +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
*/
2020-12-10 12:13:33 +01:00
public function authenticateForm () {
if ( Auth :: guard ( 'customer' ) -> check ()) {
return redirect () -> route ( 'home' );
}
return view ( 'front.auth.login' );
}
2021-02-09 11:45:26 +01:00
/**
* Gère l ' authentification des customers
*/
2020-12-10 12:13:33 +01:00
public function authenticate ( Request $request ) {
$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-02 15:46:24 +01:00
/** @var \LDCCRM\ApiV1 */
$crm = app ( 'crmApi' );
2020-12-10 12:13:33 +01:00
$result = $crm -> loginCustomer ( $email , $password );
if ( $result -> status === " OK " ) {
2021-03-02 15:46:24 +01:00
/** @var \Illuminate\Auth\SessionGuard */
$guard = Auth :: guard ( 'customer' );
$guard -> login ( $customer , $remember );
2020-12-10 12:13:33 +01:00
return redirect () -> 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 :
2021-03-04 09:41:41 +01:00
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. " );
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-02-15 10:57:43 +01:00
public function activate ( $hashcode ) {
$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-02 15:46:24 +01:00
/** @var \LDCCRM\ApiV1 */
$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
}
}
public function logout () {
if ( Auth :: guard ( 'customer' ) -> check ()) {
Auth :: guard ( 'customer' ) -> logout ();
return redirect () -> route ( 'home' );
}
}
public function update ( Request $request ) {
2021-02-19 12:18:18 +01:00
// TODO : A tester avec pages Mes Informations
2020-12-10 12:13:33 +01:00
$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. " );
}
2021-03-02 15:46:24 +01:00
/** @var \LDCCRM\ApiV1 */
$crm = app ( 'crmApi' );
2021-02-19 12:18:18 +01:00
$result = $crm -> updateCustomer ( $customer -> crm_id , $firstname , $lastname , $optin , $birthDate , $phone , $address , null , $city , $postcode , $country );
2020-12-10 12:13:33 +01:00
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 ([
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 ;
// 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. " );
}
2021-03-02 15:46:24 +01:00
/** @var \LDCCRM\ApiV1 */
$crm = app ( 'crmApi' );
2020-12-10 12:13:33 +01:00
$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 ;
2021-03-02 15:46:24 +01:00
/** @var \LDCCRM\ApiV1 */
$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. " );
}
}
}
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.' );
}
2021-02-24 16:04:53 +01:00
public function removeFavoriteRecipe ( Request $request ) {
$recipe = Recipes :: findOrFail ( $request -> id );
$customer = Auth :: guard ( 'customer' ) -> user ();
$customer -> recipes () -> detach ( $recipe );;
2020-12-10 12:13:33 +01:00
}
public function addToCart ( $productId ) {
$product = Products :: findOrFail ( $productId );
$customer = Customers :: findOrFail ( Auth :: guard ( 'customer' ) -> user () -> id );
$customer -> products () -> attach ( $product );
}
2021-02-24 16:04:53 +01:00
public function removeFromCart ( Request $request ) {
$product = Products :: findOrFail ( $request -> id );
$customer = Auth :: guard ( 'customer' ) -> user ();
2020-12-10 12:13:33 +01:00
$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' );
}
}