From a7ac890c17ee5fba6d5b66bedc80d9c9a3d7827c Mon Sep 17 00:00:00 2001 From: Sam DEPARDIEU Date: Mon, 23 Mar 2026 23:06:33 +0100 Subject: [PATCH] =?UTF-8?q?ajout=20de=20la=20fonctionnalit=C3=A9=20login?= =?UTF-8?q?=20et=20modification=20profil?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/LoginController.php | 96 +++++++++++ app/Http/Controllers/ProfileController.php | 59 +++++++ app/Models/Activite.php | 37 +++- app/Models/ActiviteMessage.php | 33 ++++ app/Models/Categorie.php | 14 +- app/Models/Commentaire.php | 39 ++++- app/Models/Ressource.php | 56 ++++-- app/Models/Role.php | 13 +- app/Models/TypeRessource.php | 13 +- app/Models/Utilisateur.php | 68 ++++++-- app/Models/Utilisateur_Progression.php | 35 ++++ config/auth.php | 14 +- ...26_03_23_120000_create_database_schema.php | 122 +++++++++++++ ...03_23_211437_create_utilisateurs_table.php | 5 + database/seeders/RoleSeeder.php | 16 ++ resources/views/connexion/login.blade.php | 35 +++- resources/views/connexion/register.blade.php | 60 ++++++- resources/views/layout/header.blade.php | 38 ++++- resources/views/profile/settings.blade.php | 160 ++++++++++++++++++ routes/web.php | 21 ++- 20 files changed, 867 insertions(+), 67 deletions(-) create mode 100644 app/Http/Controllers/LoginController.php create mode 100644 app/Http/Controllers/ProfileController.php create mode 100644 app/Models/ActiviteMessage.php create mode 100644 app/Models/Utilisateur_Progression.php create mode 100644 database/migrations/2026_03_23_120000_create_database_schema.php create mode 100644 database/seeders/RoleSeeder.php create mode 100644 resources/views/profile/settings.blade.php diff --git a/app/Http/Controllers/LoginController.php b/app/Http/Controllers/LoginController.php new file mode 100644 index 0000000..da4b774 --- /dev/null +++ b/app/Http/Controllers/LoginController.php @@ -0,0 +1,96 @@ +validate([ + 'Email' => ['required', 'email'], + 'MotDePasse' => ['required'], + ], [ + 'Email.required' => 'L\'email est requis.', + 'Email.email' => 'Veuillez entrer une adresse email valide.', + 'MotDePasse.required' => 'Le mot de passe est requis.', + ]); + + // Renommer les clés pour correspondre aux colonnes de la base de données + $loginCredentials = [ + 'Email' => $request->Email, + 'password' => $request->MotDePasse, + ]; + + if (Auth::attempt($loginCredentials)) { + $request->session()->regenerate(); + return redirect()->route('home')->with('success', 'Connexion réussie!'); + } + + return back()->withErrors([ + 'Email' => 'Les identifiants fournis sont incorrects.', + ])->onlyInput('Email'); + } + + // Afficher le formulaire d'inscription + public function register() + { + return view('connexion.register'); + } + + // Traiter l'inscription + public function storeRegister(Request $request) + { + $request->validate([ + 'Pseudo' => ['required', 'string', 'max:100', 'unique:utilisateurs,Pseudo'], + 'Email' => ['required', 'string', 'email', 'max:255', 'unique:utilisateurs,Email'], + 'MotDePasse' => ['required', 'string', 'min:8', 'confirmed'], + ], [ + 'Pseudo.required' => 'Le pseudo est requis.', + 'Pseudo.unique' => 'Ce pseudo est déjà utilisé.', + 'Email.required' => 'L\'email est requis.', + 'Email.email' => 'Veuillez entrer une adresse email valide.', + 'Email.unique' => 'Cet email est déjà utilisé.', + 'MotDePasse.required' => 'Le mot de passe est requis.', + 'MotDePasse.min' => 'Le mot de passe doit contenir au moins 8 caractères.', + 'MotDePasse.confirmed' => 'Les mots de passe ne correspondent pas.', + ]); + + // Récupérer le rôle par défaut "Utilisateur" + $roleUtilisateur = Role::where('Nom', 'Utilisateur')->firstOrCreate(['Nom' => 'Utilisateur']); + + $user = Utilisateur::create([ + 'Pseudo' => $request->Pseudo, + 'Email' => $request->Email, + 'MotDePasse' => Hash::make($request->MotDePasse), + 'ID_Role' => $roleUtilisateur->ID_Role, + 'Statut' => 'Actif', + ]); + + Auth::login($user); + + return redirect()->route('home')->with('success', 'Inscription réussie! Bienvenue!'); + } + + // Déconnexion + public function logout(Request $request) + { + Auth::logout(); + $request->session()->invalidate(); + $request->session()->regenerateToken(); + + return redirect()->route('home')->with('success', 'Vous avez été déconnecté.'); + } +} diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php new file mode 100644 index 0000000..80f8b87 --- /dev/null +++ b/app/Http/Controllers/ProfileController.php @@ -0,0 +1,59 @@ +validate([ + 'Pseudo' => ['required', 'string', 'max:100', 'unique:utilisateurs,Pseudo,' . $user->ID_Utilisateur . ',ID_Utilisateur'], + 'Email' => ['required', 'string', 'email', 'max:255', 'unique:utilisateurs,Email,' . $user->ID_Utilisateur . ',ID_Utilisateur'], + 'MotDePasse_Actuel' => ['nullable', 'string'], + 'MotDePasse_Nouveau' => ['nullable', 'string', 'min:8', 'confirmed'], + ], [ + 'Pseudo.required' => 'Le pseudo est requis.', + 'Pseudo.unique' => 'Ce pseudo est déjà utilisé.', + 'Email.required' => 'L\'email est requis.', + 'Email.email' => 'Veuillez entrer une adresse email valide.', + 'Email.unique' => 'Cet email est déjà utilisé.', + 'MotDePasse_Actuel.required_with' => 'Vous devez entrer votre mot de passe actuel pour le modifier.', + 'MotDePasse_Nouveau.min' => 'Le mot de passe doit contenir au moins 8 caractères.', + 'MotDePasse_Nouveau.confirmed' => 'Les mots de passe ne correspondent pas.', + ]); + + // Vérifier le mot de passe actuel si on veut le modifier + if ($request->filled('MotDePasse_Nouveau')) { + if (!Hash::check($request->MotDePasse_Actuel, $user->MotDePasse)) { + return back()->withErrors([ + 'MotDePasse_Actuel' => 'Le mot de passe actuel est incorrect.', + ])->onlyInput('Email', 'Pseudo'); + } + $user->MotDePasse = Hash::make($request->MotDePasse_Nouveau); + } + + // Mettre à jour le pseudo et l'email + $user->Pseudo = $request->Pseudo; + $user->Email = $request->Email; + $user->save(); + + return back()->with('success', 'Votre profil a été mis à jour avec succès!'); + } +} diff --git a/app/Models/Activite.php b/app/Models/Activite.php index 2723f8a..f826c2a 100644 --- a/app/Models/Activite.php +++ b/app/Models/Activite.php @@ -6,5 +6,40 @@ use Illuminate\Database\Eloquent\Model; class Activite extends Model { - // + protected $primaryKey = 'ID_Instance'; + protected $table = 'activites'; + public $incrementing = true; + public $timestamps = false; + + protected $fillable = [ + 'DateDebut', + 'DateFin', + 'ID_Utilisateur_Hote', + 'ID_Ressource', + ]; + + protected $casts = [ + 'DateDebut' => 'datetime', + 'DateFin' => 'datetime', + ]; + + public function hote() + { + return $this->belongsTo(Utilisateur::class, 'ID_Utilisateur_Hote', 'ID_Utilisateur'); + } + + public function ressource() + { + return $this->belongsTo(Ressource::class, 'ID_Ressource', 'ID_Ressource'); + } + + public function messages() + { + return $this->hasMany(ActiviteMessage::class, 'ID_Instance', 'ID_Instance'); + } + + public function participants() + { + return $this->belongsToMany(Utilisateur::class, 'activite_participants', 'ID_Instance', 'ID_Utilisateur_Participant', 'ID_Instance', 'ID_Utilisateur'); + } } diff --git a/app/Models/ActiviteMessage.php b/app/Models/ActiviteMessage.php new file mode 100644 index 0000000..140d96f --- /dev/null +++ b/app/Models/ActiviteMessage.php @@ -0,0 +1,33 @@ + 'datetime', + ]; + + public function emetteur() + { + return $this->belongsTo(Utilisateur::class, 'ID_Utilisateur_Emetteur', 'ID_Utilisateur'); + } + + public function activite() + { + return $this->belongsTo(Activite::class, 'ID_Instance', 'ID_Instance'); + } +} diff --git a/app/Models/Categorie.php b/app/Models/Categorie.php index 959566c..7e66e27 100644 --- a/app/Models/Categorie.php +++ b/app/Models/Categorie.php @@ -6,5 +6,17 @@ use Illuminate\Database\Eloquent\Model; class Categorie extends Model { - // + public $timestamps = false; + protected $primaryKey = 'ID_Categorie'; + protected $table = 'categories'; + + protected $fillable = [ + 'Nom', + 'Description', + ]; + + public function ressources() + { + return $this->belongsToMany(Ressource::class, 'ressource_categories', 'ID_Categorie', 'ID_Ressource', 'ID_Categorie', 'ID_Ressource'); + } } diff --git a/app/Models/Commentaire.php b/app/Models/Commentaire.php index 6158887..c00e596 100644 --- a/app/Models/Commentaire.php +++ b/app/Models/Commentaire.php @@ -4,15 +4,42 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; -class Commentaire extends Model { +class Commentaire extends Model +{ protected $primaryKey = 'ID_Commentaire'; + protected $table = 'commentaires'; + public $incrementing = true; - public function auteur() { - return $this->belongsTo(Utilisateur::class, 'ID_Utilisateur'); + protected $fillable = [ + 'Texte', + 'Statut', + 'ID_Parent_Commentaire', + 'ID_Utilisateur', + 'ID_Ressource', + ]; + + protected $casts = [ + 'DatePublication' => 'datetime', + ]; + + public function auteur() + { + return $this->belongsTo(Utilisateur::class, 'ID_Utilisateur', 'ID_Utilisateur'); } - // Relation récursive pour les réponses aux commentaires [cite: 60, 275] - public function reponses() { - return $this->hasMany(Commentaire::class, 'ID_Parent_Commentaire'); + public function ressource() + { + return $this->belongsTo(Ressource::class, 'ID_Ressource', 'ID_Ressource'); + } + + // Relation récursive pour les réponses aux commentaires + public function reponses() + { + return $this->hasMany(Commentaire::class, 'ID_Parent_Commentaire', 'ID_Commentaire'); + } + + public function parent() + { + return $this->belongsTo(Commentaire::class, 'ID_Parent_Commentaire', 'ID_Commentaire'); } } \ No newline at end of file diff --git a/app/Models/Ressource.php b/app/Models/Ressource.php index 7d51091..e89d7a5 100644 --- a/app/Models/Ressource.php +++ b/app/Models/Ressource.php @@ -4,23 +4,59 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; -class Ressource extends Model { +class Ressource extends Model +{ protected $primaryKey = 'ID_Ressource'; + protected $table = 'ressources'; + public $incrementing = true; - public function type() { - return $this->belongsTo(TypeRessource::class, 'ID_Type_Ressource'); + protected $fillable = [ + 'Titre', + 'Contenu', + 'URL', + 'Visibilite', + 'Statut', + 'ID_Type_Ressource', + 'ID_Moderateur_Validation', + 'ID_Utilisateur_Createur', + ]; + + protected $casts = [ + 'DateCreation' => 'datetime', + ]; + + public function type() + { + return $this->belongsTo(TypeRessource::class, 'ID_Type_Ressource', 'ID_Type_Ressource'); } - public function categories() { - // Relation Many-to-Many via la table pivot Ressource_Categorie [cite: 175] - return $this->belongsToMany(Categorie::class, 'Ressource_Categorie', 'ID_Ressource', 'ID_Categorie'); + public function categories() + { + return $this->belongsToMany(Categorie::class, 'ressource_categories', 'ID_Ressource', 'ID_Categorie', 'ID_Ressource', 'ID_Categorie'); } - public function createur() { - return $this->belongsTo(Utilisateur::class, 'ID_Utilisateur_Createur'); + public function createur() + { + return $this->belongsTo(Utilisateur::class, 'ID_Utilisateur_Createur', 'ID_Utilisateur'); } - public function commentaires() { - return $this->hasMany(Commentaire::class, 'ID_Ressource'); + public function moderateur() + { + return $this->belongsTo(Utilisateur::class, 'ID_Moderateur_Validation', 'ID_Utilisateur'); + } + + public function commentaires() + { + return $this->hasMany(Commentaire::class, 'ID_Ressource', 'ID_Ressource'); + } + + public function activites() + { + return $this->hasMany(Activite::class, 'ID_Ressource', 'ID_Ressource'); + } + + public function progressions() + { + return $this->hasMany(Utilisateur_Progression::class, 'ID_Ressource', 'ID_Ressource'); } } \ No newline at end of file diff --git a/app/Models/Role.php b/app/Models/Role.php index 3f2c7fc..826fa4b 100644 --- a/app/Models/Role.php +++ b/app/Models/Role.php @@ -6,5 +6,16 @@ use Illuminate\Database\Eloquent\Model; class Role extends Model { - // + public $timestamps = false; + protected $primaryKey = 'ID_Role'; + protected $table = 'roles'; + + protected $fillable = [ + 'Nom', + ]; + + public function utilisateurs() + { + return $this->hasMany(Utilisateur::class, 'ID_Role', 'ID_Role'); + } } diff --git a/app/Models/TypeRessource.php b/app/Models/TypeRessource.php index 2ef7af4..d706696 100644 --- a/app/Models/TypeRessource.php +++ b/app/Models/TypeRessource.php @@ -6,5 +6,16 @@ use Illuminate\Database\Eloquent\Model; class TypeRessource extends Model { - // + public $timestamps = false; + protected $primaryKey = 'ID_Type_Ressource'; + protected $table = 'type_ressources'; + + protected $fillable = [ + 'Format', + ]; + + public function ressources() + { + return $this->hasMany(Ressource::class, 'ID_Type_Ressource', 'ID_Type_Ressource'); + } } diff --git a/app/Models/Utilisateur.php b/app/Models/Utilisateur.php index 3c06406..f348336 100644 --- a/app/Models/Utilisateur.php +++ b/app/Models/Utilisateur.php @@ -1,42 +1,76 @@ 'encrypted', 'MotDePasse' => 'hashed', 'DateInscription' => 'datetime', ]; + + // Utiliser Email comme authentifiant + public function getAuthIdentifierName() + { + return 'Email'; + } + + // Relation avec Role + public function role() + { + return $this->belongsTo(Role::class, 'ID_Role', 'ID_Role'); + } + + // Relation avec Ressources créées + public function ressourcesCreees() + { + return $this->hasMany(Ressource::class, 'ID_Utilisateur_Createur', 'ID_Utilisateur'); + } + + // Relation avec Commentaires + public function commentaires() + { + return $this->hasMany(Commentaire::class, 'ID_Utilisateur', 'ID_Utilisateur'); + } + + // Relation avec Activites hôtées + public function activitesHotees() + { + return $this->hasMany(Activite::class, 'ID_Utilisateur_Hote', 'ID_Utilisateur'); + } + + // Relation avec Progressions + public function progressions() + { + return $this->hasMany(Utilisateur_Progression::class, 'ID_Utilisateur', 'ID_Utilisateur'); + } } \ No newline at end of file diff --git a/app/Models/Utilisateur_Progression.php b/app/Models/Utilisateur_Progression.php new file mode 100644 index 0000000..4637f40 --- /dev/null +++ b/app/Models/Utilisateur_Progression.php @@ -0,0 +1,35 @@ + 'boolean', + ]; + + public function utilisateur() + { + return $this->belongsTo(Utilisateur::class, 'ID_Utilisateur', 'ID_Utilisateur'); + } + + public function ressource() + { + return $this->belongsTo(Ressource::class, 'ID_Ressource', 'ID_Ressource'); + } +} diff --git a/config/auth.php b/config/auth.php index d7568ff..603b45e 100644 --- a/config/auth.php +++ b/config/auth.php @@ -1,6 +1,6 @@ [ 'guard' => env('AUTH_GUARD', 'web'), - 'passwords' => env('AUTH_PASSWORD_BROKER', 'users'), + 'passwords' => env('AUTH_PASSWORD_BROKER', 'utilisateurs'), ], /* @@ -64,12 +64,12 @@ return [ 'providers' => [ 'users' => [ 'driver' => 'eloquent', - 'model' => env('AUTH_MODEL', User::class), + 'model' => env('AUTH_MODEL', Utilisateur::class), ], // 'users' => [ // 'driver' => 'database', - // 'table' => 'users', + // 'table' => 'utilisateurs', // ], ], @@ -93,6 +93,12 @@ return [ */ 'passwords' => [ + 'utilisateurs' => [ + 'provider' => 'users', + 'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'), + 'expire' => 60, + 'throttle' => 60, + ], 'users' => [ 'provider' => 'users', 'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'), diff --git a/database/migrations/2026_03_23_120000_create_database_schema.php b/database/migrations/2026_03_23_120000_create_database_schema.php new file mode 100644 index 0000000..80ad0b5 --- /dev/null +++ b/database/migrations/2026_03_23_120000_create_database_schema.php @@ -0,0 +1,122 @@ +id('ID_Role'); + $table->string('Nom', 100)->unique(); + }); + + // Créer la table Utilisateur + Schema::create('utilisateurs', function (Blueprint $table) { + $table->id('ID_Utilisateur'); + $table->string('Email', 255)->unique(); + $table->string('MotDePasse', 255); + $table->string('Pseudo', 100)->unique()->nullable(); + $table->timestamp('DateInscription')->useCurrent(); + $table->enum('Statut', ['Actif', 'Inactif'])->default('Actif'); + $table->foreignId('ID_Role')->constrained('roles', 'ID_Role'); + }); + + // Créer la table Type_Ressource + Schema::create('type_ressources', function (Blueprint $table) { + $table->id('ID_Type_Ressource'); + $table->string('Format', 100)->unique(); + }); + + // Créer la table Categorie + Schema::create('categories', function (Blueprint $table) { + $table->id('ID_Categorie'); + $table->string('Nom', 100); + $table->text('Description')->nullable(); + }); + + // Créer la table Ressource + Schema::create('ressources', function (Blueprint $table) { + $table->id('ID_Ressource'); + $table->string('Titre', 255); + $table->text('Contenu')->nullable(); + $table->string('URL', 2048)->nullable(); + $table->timestamp('DateCreation')->useCurrent(); + $table->enum('Visibilite', ['Privée', 'Partagée', 'Publique'])->default('Privée'); + $table->enum('Statut', ['En attente', 'Publiée', 'Suspendue', 'Rejetée'])->default('En attente'); + $table->foreignId('ID_Type_Ressource')->constrained('type_ressources', 'ID_Type_Ressource'); + $table->foreignId('ID_Moderateur_Validation')->nullable()->constrained('utilisateurs', 'ID_Utilisateur'); + $table->foreignId('ID_Utilisateur_Createur')->constrained('utilisateurs', 'ID_Utilisateur'); + }); + + // Créer la table Commentaire + Schema::create('commentaires', function (Blueprint $table) { + $table->id('ID_Commentaire'); + $table->text('Texte'); + $table->timestamp('DatePublication')->useCurrent(); + $table->enum('Statut', ['En attente', 'Approuvé', 'Rejeté'])->default('En attente'); + $table->foreignId('ID_Parent_Commentaire')->nullable()->constrained('commentaires', 'ID_Commentaire'); + $table->foreignId('ID_Utilisateur')->constrained('utilisateurs', 'ID_Utilisateur'); + $table->foreignId('ID_Ressource')->constrained('ressources', 'ID_Ressource'); + }); + + // Créer la table Activite + Schema::create('activites', function (Blueprint $table) { + $table->id('ID_Instance'); + $table->timestamp('DateDebut')->useCurrent(); + $table->timestamp('DateFin')->useCurrent(); + $table->foreignId('ID_Utilisateur_Hote')->constrained('utilisateurs', 'ID_Utilisateur'); + $table->foreignId('ID_Ressource')->constrained('ressources', 'ID_Ressource'); + }); + + // Créer la table Activite_Message + Schema::create('activite_messages', function (Blueprint $table) { + $table->id('ID_Message'); + $table->text('Message'); + $table->timestamp('Timestamp')->useCurrent(); + $table->foreignId('ID_Utilisateur_Emetteur')->constrained('utilisateurs', 'ID_Utilisateur'); + $table->foreignId('ID_Instance')->constrained('activites', 'ID_Instance'); + }); + + // Créer la table Ressource_Categorie + Schema::create('ressource_categories', function (Blueprint $table) { + $table->foreignId('ID_Ressource')->constrained('ressources', 'ID_Ressource'); + $table->foreignId('ID_Categorie')->constrained('categories', 'ID_Categorie'); + $table->primary(['ID_Ressource', 'ID_Categorie']); + }); + + // Créer la table Utilisateur_Progression + Schema::create('utilisateur_progressions', function (Blueprint $table) { + $table->foreignId('ID_Utilisateur')->constrained('utilisateurs', 'ID_Utilisateur'); + $table->foreignId('ID_Ressource')->constrained('ressources', 'ID_Ressource'); + $table->enum('Statut_Exploitation', ['Non commencé', 'Exploitée', 'Mis de côté'])->default('Non commencé'); + $table->boolean('Est_Favori')->default(false); + $table->primary(['ID_Utilisateur', 'ID_Ressource']); + }); + + // Créer la table Activite_Participant + Schema::create('activite_participants', function (Blueprint $table) { + $table->foreignId('ID_Instance')->constrained('activites', 'ID_Instance'); + $table->foreignId('ID_Utilisateur_Participant')->constrained('utilisateurs', 'ID_Utilisateur'); + $table->primary(['ID_Instance', 'ID_Utilisateur_Participant']); + }); + } + + public function down(): void + { + Schema::dropIfExists('activite_participants'); + Schema::dropIfExists('utilisateur_progressions'); + Schema::dropIfExists('ressource_categories'); + Schema::dropIfExists('activite_messages'); + Schema::dropIfExists('activites'); + Schema::dropIfExists('commentaires'); + Schema::dropIfExists('ressources'); + Schema::dropIfExists('categories'); + Schema::dropIfExists('type_ressources'); + Schema::dropIfExists('utilisateurs'); + Schema::dropIfExists('roles'); + } +}; diff --git a/database/migrations/2026_03_23_211437_create_utilisateurs_table.php b/database/migrations/2026_03_23_211437_create_utilisateurs_table.php index beb9019..4bb24e8 100644 --- a/database/migrations/2026_03_23_211437_create_utilisateurs_table.php +++ b/database/migrations/2026_03_23_211437_create_utilisateurs_table.php @@ -13,6 +13,11 @@ return new class extends Migration { Schema::create('utilisateurs', function (Blueprint $table) { $table->id(); + $table->string('Email')->unique(); + $table->string('MotDePasse'); + $table->string('Pseudo')->nullable(); + $table->unsignedBigInteger('ID_Role')->nullable(); + $table->string('Statut')->default('Actif'); $table->timestamps(); }); } diff --git a/database/seeders/RoleSeeder.php b/database/seeders/RoleSeeder.php new file mode 100644 index 0000000..d4e63de --- /dev/null +++ b/database/seeders/RoleSeeder.php @@ -0,0 +1,16 @@ + 'Utilisateur']); + Role::firstOrCreate(['Nom' => 'Modérateur']); + Role::firstOrCreate(['Nom' => 'Administrateur']); + } +} diff --git a/resources/views/connexion/login.blade.php b/resources/views/connexion/login.blade.php index 847f687..8ea41f9 100644 --- a/resources/views/connexion/login.blade.php +++ b/resources/views/connexion/login.blade.php @@ -7,16 +7,41 @@

Connexion

-
+ @if ($errors->any()) +
+ @foreach ($errors->all() as $error) +

{{ $error }}

+ @endforeach +
+ @endif + + @csrf
- - + + + @error('Email') +

{{ $message }}

+ @enderror
- - + + + @error('MotDePasse') +

{{ $message }}

+ @enderror
\ No newline at end of file diff --git a/resources/views/profile/settings.blade.php b/resources/views/profile/settings.blade.php new file mode 100644 index 0000000..8722d7c --- /dev/null +++ b/resources/views/profile/settings.blade.php @@ -0,0 +1,160 @@ +@extends('app') + +@section('title', 'Paramètres du Profil - (RE)Sources Relationnelles') + +@section('content') +
+
+ +
+

Paramètres du profil

+

Gérez vos informations personnelles et vos préférences

+
+ + + @if (session('success')) +
+

✅ {{ session('success') }}

+
+ @endif + + + @if ($errors->any()) +
+ @foreach ($errors->all() as $error) +

{{ $error }}

+ @endforeach +
+ @endif + + +
+

Photo de profil

+ +
+
+ Photo de profil +
+
+

Votre photo de profil est générée automatiquement à partir de votre pseudo.

+

Les avatars sont fournis par ui-avatars.com

+
+
+
+ + +
+

Informations personnelles

+ +
+ @csrf + @method('PUT') + + +
+ + + @error('Pseudo') +

{{ $message }}

+ @enderror +
+ + +
+ + + @error('Email') +

{{ $message }}

+ @enderror +
+ +
+ + +
+

Modifier votre mot de passe

+

Laissez vide si vous ne voulez pas le modifier.

+ + +
+ + + @error('MotDePasse_Actuel') +

{{ $message }}

+ @enderror +
+ + +
+ + + @error('MotDePasse_Nouveau') +

{{ $message }}

+ @enderror +
+ + +
+ + +
+
+ + +
+ + + Annuler + +
+
+
+ + +
+

⚠️ Zone de danger

+

Les actions ci-dessous ne peuvent pas être annulées.

+ +
+ @csrf + +
+
+
+
+@endsection diff --git a/routes/web.php b/routes/web.php index 6a9abea..034695a 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1,6 +1,8 @@ name('resources.index'); -Route::get('/login', function () { - return view('auth.login'); -})->name('login'); +// Routes d'authentification +Route::get('/login', [LoginController::class, 'login'])->name('login'); +Route::post('/login', [LoginController::class, 'store'])->name('login.store'); -Route::get('/register', function () { - return view('auth.register'); -})->name('register'); +Route::get('/register', [LoginController::class, 'register'])->name('register'); +Route::post('/register', [LoginController::class, 'storeRegister'])->name('register.store'); + +Route::post('/logout', [LoginController::class, 'logout'])->name('logout'); + +// Routes protégées (authentifiées) +Route::middleware('auth')->group(function () { + Route::get('/profile/settings', [ProfileController::class, 'settings'])->name('profile.settings'); + Route::put('/profile/update', [ProfileController::class, 'update'])->name('profile.update'); +});