diff --git a/app/Http/Controllers/EnterCodeController.php b/app/Http/Controllers/EnterCodeController.php index 7f66d32..07c6c46 100644 --- a/app/Http/Controllers/EnterCodeController.php +++ b/app/Http/Controllers/EnterCodeController.php @@ -18,15 +18,15 @@ class EnterCodeController extends Controller public function participate(Request $request) { $code = $request->code; + $codeEan = null; $settings = Settings::select('use_ean_codes')->first(); if ($settings->use_ean_codes) { $codeEan = $request->code_ean; $eanExist = CodesEAN::where('code', $codeEan)->count(); - if ($eanExist === 0) { + if ($eanExist === 0) return redirect()->back()->withErrors('Le code EAN entré est incorrect, veuillez réessayer.'); - } } - $gagne = false; + $gagne = true; // TODO : Traitement du code, instant gagnant etc if ($gagne) { $prizeId = $request->prize; @@ -37,9 +37,8 @@ class EnterCodeController extends Controller // Page perdu si jeu non 100% gagnant, reduction sinon $perdant = false; $nbDefaultPrize = Prizes::where('is_default', 1)->count(); - if ($nbDefaultPrize === 0 ) { + if ($nbDefaultPrize === 0) $perdant = true; - } if ($perdant) { return view('front.basic.loose'); diff --git a/app/Http/Controllers/LoginController.php b/app/Http/Controllers/LoginController.php index 3a99376..bbca4b3 100644 --- a/app/Http/Controllers/LoginController.php +++ b/app/Http/Controllers/LoginController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use App\Mail\PasswordReset; use App\Mail\VerifyEmail; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; @@ -9,6 +10,7 @@ use Illuminate\Support\Str; use App\User; use CPCConnection; use Exception; +use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Mail; class LoginController extends Controller @@ -85,4 +87,45 @@ class LoginController extends Controller $result = true; return view('front.basic.confirm-email', compact('result')); } + + public function forgotPassword($token = null) { + if ($token) { + $tokenValid = false; + $user = User::where('password_token', $token)->first(); + if (!$user) + return view('front.basic.forgot-password', compact('tokenValid'))->withErrors('Le lien de changement du mot de passe est incorrect.'); + $tokenValid = true; + return view('front.basic.forgot-password', compact('tokenValid', 'token')); + } else { + return view('front.basic.forgot-password'); + } + } + + public function mailPassword(Request $request) { + $email = filter_var($request->email, FILTER_SANITIZE_STRING); + $user = User::where('email', $email)->first(); + if ($user) { + $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).'); + } else { + return redirect()->back()->withInput($email)->withErrors("Le mail que vous avez entré n'est pas enregistré dans nos services."); + } + } + + 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 redirect()->back()->withErrors('Le lien de changement de votre mot de passe est incorrect, veuillez réessayer.'); + $newPassword = $request->password; + $user->password = Hash::make($newPassword); + $user->password_token = null; + $user->save(); + return redirect()->route('login')->with('success', 'Vous pouvez désormais vous connecter avec votre nouveau mot de passe.'); + } } diff --git a/app/Http/Controllers/RegisterController.php b/app/Http/Controllers/RegisterController.php index 3ddd282..9b7b341 100644 --- a/app/Http/Controllers/RegisterController.php +++ b/app/Http/Controllers/RegisterController.php @@ -50,7 +50,7 @@ class RegisterController extends Controller $request->validate([ 'lastname' => 'required|string|max:255', 'firstname' => 'required|string|max:255', - 'birth_date' => 'required|date|before_or_equal:' . Carbon::now()->subYear(18)->toDateString(), + 'birth_date' => 'required|date|before_or_equal:' . Carbon::now()->subYears(18)->toDateString(), 'email' => 'required|string|email|max:255|unique:users|confirmed', 'password' => 'required|string|min:8|confirmed', 'address' => 'required|string|max:255', diff --git a/app/Http/Controllers/VerificationController.php b/app/Http/Controllers/VerificationController.php deleted file mode 100644 index cd04ba5..0000000 --- a/app/Http/Controllers/VerificationController.php +++ /dev/null @@ -1,21 +0,0 @@ -first(); - if ($user != null) { - $user->email_verified_at = now(); - $user->save(); - return true; - } else { - return false; - } - } -} diff --git a/app/Http/Controllers/WinningProofController.php b/app/Http/Controllers/WinningProofController.php index 261e566..f99d4d9 100644 --- a/app/Http/Controllers/WinningProofController.php +++ b/app/Http/Controllers/WinningProofController.php @@ -2,7 +2,10 @@ namespace App\Http\Controllers; +use App\Mail\WinningProof; +use App\Models\Settings; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Mail; class WinningProofController extends Controller { @@ -38,18 +41,28 @@ class WinningProofController extends Controller 'barcode' => 'required|mimes:jpeg,png,jpg,pdf|max:1536', ]); - // TODO : Ajouter les infos à la table Participation + // TODO : Ajouter les infos à la table Participation et envoyé les infos code unique et ean si utilisé au mail // TODO : Enregistrement des images dans des dossiers /fichiers/preuve-gain/{id-participaction}/{nom-fichier}-[sticker/ticket/barcode].png $participationId = 364581; // Pour test, à supprimer $stickerFileName = $participationId . '-sticker.' . $sticker->extension(); $sticker->move(public_path('fichiers/preuve-de-gain/' . $participationId . '/'), $stickerFileName); + $stickerPath = 'fichiers/preuve-de-gain/' . $participationId . '/' . $stickerFileName; $ticketFileName = $participationId . '-ticket.' . $ticket->extension(); $ticket->move(public_path('fichiers/preuve-de-gain/' . $participationId . '/'), $ticketFileName); + $ticketPath = 'fichiers/preuve-de-gain/' . $participationId . '/' . $ticketFileName; $barcodeFileName = $participationId . '-code-barre.' . $barcode->extension(); $barcode->move(public_path('fichiers/preuve-de-gain/' . $participationId . '/'), $barcodeFileName); + $barcodePath = 'fichiers/preuve-de-gain/' . $participationId . '/' . $barcodeFileName; + + $settings = Settings::find(1); + $mails = json_decode($settings->notification_emails); + foreach ($mails as $mail) { + // TODO : Donné la participation au mail + Mail::to($mail)->send(new WinningProof($stickerPath, $ticketPath, $barcodePath)); + } return view('front.basic.replay'); } diff --git a/app/Http/Controllers/bo/CodesController.php b/app/Http/Controllers/bo/CodesController.php new file mode 100644 index 0000000..87fa53e --- /dev/null +++ b/app/Http/Controllers/bo/CodesController.php @@ -0,0 +1,26 @@ +count(); + $nbCodeUsed = Codes::where('code_used', 1)->count(); + return view('bo.codes.index', compact('nbCodeBase', 'nbCodeUsed')); + } + + public function generate(Request $request) { + $quantity = $request->quantity; + $codeLength = $request->code_length; + + ProcessUniqueCode::dispatch($quantity, $codeLength); + + return redirect()->back()->with('success', "La génération à commencée, un mail de notification sera envoyé à l'adresse " . config('mail.MAIL_ADMIN') . " lorsque le traitement sera terminé."); + } +} diff --git a/app/Jobs/ProcessUniqueCode.php b/app/Jobs/ProcessUniqueCode.php new file mode 100644 index 0000000..5f66a65 --- /dev/null +++ b/app/Jobs/ProcessUniqueCode.php @@ -0,0 +1,80 @@ +quantity = $quantity; + $this->length = $length; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + set_time_limit(0); + for ($ib = 1; $ib <= $this->quantity;) { + try { + $code = new Codes(); + $code->code_unique = $this->getCode($this->length); + $code->code_used = 0; + $code->date_creation = now(); + $code->save(); + if ($code){ + $ib++; + } + } catch (\PDOException $e) { + if (!strpos($e->getMessage(), 'Duplicate entry')){ + die($e->getMessage()); + } + } + } + // ---- Fin de la génération + Mail::to(config('mail.MAIL_ADMIN'))->send(new CodeGenerationEnd($this->quantity)); + } + + private function getCode($car){ + $chaine = "ABCDEFGHJKMNPQRSTUWXYZ123456789"; // Caractères autorisés + $valprec = ""; + $string = ""; + srand(); + for ($i = 0; $i < $car;) { + $val = $chaine[rand() % strlen($chaine)]; + if ($val != $valprec){ + $string .= $val; + $valprec = $val; + $i++; + } + } + return $string; + } + + public function failed(Exception $exception) { + Mail::to(config('mail.MAIL_ADMIN'))->send(new JobFailed("ProcessUniqueCode", ['message' => $exception->getMessage(), 'trace' => $exception->getTraceAsString()])); + } +} diff --git a/app/Mail/CodeGenerationEnd.php b/app/Mail/CodeGenerationEnd.php new file mode 100644 index 0000000..f19ec08 --- /dev/null +++ b/app/Mail/CodeGenerationEnd.php @@ -0,0 +1,33 @@ +quantity = $quantity; + } + + /** + * Build the message. + * + * @return $this + */ + public function build() + { + return $this->subject('Fin de génération des codes uniques')->view('bo.mails.generate-end-email')->with('quantity', $this->quantity); + } +} diff --git a/app/Mail/JobFailed.php b/app/Mail/JobFailed.php new file mode 100644 index 0000000..b7ae4ab --- /dev/null +++ b/app/Mail/JobFailed.php @@ -0,0 +1,29 @@ +job = $job; + $this->exception = $exception; + } + /** + * Build the message. + * + * @return $this + */ + public function build() { + return $this->subject('[JOB FAILED] Une erreur est survenue pendant le job : ' . $this->job)->view('bo.mails.job-failed'); + } +} diff --git a/app/Mail/PasswordReset.php b/app/Mail/PasswordReset.php new file mode 100644 index 0000000..0f53698 --- /dev/null +++ b/app/Mail/PasswordReset.php @@ -0,0 +1,35 @@ +user = $user; + } + + /** + * Build the message. + * + * @return $this + */ + public function build() + { + return $this->subject('Changement de votre mot de passe')->view('front.basic.password-email')->with('user', $this->user); + } +} diff --git a/app/Mail/VerifyEmail.php b/app/Mail/VerifyEmail.php index 807450d..43e2960 100644 --- a/app/Mail/VerifyEmail.php +++ b/app/Mail/VerifyEmail.php @@ -9,7 +9,7 @@ use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; use Illuminate\Support\Facades\Auth; -class VerifyEmail extends Mailable +class VerifyEmail extends Mailable implements ShouldQueue { use Queueable, SerializesModels; diff --git a/app/Mail/WinningProof.php b/app/Mail/WinningProof.php new file mode 100644 index 0000000..be61f10 --- /dev/null +++ b/app/Mail/WinningProof.php @@ -0,0 +1,37 @@ +sticker = $sticker; + $this->ticket = $ticket; + $this->barcode = $barcode; + } + + /** + * Build the message. + * + * @return $this + */ + public function build() + { + return $this->view('front.basic.winning-proof-email')->attach($this->sticker)->attach($this->ticket)->attach($this->barcode); + } +} diff --git a/app/Models/Codes.php b/app/Models/Codes.php new file mode 100644 index 0000000..3d6a379 --- /dev/null +++ b/app/Models/Codes.php @@ -0,0 +1,11 @@ + env('MAIL_MAILER', 'smtp'), + // Mail admin pour l'envoi de mail comme la fin de la génération des codes uniques + 'MAIL_ADMIN' => env('MAIL_ADMIN'), + /* |-------------------------------------------------------------------------- | Mailer Configurations diff --git a/database/migrations/2014_10_12_000000_create_users_table.php b/database/migrations/2014_10_12_000000_create_users_table.php index f709145..479eecf 100644 --- a/database/migrations/2014_10_12_000000_create_users_table.php +++ b/database/migrations/2014_10_12_000000_create_users_table.php @@ -30,6 +30,7 @@ class CreateUsersTable extends Migration $table->string('phone')->nullable(); $table->string('email_verify_token'); $table->boolean('email_verified')->default(0); + $table->string('password_token')->nullable(); $table->integer('role')->default(2); $table->rememberToken(); $table->timestamps(); diff --git a/database/migrations/2020_11_02_120718_create_jobs_table.php b/database/migrations/2020_11_02_120718_create_jobs_table.php new file mode 100644 index 0000000..1be9e8a --- /dev/null +++ b/database/migrations/2020_11_02_120718_create_jobs_table.php @@ -0,0 +1,36 @@ +bigIncrements('id'); + $table->string('queue')->index(); + $table->longText('payload'); + $table->unsignedTinyInteger('attempts'); + $table->unsignedInteger('reserved_at')->nullable(); + $table->unsignedInteger('available_at'); + $table->unsignedInteger('created_at'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('jobs'); + } +} diff --git a/resources/views/bo/codes/index.blade.php b/resources/views/bo/codes/index.blade.php new file mode 100644 index 0000000..4d3ed0f --- /dev/null +++ b/resources/views/bo/codes/index.blade.php @@ -0,0 +1,41 @@ +@extends('layouts.bo') + +@section('content') +
+
+ Gestion des codes uniques +
+ +
+ @csrf +
+ @if ($errors->any()) +
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif + @if (session('success')) +
+ {{ session('success') }} +
+ @endif +

Nombre de code(s) en base : {{$nbCodeBase}}

+

Nombre de code(s) utilisé(s) : {{$nbCodeUsed}}

+
+
+ + + + +
+
+ +
+
+@endsection diff --git a/resources/views/bo/mails/generate-end-email.blade.php b/resources/views/bo/mails/generate-end-email.blade.php new file mode 100644 index 0000000..fde5ff0 --- /dev/null +++ b/resources/views/bo/mails/generate-end-email.blade.php @@ -0,0 +1 @@ +

Génération des {{$quantity}} codes uniques terminés sur le jeu {{$settingsGlobal->name}}.

diff --git a/resources/views/bo/mails/job-failed.blade.php b/resources/views/bo/mails/job-failed.blade.php new file mode 100644 index 0000000..ba1b050 --- /dev/null +++ b/resources/views/bo/mails/job-failed.blade.php @@ -0,0 +1,17 @@ + + + + + + + + + +

+ Job : {{ $job }}

+ Exception : {{ $exception['message'] }}

+ Trace :
+ {{ $exception['trace'] }} +

+ + diff --git a/resources/views/front/basic/forgot-password.blade.php b/resources/views/front/basic/forgot-password.blade.php new file mode 100644 index 0000000..1af7fed --- /dev/null +++ b/resources/views/front/basic/forgot-password.blade.php @@ -0,0 +1,92 @@ +@extends('front.basic.layout') + +@section('title', 'Mot de passe oublié') + +@section('content') +
+
+
+
+ @if (!isset($tokenValid) || !$tokenValid) +
Mot de passe oublié
+ +
+
+ @method('PUT') + @csrf + @if ($errors->any()) +
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif + @if (session('success')) +
+ {{ session('success') }} +
+ @endif + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ @elseif ($tokenValid) +
Changement de votre mot de passe
+ +
+
+ @method('PUT') + @csrf + @if ($errors->any()) +
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif + @if (session('success')) +
+ {{ session('success') }} +
+ @endif + +
+ + +
+
+ + +
+ +
+
+ + +
+
+
+
+ @endif +
+
+
+
+@endsection diff --git a/resources/views/front/basic/gain1.blade.php b/resources/views/front/basic/gain1.blade.php index e0d1552..4635513 100644 --- a/resources/views/front/basic/gain1.blade.php +++ b/resources/views/front/basic/gain1.blade.php @@ -6,5 +6,5 @@ @section('content')

Vous avez gagné {{$prize->label_one}} !

-

Rejouer !

+

Envoyer mes preuves de gain

@endsection diff --git a/resources/views/front/basic/login.blade.php b/resources/views/front/basic/login.blade.php index b8d0e39..b05a676 100644 --- a/resources/views/front/basic/login.blade.php +++ b/resources/views/front/basic/login.blade.php @@ -7,7 +7,7 @@
-
{{ __('Login') }}
+
ConnexionInscription
@@ -28,7 +28,7 @@ @endif
- +
@@ -36,7 +36,7 @@
- +
@@ -49,7 +49,7 @@
@@ -57,16 +57,8 @@
- - Inscription - - @if (Route::has('password.request')) - - {{ __('Forgot Your Password?') }} - - @endif + + Mot de passe oublié ?
diff --git a/resources/views/front/basic/password-email.blade.php b/resources/views/front/basic/password-email.blade.php new file mode 100644 index 0000000..f00a294 --- /dev/null +++ b/resources/views/front/basic/password-email.blade.php @@ -0,0 +1,5 @@ +

Bonjour {{$user->firstname}},

+

Nous avons reçu une demande de changement de mot de passe pour votre compte {{$settingsGlobal->name}}.

+

Si vous êtes à l'origine de cette demande, veuillez cliquer sur le lien ci-dessous pour poursuivre votre changement :

+Changer mon mot de passe +

{{$settingsGlobal->name}} - {{$settingsGlobal->company}}

diff --git a/resources/views/front/basic/winning-proof-email.blade.php b/resources/views/front/basic/winning-proof-email.blade.php new file mode 100644 index 0000000..3b6845f --- /dev/null +++ b/resources/views/front/basic/winning-proof-email.blade.php @@ -0,0 +1,19 @@ +

Bonjour,

+

Vous trouverez en PJ les preuves de gain du joueur suivant :

+

+ Lot : {{$prize->label_one ?? ''}}
+ {{Auth::user()->lastname}} {{Auth::user()->firstname}}
+ {{Auth::user()->address}}
+ @if (Auth::user()->address2 !== null) + {{Auth::user()->address2}}
+ @endif + {{Auth::user()->postal_code}} {{Auth::user()->town}} - {{Auth::user()->country}}
+ {{Auth::user()->email}} +

+

Codes utilisés :

+

+ @if (isset($codeEan)) + Code On Pack : {{$codeEan}}
+ @endif + Code Unique : {{$codeUnique ?? ''}} +

diff --git a/resources/views/layouts/bo.blade.php b/resources/views/layouts/bo.blade.php index b4f9ad9..686234d 100644 --- a/resources/views/layouts/bo.blade.php +++ b/resources/views/layouts/bo.blade.php @@ -85,6 +85,7 @@ Instant gagnants Code EAN + Social share Liste des gagnants IP Bannies @@ -103,6 +104,7 @@ Questions
+ Codes uniques
diff --git a/routes/web.php b/routes/web.php index 1ebd261..a5be943 100644 --- a/routes/web.php +++ b/routes/web.php @@ -24,6 +24,9 @@ Route::get('/faq', 'FAQController@index')->name('faq'); Route::get('/comment-jouer', 'HowToPlayController@index')->name('comment-jouer'); Route::get('/les-gains', 'GainsController@index')->name('les-gains'); Route::get('/confirm-email/{verifyToken}', 'LoginController@confirmEmail')->name('confirm-email'); +Route::get('/mdp-oublie/{token?}', 'LoginController@forgotPassword')->name('forgot-password'); +Route::put('/mail-mdp', 'LoginController@mailPassword')->name('mail-password'); +Route::put('/change-mdp', 'LoginController@changePassword')->name('change-password'); // Front nécessitant d'être connecté Route::get('/saisir-code', 'EnterCodeController@index')->name('saisir-code')->middleware('auth'); @@ -77,4 +80,7 @@ Route::namespace('Bo') Route::get('/faq-questions', 'FaqQuestionsController@index')->name('faq-questions'); Route::post('/ajax/delete-faq-question', 'FaqQuestionsController@destroy'); Route::post('/ajax/save-faq-question', 'FaqQuestionsController@saveDatas'); + // Codes uniques + Route::get('/codes', 'CodesController@index')->name('codes'); + Route::post('/codes', 'CodesController@generate')->name('generate-codes'); });