Skip to content

Library API — Gestion de Bibliothèque

Architecture

Objectif

Créer une API REST avec FastAPI pour gérer une bibliothèque personnelle : livres, auteurs, genres, amis, prêts, et upload d’images de couverture, avec stockage dans une base SQLite.


Fonctionnalités principales

Livres

  • Créer un livre complet (édition, auteurs, genres, exemplaire)
  • Lister les livres
  • Voir le détail d’un livre
  • Uploader une image de couverture

Auteurs & Genres

  • Créer des auteurs
  • Créer des genres
  • Associer auteur livre
  • Associer genre livre

Amis

  • Ajouter un ami
  • Lister les amis

Prêts (Loans)

  • Créer un prêt
  • Voir les prêts en cours
  • Retourner un livre
  • Vérifier les contraintes (exemplaire existant, ami existant, exemplaire disponible)

Technologies utilisées

  • Python 3
  • FastAPI
  • SQLite
  • Pydantic
  • Uvicorn
  • CORS Middleware
  • Static Files (servir les images)

Structure du projet

project/ │ ├── main.py ├── models/ │ └── models.py ├── library.db ├── images/ └── README.md


Démarrage rapide

Installation

git clone https://gitlab.com/<your-repo>
cd project
pip install fastapi uvicorn

Lancement

uvicorn main:app --reload

Documentation automatique

  • Swagger UI : http://127.0.0.1:8000/docs

Exemple d’endpoint (FastAPI)

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class BookCreate(BaseModel):
    title: str
    author: str

@app.post("/books")
def create_book(book: BookCreate):
    return {"message": "Book created", "book": book}

Base de données (SQLite)

La base utilise SQLite avec des relations (exemples) : - livre, auteur, genre, edition, editeur, exemplaire, ami, pret

Les clés étrangères sont activées avec :

PRAGMA foreign_keys = ON;

Upload d’images (couvertures)

Endpoint : - POST /livres/{livre_id}/images

Formats supportés : - jpg, jpeg, png, webp

Les images sont accessibles via : - /images/<filename>

Exemple (FastAPI) :

from fastapi import UploadFile, File

@app.post("/livres/{livre_id}/images")
async def upload_cover(livre_id: int, file: UploadFile = File(...)):
    return {"livre_id": livre_id, "filename": file.filename}

Ce que j’ai appris

  • Concevoir une API REST (routes + validation Pydantic)
  • Modéliser une base relationnelle SQLite (relations + clés étrangères)
  • Gérer des erreurs et des contraintes métier (disponibilité, existence)
  • Faire des transactions SQL propres
  • Uploader et servir des fichiers statiques (images)
  • Structurer un backend (architecture logique)

Améliorations possibles

  • Authentification utilisateurs (JWT)
  • Pagination / filtres
  • Dockerisation
  • Frontend React
  • Tests automatisés (pytest)

Liens


Auteur

Ahmad Abo-Alola — Student Project (AI Developer Training)