Première grosse version fonctionnel

This commit is contained in:
2026-04-22 23:30:31 +02:00
commit ccbe5ad801
329 changed files with 29518 additions and 0 deletions
@@ -0,0 +1,117 @@
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
class AuthController extends Controller
{
// AuthController.php
public function login(Request $request) {
$fields = $request->validate([
'email' => 'required|string|email',
'password' => 'required|string'
]);
// Log::info('Tentative de connexion', $request->all());
$user = User::where('email', $fields['email'])->first();
// Vérification du mot de passe haché (Sécurité)
if(!$user || !Hash::check($fields['password'], $user->password)) {
return response([
'status' => 'error',
'message' => 'Identifiants invalides'
], 401);
}
// Log::info('Email reçu: ' . $request->email);
// Log::info('Password saisi: ' . $request->password);
// Log::info('Hachage en BDD: ' . $user->password);
// Création du Token pour le mobile
$token = $user->createToken('android_token')->plainTextToken;
return response([
'status' => 'success',
'user' => $user,
'token' => $token
], 200);
}
public function register(Request $request)
{
// 1. Validation des données (Standard Qualité)
$validator = Validator::make($request->all(), [
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:8|confirmed',
]);
Log::info('Tentative de création', $request->all());
if ($validator->fails()) {
Log::info( $validator->errors());
return response()->json([
'status' => 'error',
'errors' => $validator->errors()
], 422);
}
// 2. Création de l'utilisateur (Respect du MCD)
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password), // Chiffrement obligatoire
]);
// 3. Génération du token pour le mobile
$token = $user->createToken('android_token')->plainTextToken;
return response()->json([
'status' => 'success',
'message' => 'Compte créé avec succès',
'user' => $user,
'token' => $token
], 201);
}
public function updateProfile(Request $request)
{
$user = $request->user();
$request->validate([
'current_password' => 'required',
'email' => [
'sometimes',
'email',
Rule::unique('users')->ignore($user->id) // Empêche les doublons en BDD
],
]);
// 2. Vérification de sécurité (RGPD/Confidentialité)
if (!Hash::check($request->current_password, $user->password)) {
return response()->json([
'status' => 'error',
'message' => 'Le mot de passe actuel est incorrect'
], 403);
}
// 3. Mise à jour dynamique (Evolutivité)
$data = $request->except(['current_password', 'password', 'id']);
$user->fill($data);
$user->save();
return response()->json([
'status' => 'success',
'user' => $user
]);
}
}
@@ -0,0 +1,42 @@
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\EmotionRecord;
use Illuminate\Support\Facades\Log;
class EmotionController extends Controller
{
public function index(Request $request)
{
return $request->user()->emotionRecords()->latest()->get();
}
public function store(Request $request)
{
Log::info('Tentative d\'enregistrement d\'émotion', [
'user' => $request->user()->id,
'data' => $request->all()
]);
try {
$validated = $request->validate([
'emotion_name' => 'required|string',
'note' => 'nullable|string',
]);
$record = $request->user()->emotionRecords()->create([
'emotion' => $validated['emotion_name'],
'intensity' => 3,
'note' => $validated['note'] ?? 'Saisie depuis CESIZen',
]);
return response()->json($record, 201);
} catch (\Exception $e) {
Log::error('Erreur enregistrement émotion : ' . $e->getMessage());
return response()->json(['error' => 'Erreur serveur'], 500);
}
}
}
@@ -0,0 +1,22 @@
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\StressEvent;
use Illuminate\Http\Request;
class StressDiagnosticController extends Controller
{
public function index()
{
// Retourne les évènements et points pour l'affichage Flutter [cite: 126]
return response()->json(StressEvent::all(), 200);
}
public function getEvents()
{
// Retourne la liste des événements pour le module Diagnostic
return response()->json(StressEvent::all());
}
}
+8
View File
@@ -0,0 +1,8 @@
<?php
namespace App\Http\Controllers;
abstract class Controller
{
//
}
@@ -0,0 +1,25 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
class DashboardController extends Controller
{
public function index()
{
// On récupère l'utilisateur connecté ou des données de démo si non connecté
$user = Auth::user();
// Données pour le dashboard (normalement récupérées en BDD)
$stats = [
'relaxation_time' => '45 min',
'stress_status' => 'Stable',
'last_diagnostic' => 'il y a 3 jours'
];
return view('welcome', compact('user', 'stats'));
}
}
@@ -0,0 +1,66 @@
<?php
namespace App\Http\Controllers\Web;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
class AuthController extends Controller
{
public function showLogin()
{
return view('auth.login');
}
public function login(Request $request)
{
$credentials = $request->validate([
'email' => ['required', 'email'],
'password' => ['required'],
]);
if (Auth::attempt($credentials)) {
$request->session()->regenerate();
return redirect()->intended('/');
}
return back()->withErrors([
'email' => 'Les identifiants fournis ne correspondent pas à nos enregistrements.',
])->onlyInput('email');
}
public function showRegister()
{
return view('auth.register');
}
public function register(Request $request)
{
$request->validate([
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'string', 'min:8', 'confirmed'],
]);
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
]);
Auth::login($user);
return redirect('/');
}
public function logout(Request $request)
{
Auth::logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/login');
}
}
@@ -0,0 +1,30 @@
<?php
namespace App\Http\Controllers\Web;
use App\Http\Controllers\Controller;
use App\Models\StressEvent;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class DiagnosticController extends Controller
{
public function index()
{
$events = StressEvent::all();
return view('diagnostics.index', compact('events'));
}
public function store(Request $request)
{
// Logique pour calculer le score Holmes-Rahe
$totalPoints = 0;
if ($request->has('events')) {
$totalPoints = StressEvent::whereIn('id', $request->events)->sum('points');
}
// Ici on pourrait enregistrer le résultat dans une table 'diagnostic_results'
// Pour l'instant on redirige avec le score
return redirect()->back()->with('score', $totalPoints);
}
}
@@ -0,0 +1,35 @@
<?php
namespace App\Http\Controllers\Web;
use App\Http\Controllers\Controller;
use App\Models\EmotionRecord;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class EmotionController extends Controller
{
public function index()
{
$records = EmotionRecord::where('user_id', Auth::id())->latest()->get();
return view('emotions.index', compact('records'));
}
public function store(Request $request)
{
$request->validate([
'emotion' => 'required|string',
'intensity' => 'required|integer|min:1|max:5',
'note' => 'nullable|string'
]);
EmotionRecord::create([
'user_id' => Auth::id(),
'emotion' => $request->emotion,
'intensity' => $request->intensity,
'note' => $request->note
]);
return redirect()->back()->with('success', 'Émotion enregistrée');
}
}
@@ -0,0 +1,71 @@
<?php
namespace App\Http\Controllers\Web;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\Rules\Password;
class ProfileController extends Controller
{
public function index()
{
return view('profile.index', [
'user' => Auth::user(),
]);
}
public function update(Request $request)
{
$user = Auth::user();
$validated = $request->validate([
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users,email,' . $user->id],
]);
$user->fill($validated);
if ($user->isDirty('email')) {
$user->email_verified_at = null;
}
$user->save();
return redirect()->route('profile.index')->with('status', 'profile-updated');
}
public function updatePassword(Request $request)
{
$validated = $request->validateWithBag('updatePassword', [
'current_password' => ['required', 'current_password'],
'password' => ['required', Password::defaults(), 'confirmed'],
]);
$request->user()->update([
'password' => Hash::make($validated['password']),
]);
return redirect()->route('profile.index')->with('status', 'password-updated');
}
public function destroy(Request $request)
{
$request->validateWithBag('userDeletion', [
'password' => ['required', 'current_password'],
]);
$user = $request->user();
Auth::logout();
$user->delete();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/');
}
}
@@ -0,0 +1,38 @@
<?php
namespace App\Http\Controllers\Web;
use App\Http\Controllers\Controller;
use App\Models\RelaxationActivity;
use App\Models\Favorite;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class RelaxationController extends Controller
{
public function index()
{
$activities = RelaxationActivity::all();
$favorites = Auth::check() ? Auth::user()->favoritedBy->pluck('id')->toArray() : [];
return view('relaxation.index', compact('activities', 'favorites'));
}
public function toggleFavorite($id)
{
$userId = Auth::id();
$favorite = Favorite::where('user_id', $userId)
->where('relaxation_activity_id', $id)
->first();
if ($favorite) {
$favorite->delete();
return response()->json(['status' => 'removed']);
} else {
Favorite::create([
'user_id' => $userId,
'relaxation_activity_id' => $id
]);
return response()->json(['status' => 'added']);
}
}
}