split admin users and random users to customers - issue #10

This commit is contained in:
Alexis Gousseau 2023-08-16 10:36:05 +02:00
parent e1d1238919
commit afa735f0b8
50 changed files with 1566 additions and 1183 deletions

View file

@ -16,6 +16,9 @@ php artisan create:admin
php artisan users:deletenc à mettre 1 fois par jour
```
## THEME
Choisir un thème dans le dépôt des thèmes `gen-game-web`, puis copier les fichiers et les coller/remplacer directement dans le projet.
## TODO
```
- SH - Soucis de connexion / déconnexion quand le jeu est terminé et que l'adresse du jeu redirige vers une autre adresse : si on se déconnecte et qu'on revient sur le bo, on est toujours connecté

View file

@ -1,57 +0,0 @@
<?php
namespace App\Console\Commands;
use App\Models\User;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Hash;
class CreateAdmin extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'create:admin';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Execute the console command.
*
* @return integer
*/
public function handle()
{
$firstname = $this->ask('What is the firstname?', 'Equipe');
$lastname = $this->ask('What is the lastname?', 'Web');
$email = $this->ask('What is the email?', 'equipe.web@ldc.fr');
$pwd = $this->secret('What is the password?');
$role = $this->ask('Role ?', '1');
$user = new User();
$user->firstname = $firstname;
$user->lastname = $lastname;
$user->birth_date = now();
$user->email = $email;
$user->password = Hash::make($pwd);
$user->address = "-";
$user->town = "Le Mans";
$user->postal_code = "72000";
$user->country = "France";
$user->email_verify_token = "-";
$user->email_verified = 1;
$user->role = $role;
$user->save();
$this->info('User created.');
return 0;
}
}

View file

@ -2,7 +2,7 @@
namespace App\Console\Commands;
use App\Models\User;
use App\Models\Customer;
use Carbon\Carbon;
use Illuminate\Console\Command;
@ -25,15 +25,13 @@ class DeleteNotConfirmedUser extends Command
/**
* Execute the console command.
*
* @return integer
* @return void
*/
public function handle()
public function handle(): void
{
$users = User::where([['email_verified', 0], ['created_at', '<', Carbon::now()->subDay()]])->get();
$users = Customer::where([['email_verified', 0], ['created_at', '<', Carbon::now()->subDay()]])->get();
foreach ($users as $user) {
$user->delete();
}
return 0;
}
}

View file

@ -0,0 +1,228 @@
<?php
namespace App\Console\Commands;
use App\Enums\Users\RoleEnum;
use App\Models\User;
use Carbon\Carbon;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\ValidationException;
class UserCreate extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'user:create';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Create a backend admin user';
/**
* The firstname of the new user.
*
* @var string
*/
protected $firstname;
/**
* The lastname of the new user.
*
* @var string
*/
protected $lastname;
/**
* The email of the new user.
*
* @var string
*/
protected $email;
/**
* The password of the new user.
*
* @var string
*/
protected $password;
/**
* The role of the new user.
*
* @var string
*/
protected $role;
/**
* Execute the console command.
*
* @return integer
*/
public function handle(): int
{
$this->firstname = null;
$this->addFirstname();
$this->lastname = null;
$this->addLastname();
$this->email = null;
$this->addEmail();
$this->password = null;
$this->addPassword();
$this->role = null;
$this->addRole();
$user = new User([
'firstname' => $this->firstname,
'lastname' => $this->lastname,
'email' => $this->email,
'password' => $this->password,
'role' => $this->role,
'published' => true,
'published_at' => Carbon::now(),
]);
$user->saveOrFail();
$this->info('User created 👌');
return 0;
}
/**
* Add a firstname to the user.
*
* @return void
*/
private function addFirstname(): void
{
while (is_null($this->firstname)) {
try {
$tmp = $this->ask('Type the wanted user firstname', 'Admin');
$validator = Validator::make(['firstname' => $tmp], [
'firstname' => 'required|min:3|max:255'
]);
$validator->validate();
$this->firstname = $tmp;
} catch (ValidationException $e) {
$this->error(sprintf(
'Please provide a valid firstname %s',
\implode(',', collect($e->errors())->flatten()->all())
));
continue;
} //end try
}; //end while
}
/**
* Add a lastname to the user.
*
* @return void
*/
private function addLastname(): void
{
while (is_null($this->lastname)) {
try {
$tmp = $this->ask('Type the wanted user lastname', 'Saïtama');
$validator = Validator::make(['lastname' => $tmp], [
'lastname' => 'required|min:3|max:255'
]);
$validator->validate();
$this->lastname = $tmp;
} catch (ValidationException $e) {
$this->error(sprintf(
'Please provide a valid lastname %s',
\implode(',', collect($e->errors())->flatten()->all())
));
continue;
} //end try
}; //end while
}
/**
* Add an email to the user.
*
* @return void
*/
private function addEmail(): void
{
while (is_null($this->email)) {
try {
$tmp = $this->ask('Type the wanted user email', 'equipe.web@ldc.fr');
$validator = Validator::make(['email' => $tmp], [
'email' => 'required|unique:users,email|email:rfc,dns'
]);
$validator->validate();
$this->email = $tmp;
} catch (ValidationException $e) {
$this->error(sprintf(
'Please provide a valid email %s',
\implode(',', collect($e->errors())->flatten()->all())
));
continue;
} //end try
}; //end while
}
/**
* Add a password to the user.
*
* @return void
*/
private function addPassword(): void
{
while (
($this->password = $this->secret(
(!\is_null($this->password) ? 'Failed to confirm, ' : '') . 'Type the wanted user password'
)) !== $this->secret('Confirm the password')
) {
continue;
}; //end while
}
/**
* Add a role to the user.
*
* @return void
*/
private function addRole(): void
{
while (is_null($this->role)) {
try {
$tmp = $this->choice(
'Select his role',
[RoleEnum::conceptor()->label, RoleEnum::admin()->label],
RoleEnum::admin()->label,
$maxAttempts = null,
$allowMultipleSelections = false
);
if ($tmp === RoleEnum::conceptor()->label) {
$tmp = RoleEnum::conceptor();
}
if ($tmp === RoleEnum::admin()->label) {
$tmp = RoleEnum::admin();
}
$validator = Validator::make(['role' => $tmp], [
'role' => 'required'
]);
$validator->validate();
$this->role = $tmp;
} catch (ValidationException $e) {
$this->error(sprintf(
'Please choose from the selection',
\implode(',', collect($e->errors())->flatten()->all())
));
continue;
} //end try
}; //end while
}
}

View file

@ -0,0 +1,34 @@
<?php
namespace App\Enums\Users;
use Kwaadpepper\Enum\BaseEnumRoutable;
/**
* @method static self conceptor()
* @method static self admin()
*/
class RoleEnum extends BaseEnumRoutable
{
/**
* @return array
*/
protected static function values(): array
{
return [
'conceptor' => 1,
'admin' => 2,
];
}
/**
* @return array
*/
protected static function labels(): array
{
return [
'conceptor' => trans('Concepteur'),
'admin' => trans('Administrator'),
];
}
}

View file

@ -0,0 +1,54 @@
<?php
namespace App\Http\Controllers\Bo\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Contracts\Auth\StatefulGuard;
use Illuminate\Contracts\View\View;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Support\Facades\Auth;
class LoginController extends Controller
{
use AuthenticatesUsers;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest:backend')->except('logout');
}
/**
* Get the guard to be used during authentication.
*
* @return \Illuminate\Contracts\Auth\StatefulGuard
*/
protected function guard(): StatefulGuard
{
return Auth::guard('backend');
}
/**
* Show the application's login form.
*
* @return \Illuminate\Contracts\View\View
*/
public function showLoginForm(): View
{
return view('bo.auth.login');
}
/**
* Where to redirect users after login.
*
* @return string
*/
protected function redirectTo(): string
{
return response()->redirectToIntended()->getTargetUrl();
}
}

View file

@ -4,18 +4,24 @@ namespace App\Http\Controllers;
use App\Mail\PasswordReset;
use App\Mail\VerifyEmail;
use App\Models\Customer;
use App\Models\Settings;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Str;
use App\Models\User;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;
class LoginController extends Controller
{
/** @var \LDCCRM\ApiV1 $apiCrm */
private $apiCrm;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest')->except('logout');
@ -23,7 +29,8 @@ class LoginController extends Controller
}
/**
* index
* Get the view of the index.
*
* @return \Illuminate\View\View
*/
public function index()
@ -31,6 +38,12 @@ class LoginController extends Controller
return view('front.basic.login');
}
/**
* Authenticate the user.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\RedirectResponse
*/
public function authenticate(Request $request)
{
$request->validate([
@ -40,44 +53,45 @@ class LoginController extends Controller
$email = filter_var($request->email, FILTER_SANITIZE_EMAIL);
$password = $request->password;
$remember = $request->remember !== null ? true : false;
$userLocal = User::where('email', $email)->first();
/** @var \App\Models\Customer $userLocal */
$userLocal = Customer::where('email', $email)->first();
if ($userLocal) {
if ($userLocal->email_verified === 1) {
if ($userLocal->role > 2) {
$connect = $this->apiCrm->loginCustomer($email, $password);
$connect = $this->apiCrm->loginCustomer($email, $password);
if ($connect->status === 'KO') {
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.");
}
if ($connect->status === 'KO') {
if ($connect->code === 500) {
return redirect()->back()
->withInput($request->except("password"))
->withErrors("La connexion est impossible pour le moment, veuillez réessayer plus tard.");
} else {
return redirect()->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.");
return redirect()->back()
->withInput($request->except("password"))
->withErrors("Votre compte existe mais votre email n'est pas confirmé,
merci de vérifier vos emails.");
}//end if
} else {
$connect = $this->apiCrm->loginCustomer($email, $password);
if ($connect->status === 'OK') {
$userLocal = User::create([
/** @var \App\Models\Customer $userLocal */
$userLocal = Customer::create([
'crm_id' => $connect->user->crm_id,
'firstname' => $connect->user->firstname,
'lastname' => $connect->user->lastname,
'birth_date' => $connect->user->birth_date,
'email' => $email,
// TODO : MOTDEPASSE ???.
'password' => Hash::make("MOTDEPASSE"),
'password' => Hash::make($password),
'address' => $connect->user->address,
'address2' => $connect->user->address2,
'town' => $connect->user->city,
@ -88,14 +102,14 @@ class LoginController extends Controller
} else {
// Compte existant mais non activé.
if ($connect->code === 116) {
$userLocal = User::create([
/** @var \App\Models\Customer $userLocal */
$userLocal = Customer::create([
'crm_id' => $connect->user->crm_id,
'firstname' => $connect->user->firstname,
'lastname' => $connect->user->lastname,
'birth_date' => $connect->user->birth_date,
'email' => $email,
// TODO : MOTDEPASSE ???.
'password' => Hash::make("MOTDEPASSE"),
'password' => Hash::make($password),
'address' => $connect->user->address,
'address2' => $connect->user->address2,
'town' => $connect->user->city,
@ -106,37 +120,29 @@ class LoginController extends Controller
$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.");
return redirect()->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"))
return redirect()->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.");
return redirect()->back()
->withInput($request->except("password"))
->withErrors("Email ou mot de passe incorrect.");
} //end if
} //end if
}//end if
} //end if
// phpcs:ignore
// TODO : Modifier avec separation guard.
$tmpPwd = "MOTDEPASSE";
if ($userLocal->role <= 2) {
$tmpPwd = $password;
}
if (Auth::attempt(["email" => $email, "password" => $tmpPwd], $remember)) {
if ($userLocal->role <= 2) {
return redirect()->route('bo.dashboard');
}
return redirect()->route('saisir-code');
} else {
return back()->withInput($request->except('password'))->withErrors('Les identifiants entrés sont incorrects.');
}
Auth::login($userLocal);
return redirect()->route('saisir-code');
}
/**
* logout
* Logout.
*
* @return Illuminate\Http\RedirectResponse
*/
public function logout()
@ -144,15 +150,17 @@ class LoginController extends Controller
Auth::logout();
return redirect()->route('home');
}
/**
* confirm email
* Confirm email.
*
* @param string $verifyToken
* @return \Illuminate\View\View|Illuminate\Http\RedirectResponse
*/
public function confirmEmail(string $verifyToken)
{
$result = false;
$user = User::where('email_verify_token', $verifyToken)->first();
$user = Customer::where('email_verify_token', $verifyToken)->first();
if (!$user) {
return view('front.basic.confirm-email', compact('result'));
}
@ -194,7 +202,7 @@ class LoginController extends Controller
->withErrors("Le lien de changement de votre mot de passe n'est plus valide, veuillez réessayer.");
}
$tokenValid = false;
$user = User::where('password_token', $token)->first();
$user = Customer::where('password_token', $token)->first();
if (!$user) {
return redirect()->route('forgot-password', compact('tokenValid'))
->withErrors('Le lien de changement du mot de passe est incorrect.');
@ -206,12 +214,12 @@ class LoginController extends Controller
public function mailPassword(Request $request)
{
$email = filter_var($request->email, FILTER_SANITIZE_STRING);
$user = User::where('email', $email)->first();
$user = Customer::where('email', $email)->first();
if (!$user) {
$userCrm = $this->apiCrm->getCustomerByEmail($email);
if ($userCrm->status === 'OK') {
$user = User::create([
$user = Customer::create([
'crm_id' => $userCrm->user->crm_id,
'firstname' => $userCrm->user->firstname,
'lastname' => $userCrm->user->lastname,
@ -233,14 +241,17 @@ class LoginController extends Controller
$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.");
->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'))
return redirect()->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.");
return redirect()->back()
->withErrors("Une erreur est survenue, veuillez réessayer plus tard.");
}
} //end if
}//end if
@ -251,7 +262,7 @@ class LoginController extends Controller
$settings = app(Settings::class);
Mail::to($email)->send(new PasswordReset($user, $settings));
return redirect()->route('login')
->with('success', 'Un mail de réinitialisation de votre mot de passe vous a été envoyé(e).');
->with('success', 'Un mail de réinitialisation de votre mot de passe vous a été envoyé(e).');
}
public function changePassword(Request $request)
@ -260,9 +271,10 @@ class LoginController extends Controller
'password' => 'required|min:8|confirmed',
]);
$user = User::where('password_token', filter_var($request->token, FILTER_SANITIZE_STRING))->first();
$user = Customer::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.');
return redirect()->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.
@ -274,13 +286,15 @@ class LoginController extends Controller
$user->password_token = null;
$user->save();
return redirect()->route('login')
->with('success', 'Vous pouvez désormais vous connecter avec votre nouveau mot de passe.');
->with('success', 'Vous pouvez désormais vous connecter avec votre nouveau mot de passe.');
} else {
if ($update->code === 123) {
return back()
->withErrors("Il semblerait que vous ayez déjà utilisé ce mot de passe pour votre compte. Veuillez réessayer en changeant de mot de passe.");
return redirect()->back()
->withErrors("Il semblerait que vous ayez déjà utilisé ce mot de passe pour votre compte.
Veuillez réessayer en changeant de mot de passe.");
} else {
return back()->withErrors("Une erreur est survenue, veuillez réessayer plus tard.");
return redirect()->back()
->withErrors("Une erreur est survenue, veuillez réessayer plus tard.");
}
}
}

View file

@ -3,8 +3,8 @@
namespace App\Http\Controllers;
use App\Mail\VerifyEmail;
use App\Models\Customer;
use App\Providers\RouteServiceProvider;
use App\Models\User;
use Carbon\Carbon;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Http\Request;
@ -89,14 +89,14 @@ class RegisterController extends Controller
$crmUser = $this->apiCrm->createCustomer($email, $password, $firstname, $lastname, $optin, $birthdate, null, $address, $address2, $town, $postcode, ucfirst($country));
if ($crmUser->status === 'OK') {
$user = User::create([
$user = Customer::create([
'crm_id' => $crmUser->user->crm_id,
'firstname' => $firstname,
'lastname' => $lastname,
'birth_date' => $birthdate,
'email' => $email,
'password' => Hash::make("MOTDEPASSE"),
// TODO : ???
// TODO : ???
'address' => $address,
'address2' => $address2,
'town' => $town,

View file

@ -4,9 +4,9 @@ namespace App\Http\Controllers;
use App\Mail\NotifAdmin;
use App\Mail\WinningProof;
use App\Models\Customer;
use App\Models\Participation;
use App\Models\Settings;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
@ -61,7 +61,7 @@ class WinningProofController extends Controller
$barcode = $request->barcode;
// Mise à jour de l'utilisateur en local.
$user = User::find(Auth::user()->id);
$user = Customer::find(Auth::user()->id);
$user->lastname = $lastname;
$user->firstname = $firstname;
$user->address = $address;

View file

@ -3,6 +3,7 @@
namespace App\Http\Middleware;
use Illuminate\Auth\Middleware\Authenticate as Middleware;
use Illuminate\Support\Facades\Session;
class Authenticate extends Middleware
{
@ -12,10 +13,27 @@ class Authenticate extends Middleware
* @param \Illuminate\Http\Request $request
* @return string|null
*/
protected function redirectTo($request)
protected function redirectTo($request): ?string
{
if (! $request->expectsJson()) {
$logins = [
'backend' => route('bo.login')
];
if (!$request->expectsJson()) {
// * Notify must login
Session::flash('warning', trans('Veuillez vous connecter pour continuer'));
foreach ($request->route()->gatherMiddleware() as $middleware) {
if (\is_string($middleware) and strpos($middleware, 'auth:') !== false) {
$route = $logins[str_replace('auth:', '', $middleware)] ?? null;
if ($route) {
return $route;
}
}
}
return route('login');
}
abort(401);
return null;
}
}

View file

@ -2,6 +2,7 @@
namespace App\Mail;
use App\Models\Customer;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
@ -12,14 +13,16 @@ class VerifyEmail extends Mailable implements ShouldQueue
use Queueable;
use SerializesModels;
/** @var \App\Models\Customer $user */
protected $user;
/**
* Create a new message instance.
*
* @param \App\Models\Customer $user
* @return void
*/
public function __construct($user)
public function __construct(Customer $user)
{
$this->user = $user;
}

91
app/Models/Customer.php Normal file
View file

@ -0,0 +1,91 @@
<?php
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Facades\Hash;
class Customer extends Authenticatable
{
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'crm_id',
'civility',
'firstname',
'lastname',
'birth_date',
'email',
'password',
'address',
'address2',
'town',
'postal_code',
'country',
'email_verify_token',
'email_verified'
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password',
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
/**
* Perform any actions required after the model boots.
*
* @return void
*/
protected static function booted()
{
// * EVENT CLOSURES.
static::creating(function (self $model) {
static::updatePassword($model);
});
static::updating(function (self $model) {
static::updatePassword($model);
});
}
/**
* Update password.
*
* @param self $model
* @return void
*/
private static function updatePassword(self $model): void
{
if (Hash::needsRehash($model->password)) {
$model->password = Hash::make($model->password);
}
}
/**
* Has Many Participation relation
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function participations()
{
return $this->hasMany(Participation::class, 'user_id');
}
}

View file

@ -13,7 +13,7 @@ class Participation extends Model
*/
public function user()
{
return $this->belongsTo(User::class);
return $this->belongsTo(Customer::class);
}
/**

View file

@ -2,11 +2,15 @@
namespace App\Models;
use App\Enums\Users\RoleEnum;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Facades\Hash;
class User extends Authenticatable
{
use HasFactory;
use Notifiable;
/**
@ -15,47 +19,76 @@ class User extends Authenticatable
* @var array
*/
protected $fillable = [
'crm_id',
'civility',
'firstname',
'lastname',
'birth_date',
'email',
'password',
'address',
'address2',
'town',
'postal_code',
'country',
'email_verify_token',
'email_verified'
'role',
'published',
'published_at',
'order',
];
/**
* The attributes that should be hidden for arrays.
* The attributes that should be hidden for serialization.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
'password',
'remember_token',
];
/**
* The attributes that should be cast to native types.
* Cast the property to an enum.
*
* @var array
*/
protected $casts = [
protected $enumCasts = [
'role' => RoleEnum::class,
'email_verified_at' => 'datetime',
];
/**
* Has Many Participation relation
* Perform any actions required after the model boots.
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
* @return void
*/
public function participations()
protected static function booted()
{
return $this->hasMany(Participation::class, 'user_id');
// * EVENT CLOSURES.
static::creating(function (self $model) {
static::updatePassword($model);
static::setOrder($model);
});
static::updating(function (self $model) {
static::updatePassword($model);
});
}
// * METHODS
/**
* Set order after the last element of the list.
*
* @param self $model
* @return void
*/
private static function setOrder(self $model): void
{
$model->order = \intval(self::query()->max('order')) + 1;
}
/**
* Update password.
*
* @param self $model
* @return void
*/
private static function updatePassword(self $model): void
{
if (Hash::needsRehash($model->password)) {
$model->password = Hash::make($model->password);
}
}
}

View file

@ -31,17 +31,16 @@ class RouteServiceProvider extends ServiceProvider
public function boot()
{
$this->routes(function () {
Route::middleware('web')
->namespace($this->namespace)
->group(base_path('routes/web.php'));
Route::middleware('web')
->namespace($this->namespace)
->group(base_path('routes/web.php'));
->namespace($this->namespace)
->group(base_path('routes/web-bo.php'));
Route::middleware('web')
->namespace($this->namespace)
->group(base_path('routes/web-bo.php'));
Route::middleware('web')
->namespace($this->namespace)
->namespace($this->namespace)
->group(base_path('routes/web-re7.php'));
});
}

View file

@ -14,6 +14,7 @@
"fideloper/proxy": "^4.2",
"fruitcake/laravel-cors": "^2.0",
"guzzlehttp/guzzle": "^7.0.1",
"kwaadpepper/enum": "^2.1",
"kwaadpepper/exception-handler": "^0.0.6",
"kwaadpepper/serial-int-caster": "^1.0",
"laravel/framework": "^8.0",

1314
composer.lock generated

File diff suppressed because it is too large Load diff

View file

@ -14,7 +14,7 @@ return [
*/
'defaults' => [
'guard' => 'web',
'guard' => 'frontend',
'passwords' => 'users',
],
@ -36,15 +36,14 @@ return [
*/
'guards' => [
'web' => [
'backend' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
'hash' => false,
'frontend' => [
'driver' => 'session',
'provider' => 'customers',
],
],
@ -70,6 +69,10 @@ return [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
'customers' => [
'driver' => 'eloquent',
'model' => App\Models\Customer::class,
],
],
/*
@ -90,7 +93,13 @@ return [
'passwords' => [
'users' => [
'provider' => 'users',
'table' => 'password_resets',
'table' => 'password',
'expire' => 60,
'throttle' => 60,
],
'customers' => [
'provider' => 'customers',
'table' => 'password',
'expire' => 60,
'throttle' => 60,
],

View file

@ -4,7 +4,7 @@ use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateUsersTable extends Migration
return new class extends Migration
{
/**
* Run the migrations.
@ -15,23 +15,16 @@ class CreateUsersTable extends Migration
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->integer('crm_id')->nullable();
$table->string('firstname');
$table->string('lastname');
$table->date('birth_date')->nullable();
$table->string('email')->unique();
$table->string('password');
$table->string('address')->nullable();
$table->string('address2')->nullable();
$table->string('town')->nullable();
$table->string('postal_code')->nullable();
$table->string('country')->nullable();
$table->string('phone')->nullable();
$table->string('email_verify_token')->nullable();
$table->boolean('email_verified')->default(0);
$table->string('password_token')->nullable();
$table->integer('role')->default(3);
$table->string('firstname')->comment('Firstname of the user.');
$table->string('lastname')->comment('Lastname of the user.');
$table->string('email')->unique()->comment('Email of the user.');
$table->timestamp('email_verified_at')->nullable();
$table->string('password')->comment('Password of the user account.');
$table->rememberToken();
$table->boolean('role')->comment('Role of the user who defines the rights/access.');
$table->boolean('published')->comment('The user is published or not.');
$table->timestamp('published_at')->nullable()->comment('The date on which the user was published.');
$table->integer('order')->comment('Order of this user.');
$table->timestamps();
});
}
@ -45,4 +38,4 @@ class CreateUsersTable extends Migration
{
Schema::dropIfExists('users');
}
}
};

View file

@ -0,0 +1,46 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateCustomersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('customers', function (Blueprint $table) {
$table->id();
$table->integer('crm_id')->nullable();
$table->string('firstname');
$table->string('lastname');
$table->date('birth_date')->nullable();
$table->string('email')->unique();
$table->string('password');
$table->string('address')->nullable();
$table->string('address2')->nullable();
$table->string('town')->nullable();
$table->string('postal_code')->nullable();
$table->string('country')->nullable();
$table->string('phone')->nullable();
$table->string('email_verify_token')->nullable();
$table->boolean('email_verified')->default(0);
$table->string('password_token')->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('customers');
}
}

View file

@ -0,0 +1,67 @@
@extends('bo.layout')
@section('title', __('Authentification'))
@section('description', __('Formulaire d\'authentification au back-office.'))
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8 p-0">
<div class="card">
<div class="card-header">{{ __('Connexion') }}</div>
<div class="card-body">
<form method="POST" action="{{ route('bo.login') }}">
@csrf
<div class="row mb-3">
<label for="email" class="col-md-4 col-form-label text-md-end">{{ __('Adresse Email') }}</label>
<div class="col-md-6">
<input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email"
value="{{ old('email') }}" autocomplete="email" autofocus required>
@error('email')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="row mb-3">
<label for="password" class="col-md-4 col-form-label text-md-end">{{ __('Mot de passe') }}</label>
<div class="col-md-6">
<input id="password" type="password" class="form-control @error('password') is-invalid @enderror"
name="password" autocomplete="current-password" required>
@error('password')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="row mb-3">
<div class="col-md-6 offset-md-4">
<div class="form-check">
<input class="form-check-input" type="checkbox" name="remember" id="remember" {{ old('remember') ? 'checked' : '' }}>
<label class="form-check-label user-select-none" for="remember">
{{ __('Se souvenir de moi') }}
</label>
</div>
</div>
</div>
<div class="row mb-0">
<div class="col-md-8 offset-md-4">
<button type="submit" class="btn btn-primary">
<span>{{ __('Connexion') }}</span>
<i class="fa-solid fa-arrow-right-from-bracket"></i>
</button>
@if (Route::has('bo.password.request'))
<a class="btn btn-link" href="{{ route('bo.password.request') }}">
{{ __('Mot de passe oublié ?') }}
</a>
@endif
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection

View file

@ -1,4 +1,4 @@
@extends('layouts.bo')
@extends('bo.layout')
@section('content')
<banned-ip dbdatas='@json($ips)'/>

View file

@ -1,4 +1,4 @@
@extends('layouts.bo')
@extends('bo.layout')
@section('content')
<codes-ean dbdatas='@json($ean)'/>

View file

@ -1,4 +1,4 @@
@extends('layouts.bo')
@extends('bo.layout')
@section('content')
<div class="card">

View file

@ -1,4 +1,4 @@
@extends('layouts.bo')
@extends('bo.layout')
@section('content')
<div class="card">

View file

@ -1,4 +1,4 @@
@extends('layouts.bo')
@extends('bo.layout')
@section('content')
<div class="card">

View file

@ -1,4 +1,4 @@
@extends('layouts.bo')
@extends('bo.layout')
@section('content')
<h2>Tableau de bord</h2>

View file

@ -1,4 +1,4 @@
@extends('layouts.bo')
@extends('bo.layout')
@section('content')
<faq-questions dbdatas='@json($questions)' dbthemes='@json($themes)'/>

View file

@ -1,4 +1,4 @@
@extends('layouts.bo')
@extends('bo.layout')
@section('content')
<faq-themes dbdatas='@json($themes)'/>

View file

@ -1,4 +1,4 @@
@extends('layouts.bo')
@extends('bo.layout')
@section('content')
<gain-views name="gain_views" dbdatas='@json($gv)'/>

View file

@ -1,4 +1,4 @@
@extends('layouts.bo')
@extends('bo.layout')
@section('content')
<instant-win :cangenerate="{{$can_generate}}" instantwin='@json($instant_win)'/>

View file

@ -0,0 +1,59 @@
<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
@include('bo.layouts.head')
</head>
<body>
<div id="app">
<nav class="navbar navbar-expand-md navbar-light bg-white shadow-sm">
<div class="container">
<a class="navbar-brand rounded px-2 py-1" href="{{ url('/') }}">
{{ config('app.name', 'Laravel') }}
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent"
aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="{{ __('Toggle navigation') }}">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<!-- Right Side Of Navbar -->
<ul class="navbar-nav justify-content-end w-100 ms-auto">
<!-- Authentication Links -->
@auth
<li class="nav-item dropdown">
<a id="navbarDropdown" class="nav-link dropdown-toggle" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
{{ __('Bonjour :firstname', ['firstname' => Auth::user()->firstname]) }}
</a>
<div class="dropdown-menu dropdown-menu-right p-0 m-0" aria-labelledby="navbarDropdown">
<form class="text-center" action="{{ route('bo.logout') }}" method="POST">
@csrf
<button class="btn btn-link text-decoration-none text-muted w-100 h-100 p-2" type="submit">{{ __('Déconnexion') }}</button>
</form>
</div>
</li>
@endguest
</ul>
</div>
</div>
</nav>
<main class="py-4">
<div class="container">
<div class="row justify-content-center">
@auth
<div class="col-md-2">
@include('bo.layouts.nav-menu')
</div>
@endguest
<div class="col-md-10">
@include('modules.flash-messages')
@yield('content')
</div>
</div>
</div>
</main>
</div>
<script src="{{ asset('js/app.js') }}"></script>
@stack('scripts')
</body>
</html>

View file

@ -0,0 +1,21 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- CSRF Token -->
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>{{ config('app.name', 'Laravel') }}</title>
<!-- Scripts -->
{{-- TODO : Ajouter jQuery dans app.js --}}
<script src="https://code.jquery.com/jquery-3.5.1.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
{{-- TODO : Voir l'inclusion de Font Awesome, pour le moment c'est fait avec mon compte FA --}}
<script src="https://kit.fontawesome.com/2327d60f96.js" crossorigin="anonymous"></script>
<!-- Fonts -->
<link rel="dns-prefetch" href="//fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet">
<!-- Styles -->
<link href="{{ asset('css/app.css') }}" rel="stylesheet">
@yield('styles')

View file

@ -0,0 +1,39 @@
<nav class="nav flex-column sticky-top">
<a class="btn bg-transparent text-left" href="{{route('bo.dashboard')}}">{{ __('Tableau de bord') }}</a>
@superadmin
<a class="btn bg-transparent text-left" href="{{route('bo.settings')}}">{{ __('Réglages') }}</a>
<li class="nav-item dropdown">
<a class="btn bg-transparent text-left dropdown-toggle" data-toggle="dropdown" href="#" role="button">{{ __('Lots') }}</a>
<div class="dropdown-menu">
<a class="dropdown-item" href="{{route('bo.prizes')}}">{{ __('Gérer les lots') }}</a>
<a class="dropdown-item" href="{{route('bo.gain-views')}}">{{ __('Gérer les vues des lots') }}</a>
</div>
</li>
<a class="btn bg-transparent text-left" href="{{route('bo.instant-win')}}">{{ __('Instant gagnants') }}</a>
@endsuperadmin
<a class="btn bg-transparent text-left" href="{{route('bo.codes-ean')}}">{{ __('Code EAN') }}</a>
<a class="btn bg-transparent text-left" href="{{route('bo.ranges.index')}}">{{ __('Gammes') }}</a>
<a class="btn bg-transparent text-left" href="{{route('bo.products.index')}}">{{ __('Produits porteurs') }}</a>
@superadmin
<a class="btn bg-transparent text-left" href="#_">{{ __('Social share') }}</a>
<a class="btn bg-transparent text-left" href="{{route('bo.winners-list')}}">{{ __('Liste des gagnants') }}</a>
<a class="btn bg-transparent text-left" href="{{route('bo.banned-ip')}}">{{ __('IP Bannies') }}</a>
<li class="nav-item dropdown">
<a class="btn bg-transparent text-left dropdown-toggle" data-toggle="dropdown" href="#" role="button">{{ __('Contenus') }}</a>
<div class="dropdown-menu">
<a class="dropdown-item" href="{{route('bo.content', 1)}}">{{ __('Mentions légales') }}</a>
<a class="dropdown-item" href="{{route('bo.content', 2)}}">{{ __('Charte') }}</a>
<a class="dropdown-item" href="{{route('bo.content', 3)}}">{{ __('Règlement') }}</a>
</div>
</li>
<li class="nav-item dropdown">
<a class="btn bg-transparent text-left dropdown-toggle" data-toggle="dropdown" href="#" role="button">{{ __('FAQ') }}</a>
<div class="dropdown-menu">
<a class="dropdown-item" href="{{route('bo.faq-themes')}}">{{ __('Thèmes') }}</a>
<a class="dropdown-item" href="{{route('bo.faq-questions')}}">{{ __('Questions') }}</a>
</div>
</li>
<a class="btn bg-transparent text-left" href="{{route('bo.codes')}}">{{ __('Codes uniques') }}</a>
@endsuperadmin
<a class="btn bg-transparent text-left" href="{{route('home')}}" target="_blank">{{ __('Aller sur le jeu') }}</a>
</nav>

View file

@ -7,11 +7,11 @@
<title></title>
</head>
<body>
<p>
<p>
Job : {{ $job }} <br><br>
Exception : {{ $exception['message'] }} <br><br>
Exception : {{ $exception['message'] }} <br><br>
Trace : <br>
{{ $exception['trace'] }}
</p>
</p>
</body>
</html>

View file

@ -1,4 +1,4 @@
@extends('layouts.bo')
@extends('bo.layout')
@section('content')
<prizes name="prizes" dbdatas='@json($prizes)' dbgainviews='@json($gainViews)'/>

View file

@ -1,4 +1,4 @@
@extends('layouts.bo')
@extends('bo.layout')
@section('content')
<div class="card">

View file

@ -1,4 +1,4 @@
@extends('layouts.bo')
@extends('bo.layout')
@section('content')
<div class="card">

View file

@ -1,4 +1,4 @@
@extends('layouts.bo')
@extends('bo.layout')
@section('content')
<div class="card">

View file

@ -1,4 +1,4 @@
@extends('layouts.bo')
@extends('bo.layout')
@section('content')
<div class="card">

View file

@ -1,4 +1,4 @@
@extends('layouts.bo')
@extends('bo.layout')
@section('content')
<div class="card">

View file

@ -1,4 +1,4 @@
@extends('layouts.bo')
@extends('bo.layout')
@section('content')
<div class="card">

View file

@ -1,4 +1,4 @@
@extends('layouts.bo')
@extends('bo.layout')
@section('content')
<div class="card">

View file

@ -1,4 +1,4 @@
@extends('layouts.bo')
@extends('bo.layout')
@section('content')
<div class="card">

View file

@ -1,4 +1,4 @@
@extends('layouts.bo')
@extends('bo.layout')
@section('content')
<div class="card">

View file

@ -1,80 +0,0 @@
<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- CSRF Token -->
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>{{ config('app.name', 'Laravel') }}</title>
<!-- Scripts -->
<script src="{{ asset('js/app.js') }}" defer></script>
<!-- Fonts -->
<link rel="dns-prefetch" href="//fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet">
<!-- Styles -->
<link href="{{ asset('css/app.css') }}" rel="stylesheet">
</head>
<body>
<div id="app">
<nav class="navbar navbar-expand-md navbar-light bg-white shadow-sm">
<div class="container">
<a class="navbar-brand" href="{{ url('/') }}">
{{ config('app.name', 'Laravel') }}
</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="{{ __('Toggle navigation') }}">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<!-- Left Side Of Navbar -->
<ul class="navbar-nav mr-auto">
</ul>
<!-- Right Side Of Navbar -->
<ul class="navbar-nav ml-auto">
<!-- Authentication Links -->
@guest
<li class="nav-item">
<a class="nav-link" href="{{ route('login') }}">{{ __('Login') }}</a>
</li>
@if (Route::has('register'))
<li class="nav-item">
<a class="nav-link" href="{{ route('register') }}">{{ __('Register') }}</a>
</li>
@endif
@else
<li class="nav-item dropdown">
<a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
{{ Auth::user()->name }}
</a>
<div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="{{ route('logout') }}"
onclick="event.preventDefault();
document.getElementById('logout-form').submit();">
{{ __('Logout') }}
</a>
<form id="logout-form" action="{{ route('logout') }}" method="POST" class="d-none">
@csrf
</form>
</div>
</li>
@endguest
</ul>
</div>
</div>
</nav>
<main class="py-4">
@yield('content')
</main>
</div>
</body>
</html>

View file

@ -1,125 +0,0 @@
<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- CSRF Token -->
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>{{ config('app.name', 'Laravel') }}</title>
<!-- Scripts -->
{{-- TODO : Ajouter jQuery dans app.js --}}
<script src="https://code.jquery.com/jquery-3.5.1.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
{{-- TODO : Voir l'inclusion de Font Awesome, pour le moment c'est fait avec mon compte FA --}}
<script src="https://kit.fontawesome.com/2327d60f96.js" crossorigin="anonymous"></script>
<!-- Fonts -->
<link rel="dns-prefetch" href="//fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet">
<!-- Styles -->
<link href="{{ asset('css/app.css') }}" rel="stylesheet">
@yield('styles')
</head>
<body>
<div id="app">
<nav class="navbar navbar-expand-md navbar-light bg-white shadow-sm">
<div class="container">
<a class="navbar-brand" href="{{ url('/') }}">
{{ config('app.name', 'Laravel') }}
</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="{{ __('Toggle navigation') }}">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<!-- Left Side Of Navbar -->
<ul class="navbar-nav mr-auto">
</ul>
<!-- Right Side Of Navbar -->
<ul class="navbar-nav ml-auto">
<!-- Authentication Links -->
@auth
<li class="nav-item dropdown">
<a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
Bonjour {{ Auth::user()->firstname }} <span class="caret"></span>
</a>
<div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="#"
onclick="event.preventDefault();
document.getElementById('logout-form').submit();">
Déconnexion
</a>
<form id="logout-form" action="{{route('logout')}}" method="POST" style="display: none;">
@csrf
</form>
</div>
</li>
@endguest
</ul>
</div>
</div>
</nav>
<main class="py-4">
<div class="container">
<div class="row justify-content-center">
<div class="col-md-2">
<nav class="nav flex-column sticky-top">
<a class="nav-link" href="{{route('bo.dashboard')}}">Tableau de bord</a>
@superadmin
<a class="nav-link" href="{{route('bo.settings')}}">Réglages</a>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button">Lots</a>
<div class="dropdown-menu">
<a class="dropdown-item" href="{{route('bo.prizes')}}">Gérer les lots</a>
<a class="dropdown-item" href="{{route('bo.gain-views')}}">Gérer les vues des lots</a>
</div>
</li>
<a class="nav-link" href="{{route('bo.instant-win')}}">Instant gagnants</a>
@endsuperadmin
<a class="nav-link" href="{{route('bo.codes-ean')}}">Code EAN</a>
<a class="nav-link" href="{{route('bo.ranges.index')}}">Gammes</a>
<a class="nav-link" href="{{route('bo.products.index')}}">Produits porteurs</a>
@superadmin
<a class="nav-link" href="#_">Social share</a>
<a class="nav-link" href="{{route('bo.winners-list')}}">Liste des gagnants</a>
<a class="nav-link" href="{{route('bo.banned-ip')}}">IP Bannies</a>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button">Contenus</a>
<div class="dropdown-menu">
<a class="dropdown-item" href="{{route('bo.content', 1)}}">Mentions légales</a>
<a class="dropdown-item" href="{{route('bo.content', 2)}}">Charte</a>
<a class="dropdown-item" href="{{route('bo.content', 3)}}">Règlement</a>
</div>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button">FAQ</a>
<div class="dropdown-menu">
<a class="dropdown-item" href="{{route('bo.faq-themes')}}">Thèmes</a>
<a class="dropdown-item" href="{{route('bo.faq-questions')}}">Questions</a>
</div>
</li>
<a class="nav-link" href="{{route('bo.codes')}}">Codes uniques</a>
@endsuperadmin
<a class="nav-link" href="{{route('home')}}" target="_blank">Aller sur le jeu</a>
</nav>
</div>
<div class="col-md-10">
@include('modules.flashMessage')
@yield('content')
</div>
</div>
</div>
</main>
</div>
<script src="{{ asset('js/app.js') }}"></script>
@stack('scripts')
</body>
</html>

View file

@ -14,66 +14,82 @@ use App\Http\Controllers\Bo\ProductsController;
use App\Http\Controllers\Bo\RangeController;
use App\Http\Controllers\Bo\SettingsController;
use App\Http\Controllers\Bo\WinnersListController;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Route;
// * BO
Route::prefix('bo')
->name('bo.')
->middleware(['auth', 'is-admin', 'is-super-admin'])
->group(function () {
Route::get('/', [DashboardController::class, 'index'])
->name('dashboard')->withoutMiddleware('is-super-admin');
// Réglages.
Route::match(['get', 'put'], '/settings', [SettingsController::class, 'manage'])
->name('settings');
// Contenu.
Route::match(['get', 'put'], '/content/{id}', [ContentController::class, 'manage'])
->name('content');
// Pages liées au gains.
Route::get('/gain-views', [GainViewController::class, 'index'])
->name('gain-views');
Route::post('/ajax/delete-gain-views', [GainViewController::class, 'destroy']);
Route::post('/ajax/save-gain-views', [GainViewController::class, 'saveDatas']);
// Lots.
Route::get('/prizes', [PrizesController::class, 'index'])->name('prizes');
Route::post('/ajax/delete-prize', [PrizesController::class, 'destroy']);
Route::post('/ajax/save-prizes', [PrizesController::class, 'saveDatas']);
// Instants gagnants.
Route::get('/instant-win', [InstantWinController::class, 'index'])->name('instant-win');
Route::get('/ajax/instant-win-generate', [InstantWinController::class, 'instantWinGenerate']);
// Codes EAN.
Route::get('/codes-ean', [CodesEANController::class, 'index'])
->name('codes-ean')->withoutMiddleware('is-super-admin');
Route::post('/ajax/delete-codes-ean', [CodesEANController::class, 'destroy'])
->withoutMiddleware('is-super-admin');
Route::post('/ajax/save-codes-ean', [CodesEANController::class, 'saveDatas'])
->withoutMiddleware('is-super-admin');
// IP Bannies.
Route::get('/banned-ip', [BannedIpController::class, 'index'])->name('banned-ip');
Route::post('/ajax/delete-banned-ip', [BannedIpController::class, 'destroy']);
Route::post('/ajax/save-banned-ip', [BannedIpController::class, 'saveDatas']);
// FAQ - Thèmes.
Route::get('/faq-themes', [FaqThemesController::class, 'index'])->name('faq-themes');
Route::post('/ajax/delete-faq-theme', [FaqThemesController::class, 'destroy']);
Route::post('/ajax/save-faq-theme', [FaqThemesController::class, 'saveDatas']);
// FAQ - Questions.
Route::get('/faq-questions', [FaqQuestionsController::class, 'index'])->name('faq-questions');
Route::post('/ajax/delete-faq-question', [FaqQuestionsController::class, 'destroy']);
Route::post('/ajax/save-faq-question', [FaqQuestionsController::class, 'saveDatas']);
// Codes uniques.
Route::get('/codes', [CodesController::class, 'index'])->name('codes');
Route::post('/codes', [CodesController::class, 'generate'])->name('generate-codes');
Route::get('/codes/search', [CodesController::class, 'search'])->name('codes.search');
Route::post('/codes/export', [CodesController::class, 'export'])->name('export-codes');
// Liste des gagnants.
Route::get('/winners-list', [WinnersListController::class, 'index'])->name('winners-list');
Route::get('/winners-list/arcadia/{id}', [WinnersListController::class, 'courrierArcadia'])
->name('winners-arcadia');
Route::post('/winners-list/arcadia/{id}/send', [WinnersListController::class, 'createCourrierArcadia'])
->name('courrier-arcadia');
// Produits porteurs.
Route::resource('products', ProductsController::class)
->withoutMiddleware('is-super-admin');
Route::resource('ranges', RangeController::class)
->withoutMiddleware('is-super-admin');
});
->name('bo.')
->group(function () {
Route::namespace('\App\Http\Controllers\Bo')
->group(function () {
Auth::routes(
[
'confirm' => false,
'login' => true,
'logout' => true,
'register' => false,
'reset' => false,
'verify' => false,
]
);
});
Route::middleware(['auth:backend', 'is-admin', 'is-super-admin'])
->group(function () {
Route::get('/', [DashboardController::class, 'index'])
->name('dashboard')->withoutMiddleware('is-super-admin');
// Réglages.
Route::match(['get', 'put'], '/settings', [SettingsController::class, 'manage'])
->name('settings');
// Contenu.
Route::match(['get', 'put'], '/content/{id}', [ContentController::class, 'manage'])
->name('content');
// Pages liées au gains.
Route::get('/gain-views', [GainViewController::class, 'index'])
->name('gain-views');
Route::post('/ajax/delete-gain-views', [GainViewController::class, 'destroy']);
Route::post('/ajax/save-gain-views', [GainViewController::class, 'saveDatas']);
// Lots.
Route::get('/prizes', [PrizesController::class, 'index'])->name('prizes');
Route::post('/ajax/delete-prize', [PrizesController::class, 'destroy']);
Route::post('/ajax/save-prizes', [PrizesController::class, 'saveDatas']);
// Instants gagnants.
Route::get('/instant-win', [InstantWinController::class, 'index'])->name('instant-win');
Route::get('/ajax/instant-win-generate', [InstantWinController::class, 'instantWinGenerate']);
// Codes EAN.
Route::get('/codes-ean', [CodesEANController::class, 'index'])
->name('codes-ean')->withoutMiddleware('is-super-admin');
Route::post('/ajax/delete-codes-ean', [CodesEANController::class, 'destroy'])
->withoutMiddleware('is-super-admin');
Route::post('/ajax/save-codes-ean', [CodesEANController::class, 'saveDatas'])
->withoutMiddleware('is-super-admin');
// IP Bannies.
Route::get('/banned-ip', [BannedIpController::class, 'index'])->name('banned-ip');
Route::post('/ajax/delete-banned-ip', [BannedIpController::class, 'destroy']);
Route::post('/ajax/save-banned-ip', [BannedIpController::class, 'saveDatas']);
// FAQ - Thèmes.
Route::get('/faq-themes', [FaqThemesController::class, 'index'])->name('faq-themes');
Route::post('/ajax/delete-faq-theme', [FaqThemesController::class, 'destroy']);
Route::post('/ajax/save-faq-theme', [FaqThemesController::class, 'saveDatas']);
// FAQ - Questions.
Route::get('/faq-questions', [FaqQuestionsController::class, 'index'])->name('faq-questions');
Route::post('/ajax/delete-faq-question', [FaqQuestionsController::class, 'destroy']);
Route::post('/ajax/save-faq-question', [FaqQuestionsController::class, 'saveDatas']);
// Codes uniques.
Route::get('/codes', [CodesController::class, 'index'])->name('codes');
Route::post('/codes', [CodesController::class, 'generate'])->name('generate-codes');
Route::get('/codes/search', [CodesController::class, 'search'])->name('codes.search');
Route::post('/codes/export', [CodesController::class, 'export'])->name('export-codes');
// Liste des gagnants.
Route::get('/winners-list', [WinnersListController::class, 'index'])->name('winners-list');
Route::get('/winners-list/arcadia/{id}', [WinnersListController::class, 'courrierArcadia'])
->name('winners-arcadia');
Route::post('/winners-list/arcadia/{id}/send', [WinnersListController::class, 'createCourrierArcadia'])
->name('courrier-arcadia');
// Produits porteurs.
Route::resource('products', ProductsController::class)
->withoutMiddleware('is-super-admin');
Route::resource('ranges', RangeController::class)
->withoutMiddleware('is-super-admin');
});
});

View file

@ -14,8 +14,18 @@ use App\Http\Controllers\ViewContentController;
use App\Http\Controllers\WinningProofController;
use Illuminate\Support\Facades\Route;
Route::group(['middleware' => ['game-date']], function () {
// Front.
Route::middleware('game-date')->group(function () {
// Routes nécessitant d'être connecté.
Route::middleware('auth:frontend')->group(function () {
Route::post('/logout', [LoginController::class, 'logout'])->name('logout');
Route::get('/saisir-code', [EnterCodeController::class, 'index'])->name('saisir-code');
Route::post('/saisir-code', [EnterCodeController::class, 'participate'])
->name('participate');
Route::put('/saisir-code', [EnterCodeController::class, 'formWinningProof'])
->name('winning-proof');
Route::put('/rejouer', [WinningProofController::class, 'sendWinningProof'])
->name('send-winning-proof');
});
Route::get('/', [HomeController::class, 'home'])->name('home');
Route::get('/reglement', [ViewContentController::class, 'reglement'])->name('reglement');
Route::get('/charte', [ViewContentController::class, 'charte'])->name('charte');
@ -24,29 +34,18 @@ Route::group(['middleware' => ['game-date']], function () {
Route::get('/comment-jouer', [HowToPlayController::class, 'index'])->name('comment-jouer');
Route::get('/les-gains', [GainsController::class, 'index'])->name('les-gains');
Route::get('/produits-porteurs', [ProduitsController::class, 'index'])->name('produits-porteurs');
// Authentification.
Route::get('/inscription', [RegisterController::class, 'index'])->name('inscription');
Route::post('/inscription', [RegisterController::class, 'register'])->name('register');
Route::get('/confirmation-email/{verifyToken}', [LoginController::class, 'confirmEmail'])->name('confirm-email');
Route::get('/mot-de-passe-oublie', [LoginController::class, 'forgotPassword'])->name('forgot-password');
Route::get('/mot-de-passe-oublie/reset/{token}', [LoginController::class, 'forgotPasswordReset'])
->name('forgot-password-reset');
Route::put('/mail-mot-de-passe', [LoginController::class, 'mailPassword'])->name('mail-password');
Route::put('/change-mot-de-passe', [LoginController::class, 'changePassword'])->name('change-password');
// Front nécessitant d'être connecté.
Route::get('/saisir-code', [EnterCodeController::class, 'index'])->name('saisir-code')->middleware('auth');
Route::post('/saisir-code', [EnterCodeController::class, 'participate'])
->name('participate')->middleware('auth');
Route::put('/saisir-code', [EnterCodeController::class, 'formWinningProof'])
->name('winning-proof')->middleware('auth');
Route::put('/rejouer', [WinningProofController::class, 'sendWinningProof'])
->name('send-winning-proof')->middleware('auth');
// Authentification.
Route::post('/logout', [LoginController::class, 'logout'])->name('logout')->middleware('auth');
Route::get('/inscription', [RegisterController::class, 'index'])->name('inscription');
Route::post('/inscription', [RegisterController::class, 'register'])->name('register');
});
// Login sans middleware pour la connexion admin, teaser et end pour ne pas redirigé en boucle.
Route::get('/login', [LoginController::class, 'index'])->name('login');
Route::post('/login', [LoginController::class, 'authenticate'])->name('authenticate');
Route::get('/teaser', [TeaserController::class, 'index'])->name('teaser');