Skip to content

Backend - API Laravel

Laravel 11 PHP 8.3 PostgreSQL

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.

ComposantTechnologieVersion
FrameworkLaravel11.x
LangagePHP8.3
Base de donnéesPostgreSQL16
CacheRedis7.x
QueueLaravel Horizon-
AuthLaravel SanctumJWT
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'autorisation

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
MéthodeEndpointDescription
POST/api/v1/auth/registerInscription
POST/api/v1/auth/loginConnexion
POST/api/v1/auth/logoutDéconnexion
POST/api/v1/auth/refreshRafraĂźchir le token
GET/api/v1/auth/meProfil utilisateur
MéthodeEndpointDescription
GET/api/v1/collectionsListe des collections
POST/api/v1/collectionsCré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éthodeEndpointDescription
GET/api/v1/cardsListe des cartes
POST/api/v1/cardsCréer une carte
POST/api/v1/cards/generateGé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
MéthodeEndpointDescription
POST/api/v1/documents/uploadUpload de document
POST/api/v1/documents/analyzeAnalyse par l’IA
GET/api/v1/documents/{id}Détail du document
  1. L’utilisateur s’authentifie avec email/mot de passe
  2. L’API gĂ©nĂšre un JWT avec une durĂ©e de vie limitĂ©e
  3. Le client stocke le token de maniÚre sécurisée
  4. Chaque requĂȘte inclut le token dans le header Authorization
  5. Le middleware vérifie et décode le token
// Groupe de middlewares API
Route::middleware([
'auth:sanctum', // Authentification JWT
'throttle:api', // Rate limiting
'verified', // Email vérifié
])->group(function () {
// Routes protégées
});
MesureImplémentation
ChiffrementDonnées sensibles chiffrées en base (AES-256)
HashingMots de passe hashés avec bcrypt
HTTPSTLS 1.3 obligatoire
CORSConfiguration restrictive
Rate Limiting60 requĂȘtes/minute par utilisateur

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));
}
}
JobDescriptionPriorité
GenerateCardsJobGénération de cartes via IAHigh
ProcessDocumentJobAnalyse de document uploadéHigh
SendNotificationJobEnvoi de notificationsLow
CleanupJobNettoyage des fichiers temporairesLow

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']);
});
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);
}
}
400+ tests

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']
]);
}
}
TypeNombreCouverture
Unit Tests250+85%
Feature Tests150+90%
Integration Tests50+-

API conçue avec les meilleures pratiques Laravel pour la robustesse et la maintenabilité.