🐯🐯 Routes de l'API

Poisson Rouges « Notes Cours  » — ## les routes et les contrôleurs structurent les requêtes HTTP et organisent la logique de l’ application ## VOIR LA DOC Routes    Voir La DOC Controleurs

Dans routes/api.php :

Lien : — How to Use Route Groups and Prefixes in Laravel 11

 

Vérifier les routes « get post delete »

php artisan route:list

 

🐯🐯 Routes api.php

Routes/api.php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\RoleController;
use App\Http\Controllers\UserController;
use App\Http\Controllers\UploadController;
use App\Http\Controllers\PageController;
use App\Http\Controllers\ExerciseController;
use App\Http\Controllers\PlanController;
use App\Http\Controllers\WorkoutController;
use App\Http\Controllers\MylisteController;
use App\Http\Controllers\SwimSetController;
use App\Http\Controllers\WorkoutExerciseController;
use App\Http\Controllers\WorkoutSwimSetController;
use App\Http\Controllers\PlanWorkoutController;
use App\Http\Controllers\MylisteItemController;

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
| Ici sont enregistrées les routes API de l'app Ces routes sont
*/

// ************************************************************************
// Routes pour les rôles (Roles)
// ************************************************************************

// Route de ressource pour les opérations CRUD de base sur les rôles
Route::apiResource('roles', RoleController::class);

// Route pour récupérer les utilisateurs associés à un rôle spécifique
Route::get('roles/{role}/users', [UserController::class, 'getUsersByRole']);

// ************************************************************************
// Routes pour les utilisateurs (Users)
// ************************************************************************

// Route de ressource pour les opérations CRUD de base sur les utilisateurs
Route::apiResource('users', UserController::class);

// ************************************************************************
// Routes pour les fichiers uploadés (Uploads)
// ************************************************************************

// Route de ressource pour les opérations CRUD de base sur les fichiers uploadés
Route::apiResource('uploads', UploadController::class);

// Route pour récupérer les fichiers uploadés par un utilisateur spécifique
Route::get('users/{user}/uploads', [UploadController::class, 'getUserUploads']);

// ************************************************************************
// Routes pour les pages (Pages)
// ************************************************************************

// Route de ressource pour les opérations CRUD de base sur les pages
Route::apiResource('pages', PageController::class);

// ************************************************************************
// Routes pour les exercices (Exercises)
// ************************************************************************

// Route de ressource pour les opérations CRUD de base sur les exercices
Route::apiResource('exercises', ExerciseController::class);

// ************************************************************************
// Routes pour les plans (Plans)
// ************************************************************************

// Route de ressource pour les opérations CRUD de base sur les plans
Route::apiResource('plans', PlanController::class);

// Route pour récupérer les séances d'entraînement (workouts) associées à un plan spécifique
Route::get('plans/{plan}/workouts', [PlanWorkoutController::class, 'index']);

// Route pour ajouter une séance d'entraînement à un plan
Route::post('plans/{plan}/workouts/{workout}', [PlanWorkoutController::class, 'store']);

// Route pour supprimer une séance d'entraînement d'un plan
Route::delete('plans/{plan}/workouts/{workout}', [PlanWorkoutController::class, 'destroy']);

// ************************************************************************
// Routes pour les séances d'entraînement (Workouts)
// ************************************************************************

// Route de ressource pour les opérations CRUD de base sur les séances d'entraînement
Route::apiResource('workouts', WorkoutController::class);

// Route pour récupérer les exercices associés à une séance d'entraînement spécifique
Route::get('workouts/{workout}/exercises', [WorkoutExerciseController::class, 'index']);

// Route pour ajouter un exercice à une séance d'entraînement
Route::post('workouts/{workout}/exercises/{exercise}', [WorkoutExerciseController::class, 'store']);

// Route pour supprimer un exercice d'une séance d'entraînement
Route::delete('workouts/{workout}/exercises/{exercise}', [WorkoutExerciseController::class, 'destroy']);

// Route pour récupérer les séries de natation (swim sets) associées à une séance d'entraînement spécifique
Route::get('workouts/{workout}/swim-sets', [WorkoutSwimSetController::class, 'index']);

// Route pour ajouter une série de natation à une séance d'entraînement
Route::post('workouts/{workout}/swim-sets/{swimSet}', [WorkoutSwimSetController::class, 'store']);

// Route pour supprimer une série de natation d'une séance d'entraînement
Route::delete('workouts/{workout}/swim-sets/{swimSet}', [WorkoutSwimSetController::class, 'destroy']);

// ************************************************************************
// Routes pour les séries de natation (Swim Sets)
// ************************************************************************

// Route de ressource pour les opérations CRUD de base sur les séries de natation
Route::apiResource('swim-sets', SwimSetController::class);

// ************************************************************************
// Routes pour les listes personnelles (Mylistes)
// ************************************************************************

// Route de ressource pour les opérations CRUD de base sur les listes personnelles
Route::apiResource('mylistes', MylisteController::class);

// Route pour récupérer les éléments (exercices, séances, plans) associés à une liste personnelle spécifique
Route::get('myliste/{myliste}/items', [MylisteItemController::class, 'index']);

// Route pour ajouter un élément à une liste personnelle
Route::post('myliste/{myliste}/items', [MylisteItemController::class, 'store']);

// Route pour supprimer un élément d'une liste personnelle
Route::delete('myliste/{myliste}/items/{item}', [MylisteItemController::class, 'destroy']);

🐍🐍 Routes api.php ## Authentification

//  Ajout Authentification
// Routes de ressources
Route::apiResource('users', UserController::class); // Génère plusieurs routes (GET, POST, PUT, DELETE)

// Routes individuelles
Route::post('/login', [AuthController::class, 'login']);
Route::get('/profile', [UserController::class, 'profile']);

🐍🐍 Tests de l'API Laravel 11 avec Postman

Les liens (endpoints) sont générés. Ils correspondent aux routes définies dans le fichier routes/api.php.

Nous utilisons les méthodes HTTP appropriées (GET, POST, PUT, DELETE) pour chaque route.
Le serveur Laravel est en cours d’exécution

URL de base correcte : http://localhost:8000/api

Rôles (Roles)

Utilisateurs (Users)

Fichiers Uploadés (Uploads)

Pages (Pages)

Exercices (Exercises)

Plans (Plans)

Séances d’entraînement (Workouts)

Séries de natation (Swim Sets)

Listes personnelles (Mylists)

🦊🦊 Astuce - Scripts Routes Postman

📌 Générer la liste des routes en JSON

🛠 Exécutez la commande pour générer le JSON contenant toutes vos routes :

php artisan route:list --json > routes.json

🛠 Ce fichier routes.json contiendra la liste complète des routes avec leurs méthodes HTTP, URI et autres


🔧 Créer le script d’export

Créez un nouveau fichier, par exemple export-postman.php, à la racine (ou dans un dossier dédié, par exemple scripts/) — à suprm avant production :

 // il y qlq chose à ajouter ici :-)
 // export-postman.php
 // Définir l'URL de base sans slash final
 $baseUrl = rtrim("http://localhost:8000", '/');
 // Chemin du fichier de routes généré par Laravel
 $routesFile = __DIR__ . '/routes.json';
 if (!file_exists($routesFile)) {
 die("Le fichier routes.json n'existe pas. Veuillez d'abord générer la liste des routes avec 'php artisan route:list --json > routes.json'.\n");
 }
 // Lire et décoder le fichier JSON contenant les routes
 $routesData = json_decode(file_get_contents($routesFile), true);
 if (!$routesData) {
 die("Erreur lors de la lecture ou du décodage de routes.json.\n");
 }
 // Initialiser la structure de la collection Postman
 $postmanCollection = [
 "info" => [
 "_postman_id" => uniqid(),
 "name" => "APP_NS_V1",
 "schema" => "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
 ],
 "item" => []
 ];
 // Regrouper les routes par le premier segment d'URI (exemple : "users", "roles", etc.)
 $groupedRoutes = [];
 foreach ($routesData as $route) {
 // Récupérer l'URI et retirer le slash initial s'il existe
 $uri = ltrim($route['uri'] ?? '', '/');
 // On ne traite que les routes commençant par "api"
 if (strpos($uri, 'api') !== 0) {
 continue;
 }
 // Pour le regroupement, supprimer le préfixe "api/" s'il est présent
 $uriForGrouping = $uri;
 if (strpos($uri, 'api/') === 0) {
 $uriForGrouping = substr($uri, strlen('api/'));
 }
 $segments = explode('/', trim($uriForGrouping, '/'));
 $group = $segments[0] ?? 'Autres';
 // Construire l'URL complète sans double slash
 $requestUrl = $baseUrl . '/' . $uri;
 // Créer la structure de la requête Postman
 $request = [
 "method" => strtoupper($route['method'] ?? 'GET'),
 "header" => [],
 "url" => [
 "raw" => $requestUrl,
 "protocol" => "http",
 "host" => ["localhost"],
 "port" => "8000",
 "path" => explode('/', $uri)
 ]
 ];
 $item = [
 "name" => $uri,
 "request" => $request,
 "response"=> []
 ];
 // Ajouter la requête dans le groupe correspondant
 $groupedRoutes[$group][] = $item;
 }
 // Construire les items de la collection en regroupant par section
 foreach ($groupedRoutes as $groupName => $items) {
 $postmanCollection["item"][] = [
 "name" => ucfirst($groupName),
 "item" => $items
 ];
 }
 // Exporter la collection au format JSON dans un fichier
 $outputFile = __DIR__ . '/postman_collection.json';
 file_put_contents($outputFile, json_encode($postmanCollection, JSON_PRETTY_PRINT));
 echo "La collection Postman a été générée avec succès dans le fichier : $outputFile\n";

📌 Exécuter le script

php export-postman.php

🌱 Importer dans Postman

mon Postman +++ Import +++ sélection fichier postman_collection.json +++ Importer === Affichage par dossier ===


🚀 Master API Testing with Postman! Beginner to Pro in One Course!

 


🌱 Visualiser et Mettre à jour les Collections

📌 ==>> React Front ===>> Axios configuration ==>> CRUD des données via Formulaires


🐠🐠🐠🐠🐠 Méthodes HTTP avec Postman

 

GET
== Récupérer une ressource depuis le serveur.

POST
== Envoyer des données au serveur pour créer une nouvelle ressource ou déclencher une action.

PUT
== Mettre à jour ou remplacer complètement une ressource existante.

== PATCH
Effectuer une mise à jour partielle d’une ressource (modifier uniquement certains champs).

DELETE
== Supprimer une ressource du serveur.

HEAD
== Récupérer uniquement les en-têtes d’une ressource, sans son corps.

OPTIONS
== Demander au serveur les méthodes HTTP supportées pour une ressource donnée.

 

🦊🦊 Vérification Tables BDD

Version MySQL:  8.0.40 version récente stable
Encodage utf8mb4_unicode_ci  pour la gestion des caractères internationaux.
Moteurs de Stockage InnoDB

Tables Principales et Relations

users
Contient username, first_name, last_name, old_name, email, password, role_id.
role_id est une clé étrangère vers roles.
La colonne old_name est présente un renommage de colonne est effectué

roles
Contient name.
Utilisé pour gérer les rôles des utilisateurs.

exercises
Contient title, description, exercise_level, exercise_category, upload_id, user_id.
upload_id est une clé étrangère vers uploads.
user_id est une clé étrangère vers users.

pages
Contient title, content, page_category, upload_id, user_id.
upload_id est une clé étrangère vers uploads.
user_id est une clé étrangère vers users.

plans
Contient title, description, plan_category, user_id.
user_id est une clé étrangère vers users.

workouts
Contient title, description, workout_category, user_id.
user_id est une clé étrangère vers users.

swim_sets:
Contient workout_id, exercise_id, set_distance, set_repetition, rest_time.
workout_id est une clé étrangère vers workouts.
exercise_id est une clé étrangère vers exercises.

mylist
Contient user_id, title, description.
user_id est une clé étrangère vers users.

mylist_items

Contient mylist_id, item_id, item_type.
mylist_id est une clé étrangère vers mylist.

Tables de jointure (relations Many-to-Many):

workout_exercises

workout_swim_sets

plan_workouts

Tables Automatiques Laravel migration

cache, cache_locks: Utilisées pour la mise en cache
failed_jobs, jobs, job_batches: Utilisées pour la gestion des tâches en file d’attente
migrations: Utilisée pour suivre les migrations de base de données
password_reset_tokens: Utilisée pour la réinitialisation des mots de passe
personal_access_tokens: Utilisée pour les tokens d’accès personnels (Sanctum)
sessions: Utilisée pour la gestion des sessions

uploads: Utilisée pour stocker les informations sur les fichiers téléchargés.

Clés Étrangères: Toutes les clés étrangères sont correctement définies avec les options ON DELETE CASCADE ou ON DELETE SET NULL

La présence de old_name dans la table users ==>> un renommage de colonne

migrations bien organisées comme le montre la table migrations

 

old_name a supprimer de la table users pour nettoyer la base de données

Comment  effectuez des tests pour s assurer que toutes les relations et les contraintes fonctionnent

comment Mettez en place des sauvegardes régulières de votre base de données pour éviter la perte de données.
En résumé, votre schéma de base de données est bien conçu et suit les bonnes pratiques. Assurez-vous simplement de gérer la colonne old_name et de maintenir des sauvegardes régulières.

🙈🙉🙊 Generation des données

Créer le seeder +++ Mettre à jour à partir des Md & Ctrlr +++ Exécuter une par une dans l’ordre

        $this->call([
            // 01 -  RoleSeeder::class,
            // 02 -   UserSeeder::class,
            // 03 -   UploadSeeder::class,
            //  04 -   ExerciseSeeder::class,
            //  05 -   PageSeeder::class,
            // 06 -   PlanSeeder::class,
            //  07 -   WorkoutSeeder::class,
            //  08 -   SwimSetSeeder::class,
            //  09 -   MylistSeeder::class,
            //  10 -   MylistItemSeeder::class,
        ]);

Dans l’ordre : – Les derniers seeders vont récupérer les données des premiers

Verification : PhpMyAdmin : ==>> Go

Verification : Postman : ==>> Go  » Requêtes »

🐫🐫 Seeder Role

seeder pour la table roles avec les rôles « admin », « user », « athlet », et « coach »

génèrer

php artisan make:seeder RoleSeeder

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\Role;

class RoleSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        Role::create(['name' => 'admin']);
        Role::create(['name' => 'user']);
        Role::create(['name' => 'athlet']);
        Role::create(['name' => 'coach']);
    }
}

Dans DatabaseSeeder.php mettre à jour l’execution

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     */
    public function run(): void
    {
        // \App\Models\User::factory(10)->create();

        // \App\Models\User::factory()->create([
        //     'name' => 'Test User',
        //     'email' => 'test@example.com',
        // ]);

        $this->call([
            RoleSeeder::class,
        ]);
    }
}

Exécuter le seeder

php artisan db:seed

Voir DB +++=== supprimer refaire erreur

php artisan migrate:fresh --seed

🐫🐫 Seeder Users

seeder pour utilisateurs

génèrer

php artisan make:seeder UserSeeder

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\User;
use App\Models\Role; // Importez le modèle Role
use Illuminate\Support\Facades\Hash;

class UserSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        // Récupérer les rôles par leur nom
        $adminRole = Role::where('name', 'admin')->first();
        $userRole = Role::where('name', 'user')->first();
        $athletRole = Role::where('name', 'athlet')->first();
        $coachRole = Role::where('name', 'coach')->first();

        // Créer les utilisateurs
        User::create([
            'username' => 'admin',
            'email' => 'admin@admin.net',
            'password' => Hash::make('admin123'),
            'first_name' => 'Hassan',
            'last_name' => 'ELHAOUAT',
            'role_id' => $adminRole->id,
        ]);

        User::create([
            'username' => 'user1',
            'email' => 'user@user.net',
            'password' => Hash::make('user123'),
            'first_name' => 'Hassan1',
            'last_name' => 'ELHAOUAT2',
            'role_id' => $userRole->id,
        ]);

        User::create([
            'username' => 'athlet1',
            'email' => 'athlet@athlet.net',
            'password' => Hash::make('athlet123'),
            'first_name' => 'athlet',
            'last_name' => 'sportif',
            'role_id' => $athletRole->id,
        ]);

        User::create([
            'username' => 'coach1',
            'email' => 'coach@coach.net',
            'password' => Hash::make('coach123'),
            'first_name' => 'coach',
            'last_name' => 'entraineur',
            'role_id' => $coachRole->id,
        ]);
    }
}

Dans DatabaseSeeder.php mettre à jour l’execution

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     */
    public function run(): void
    {
        $this->call([
            RoleSeeder::class, // Assurez-vous que RoleSeeder est exécuté en premier
            UserSeeder::class,
        ]);
    }
}

Exécuter le seeder

php artisan db:seed

Voir DB +++=== supprimer refaire erreur

php artisan migrate:fresh --seed

– Visualisation structure du projet :

  • # brew install tree // Installation sous mac
  • # tree -a > project_structure.txt // generation globale
  • # find . -maxdepth 2 > project_structure.txt // Pour limiter la profondeur