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') +
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'] }}
+
Vous avez gagné {{$prize->label_one}} !
- + @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 @@