Backend - API Laravel
đ§ Backend API Laravel
Section titled âđ§ Backend API LaravelâPrĂ©sentation
Section titled âPrĂ©sentationâLe backend de Mindlet est une API RESTful dĂ©veloppĂ©e avec Laravel 11, offrant une interface robuste et sĂ©curisĂ©e pour lâapplication mobile.
Stack technique
Section titled âStack techniqueâ| Composant | Technologie | Version |
|---|---|---|
| Framework | Laravel | 11.x |
| Langage | PHP | 8.3 |
| Base de données | PostgreSQL | 16 |
| Cache | Redis | 7.x |
| Queue | Laravel Horizon | - |
| Auth | Laravel Sanctum | JWT |
Architecture du code
Section titled âArchitecture du codeâapp/âââ Http/â âââ Controllers/ # ContrĂŽleurs APIâ âââ Middleware/ # Middlewares personnalisĂ©sâ âââ Requests/ # Form Requests (validation)â âââ Resources/ # API Resources (transformation)âââ Models/ # ModĂšles Eloquentâââ Services/ # Services mĂ©tierâââ Repositories/ # Repositories (abstraction BDD)âââ Jobs/ # Jobs asynchronesâââ Events/ # ĂvĂ©nements applicatifsâââ Listeners/ # Listeners d'Ă©vĂ©nementsâââ Policies/ # Policies d'autorisationPrincipes dâarchitecture
Section titled âPrincipes dâarchitectureâDesign Patterns utilisĂ©s
Section titled âDesign Patterns utilisĂ©sâAbstraction de la couche donnĂ©es
interface CardRepositoryInterface{ public function findById(int $id): ?Card; public function findByCollection(int $collectionId): Collection; public function create(array $data): Card; public function update(int $id, array $data): Card; public function delete(int $id): bool;}Avantages :
- Découplage de la logique métier et de la persistance
- Facilite les tests unitaires (mock des repositories)
- Permet de changer de source de données sans impacter le code métier
Logique métier centralisée
class CardGenerationService{ public function __construct( private AIService $aiService, private CardRepository $cardRepository, private EmbeddingService $embeddingService ) {}
public function generateFromDocument(Document $doc): Collection { $content = $this->extractContent($doc); $questions = $this->aiService->generateQuestions($content);
return $this->createCards($questions); }}Validation déclarative
class CreateCardRequest extends FormRequest{ public function rules(): array { return [ 'question' => 'required|string|max:1000', 'answer' => 'required|string|max:5000', 'collection_id' => 'required|exists:collections,id', 'type' => 'required|in:flashcard,mcq,truefalse', ]; }}Endpoints principaux
Section titled âEndpoints principauxâAuthentification
Section titled âAuthentificationâ| MĂ©thode | Endpoint | Description |
|---|---|---|
| POST | /api/v1/auth/register | Inscription |
| POST | /api/v1/auth/login | Connexion |
| POST | /api/v1/auth/logout | Déconnexion |
| POST | /api/v1/auth/refresh | RafraĂźchir le token |
| GET | /api/v1/auth/me | Profil utilisateur |
Collections
Section titled âCollectionsâ| MĂ©thode | Endpoint | Description |
|---|---|---|
| GET | /api/v1/collections | Liste des collections |
| POST | /api/v1/collections | Créer une collection |
| GET | /api/v1/collections/{id} | DĂ©tail dâune collection |
| PUT | /api/v1/collections/{id} | Modifier une collection |
| DELETE | /api/v1/collections/{id} | Supprimer une collection |
| Méthode | Endpoint | Description |
|---|---|---|
| GET | /api/v1/cards | Liste des cartes |
| POST | /api/v1/cards | Créer une carte |
| POST | /api/v1/cards/generate | Générer via IA |
| GET | /api/v1/cards/{id} | DĂ©tail dâune carte |
| PUT | /api/v1/cards/{id} | Modifier une carte |
| DELETE | /api/v1/cards/{id} | Supprimer une carte |
Documents
Section titled âDocumentsâ| MĂ©thode | Endpoint | Description |
|---|---|---|
| POST | /api/v1/documents/upload | Upload de document |
| POST | /api/v1/documents/analyze | Analyse par lâIA |
| GET | /api/v1/documents/{id} | Détail du document |
Sécurité
Section titled âSĂ©curitĂ©âAuthentification
Section titled âAuthentificationâ- Lâutilisateur sâauthentifie avec email/mot de passe
- LâAPI gĂ©nĂšre un JWT avec une durĂ©e de vie limitĂ©e
- Le client stocke le token de maniÚre sécurisée
- Chaque requĂȘte inclut le token dans le header
Authorization - Le middleware vérifie et décode le token
Middlewares de sécurité
Section titled âMiddlewares de sĂ©curitĂ©â// Groupe de middlewares APIRoute::middleware([ 'auth:sanctum', // Authentification JWT 'throttle:api', // Rate limiting 'verified', // Email vĂ©rifiĂ©])->group(function () { // Routes protĂ©gĂ©es});Protection des donnĂ©es
Section titled âProtection des donnĂ©esâ| Mesure | ImplĂ©mentation |
|---|---|
| Chiffrement | Données sensibles chiffrées en base (AES-256) |
| Hashing | Mots de passe hashés avec bcrypt |
| HTTPS | TLS 1.3 obligatoire |
| CORS | Configuration restrictive |
| Rate Limiting | 60 requĂȘtes/minute par utilisateur |
Jobs asynchrones
Section titled âJobs asynchronesâLes tĂąches longues sont exĂ©cutĂ©es de maniĂšre asynchrone via Laravel Horizon :
class GenerateCardsJob implements ShouldQueue{ use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public function __construct( private Document $document, private User $user ) {}
public function handle(AIService $aiService): void { $cards = $aiService->generateCards($this->document);
// Notification Ă l'utilisateur $this->user->notify(new CardsGeneratedNotification($cards)); }}Types de jobs
Section titled âTypes de jobsâ| Job | Description | PrioritĂ© |
|---|---|---|
GenerateCardsJob | Génération de cartes via IA | High |
ProcessDocumentJob | Analyse de document uploadé | High |
SendNotificationJob | Envoi de notifications | Low |
CleanupJob | Nettoyage des fichiers temporaires | Low |
Base de données
Section titled âBase de donnĂ©esâMigrations
Section titled âMigrationsâLes migrations versionnent le schĂ©ma de la base de donnĂ©es :
Schema::create('cards', function (Blueprint $table) { $table->id(); $table->foreignId('collection_id')->constrained()->cascadeOnDelete(); $table->foreignId('user_id')->constrained()->cascadeOnDelete(); $table->string('type'); // flashcard, mcq, truefalse, etc. $table->text('question'); $table->text('answer'); $table->json('options')->nullable(); // Pour les QCM $table->json('metadata')->nullable(); $table->timestamps(); $table->softDeletes();
$table->index(['collection_id', 'type']);});ModĂšles Eloquent
Section titled âModĂšles Eloquentâclass Card extends Model{ use HasFactory, SoftDeletes;
protected $fillable = [ 'collection_id', 'user_id', 'type', 'question', 'answer', 'options', 'metadata', ];
protected $casts = [ 'options' => 'array', 'metadata' => 'array', ];
public function collection(): BelongsTo { return $this->belongsTo(Collection::class); }
public function user(): BelongsTo { return $this->belongsTo(User::class); }}Notre backend dispose dâune suite complĂšte de tests :
class CardControllerTest extends TestCase{ use RefreshDatabase;
public function test_user_can_create_card(): void { $user = User::factory()->create(); $collection = Collection::factory()->for($user)->create();
$response = $this->actingAs($user) ->postJson('/api/v1/cards', [ 'collection_id' => $collection->id, 'question' => 'What is Laravel?', 'answer' => 'A PHP framework', 'type' => 'flashcard', ]);
$response->assertStatus(201) ->assertJsonStructure([ 'data' => ['id', 'question', 'answer', 'type'] ]); }}Couverture des tests
Section titled âCouverture des testsâ| Type | Nombre | Couverture |
|---|---|---|
| Unit Tests | 250+ | 85% |
| Feature Tests | 150+ | 90% |
| Integration Tests | 50+ | - |
API conçue avec les meilleures pratiques Laravel pour la robustesse et la maintenabilité.