- Description
- Fonctionnalités
- Architecture
- Technologies
- Modèle de Données
- Installation
- Configuration
- Utilisation
- API Endpoints
- Tests
- Règles de Gestion
- Contribuer
CinéHub est une application de gestion de catalogue cinématographique développée en Java avec Spring Framework. Elle permet de gérer de manière centralisée les films, les réalisateurs et les catégories, tout en respectant les bonnes pratiques de programmation orientée objet et l'architecture MVC en couches.
L'application offre une solution complète pour :
- 🎥 Gérer un catalogue de films avec toutes leurs métadonnées
- 🎬 Administrer les informations des réalisateurs
- 📁 Organiser les films par catégories
- 🔍 Rechercher et filtrer efficacement le contenu
- ➕ Ajouter un film au catalogue
- ✏️ Modifier les informations d'un film existant
- 🗑️ Supprimer un film du catalogue
- 📋 Consulter la liste complète des films
- 🔍 Rechercher des films par titre, année ou catégorie
- 📄 Consulter les détails complets d'un film (avec réalisateur et catégorie)
- 🎯 Filtrer les films par année de sortie ou note minimale
- ➕ Ajouter un nouveau réalisateur
- ✏️ Modifier les informations d'un réalisateur
- 🗑️ Supprimer un réalisateur (si aucun film associé)
- 📋 Consulter la liste des réalisateurs
- 🎞️ Consulter la filmographie complète d'un réalisateur
- 🔍 Rechercher un réalisateur par nom
- ➕ Ajouter une nouvelle catégorie de films
- ✏️ Modifier une catégorie existante
- 🗑️ Supprimer une catégorie (si aucun film associé)
- 📋 Consulter la liste des catégories
- 🎬 Consulter tous les films d'une catégorie donnée
L'application suit une architecture MVC multi-couches :
┌─────────────────────────────────────┐
│ Controller Layer │ ← REST API Endpoints
├─────────────────────────────────────┤
│ Service Layer │ ← Business Logic
├─────────────────────────────────────┤
│ Repository Layer │ ← Data Access (JPA)
├─────────────────────────────────────┤
│ Database (MySQL) │ ← Persistence
└─────────────────────────────────────┘
- Controller : Gestion des requêtes HTTP et des réponses REST
- Service : Logique métier et règles de gestion
- Repository : Accès aux données via Spring Data JPA
- Model : Entités JPA (Film, Director, Category)
- DTO : Objets de transfert de données
- Mapper : Conversion entre entités et DTOs (MapStruct)
- Exception : Gestion centralisée des erreurs
- Config : Configuration Spring (XML, Java, Annotations)
- Java 17+
- Spring Framework 6.2.10
- Spring Core (IoC/DI)
- Spring Data JPA 3.4.3
- Spring MVC (REST)
- Spring Context
- Hibernate 6.6.4 (ORM)
- MySQL 9.4.0 (Base de données)
- MapStruct 1.5.5 (Mapping)
- Bean Validation (Jakarta Validation API)
- Jackson (Sérialisation JSON)
- Maven (Gestion de dépendances)
- Docker (Conteneurisation)
- JUnit 4.13.2 (Tests unitaires)
| Dépendance | Version | Rôle |
|---|---|---|
| spring-context | 6.2.10 | 🏗️ Conteneur IoC/DI - Gestion des beans et injection de dépendances |
| spring-webmvc | 6.2.10 | 🌐 Framework MVC - Controllers REST et gestion HTTP |
| spring-tx | 6.2.10 | 💳 Gestion déclarative des transactions (@Transactional) |
| spring-orm | 6.2.10 | 🔗 Intégration ORM - Bridge entre Spring et Hibernate |
| spring-data-jpa | 3.4.3 | 🗂️ Repositories automatiques - Simplifie l'accès aux données |
| Dépendance | Version | Rôle |
|---|---|---|
| hibernate-core | 6.6.4.Final | 🔄 ORM - Mapping objet-relationnel, gestion des entités JPA |
| mysql-connector-j | 9.4.0 | 🔌 Driver JDBC MySQL - Connexion à la base de données |
| Dépendance | Version | Rôle |
|---|---|---|
| jakarta.servlet-api | 6.0.0 | 🌍 API Servlet - Gestion des requêtes HTTP (scope: provided) |
| jakarta.validation-api | 3.0.2 | ✅ API de validation - Annotations de validation (@NotNull, @Size, etc.) |
| hibernate-validator | 8.0.1.Final | 🛡️ Implémentation de Bean Validation - Validation automatique des DTOs |
| expressly | 5.0.0 | 📝 Expression Language - Requis par Hibernate Validator |
| Dépendance | Version | Rôle |
|---|---|---|
| mapstruct | 1.5.5.Final | 🗺️ Mapping Entity ↔ DTO - Génération automatique de code à la compilation |
| mapstruct-processor | 1.5.5.Final | ⚙️ Processeur d'annotations MapStruct (scope: provided) |
| jackson-databind | 2.17.0 | 📄 Sérialisation/Désérialisation JSON - Conversion objets Java ↔ JSON |
| Dépendance | Version | Rôle |
|---|---|---|
| lombok | 1.18.30 | ✨ Réduction du boilerplate - @Data, @Getter, @Setter, @Builder, etc. |
| junit | 4.13.2 | 🧪 Framework de tests unitaires (scope: test) |
1. Maven Compiler Plugin (3.11.0)
<annotationProcessorPaths>
<path><!-- Lombok --></path>
<path><!-- MapStruct --></path>
</annotationProcessorPaths>- 🎯 Rôle : Compile le code Java 17 et traite les annotations de Lombok et MapStruct
2. Maven WAR Plugin (3.4.0)
<failOnMissingWebXml>false</failOnMissingWebXml>- 📦 Rôle : Package l'application en fichier WAR sans nécessiter web.xml (grâce à WebAppInitializer)
| Technologie | Justification |
|---|---|
| Spring Data JPA | ⚡ Réduit 70% du code DAO grâce aux repositories automatiques |
| MapStruct | 🚀 Mapping compile-time (vs reflection) = performances optimales |
| Lombok | ✂️ Élimine ~40% du code boilerplate (getters/setters/constructeurs) |
| Hibernate 6.6.4 | 🆕 Support Jakarta EE, performances améliorées |
| Jackson | 📊 Standard de facto pour JSON en Java |
| Bean Validation | 🛡️ Validation déclarative et centralisée |
- idFilm (Long) - Identifiant unique
- title (String) - Titre du film
- releaseYear (Integer) - Année de sortie
- duration (Integer) - Durée en minutes
- synopsis (String) - Résumé du film
- rating (Double) - Note sur 10
- director (ManyToOne) - Réalisateur
- category (ManyToOne) - Catégorie- idDirector (Long) - Identifiant unique
- firstName (String) - Prénom
- lastName (String) - Nom
- nationality (String) - Nationalité
- birthDate (LocalDate) - Date de naissance
- biography (String) - Biographie
- films (OneToMany) - Liste des films réalisés- idCategory (Long) - Identifiant unique
- name (String) - Nom de la catégorie
- description (String) - Description
- films (OneToMany) - Liste des films- Un film appartient à un seul réalisateur (ManyToOne)
- Un réalisateur peut avoir plusieurs films (OneToMany)
- Un film appartient à une seule catégorie (ManyToOne)
- Une catégorie peut contenir plusieurs films (OneToMany)
- Java JDK 17 ou supérieur
- Maven 3.6+
- MySQL 8.0+ ou Docker
- Git
- Docker
- Tomcat 10+
- Docker
- Tomcat 10+
- Cloner le repository
git clone https://github.com/MouadHallaffou/CineHub.git
cd CineHub- Démarrer MySQL avec Docker
docker-compose up -d-
Configurer la base de données
Créer une base de données MySQL :
CREATE DATABASE cinehub;- Compiler le projet
mvn clean install- Déployer l'application
mvn tomcat7:runOu déployer le fichier target/demo.war sur votre serveur d'applications.
L'application utilise une configuration Java complète sans fichier web.xml, basée sur les annotations Spring :
La classe AppConfig centralise toute la configuration de l'application :
@Configuration // Marque comme classe de configuration Spring
@EnableWebMvc // Active Spring MVC
@ComponentScan(basePackages = "com.cinehub") // Scan automatique des composants
@EnableJpaRepositories(basePackages = "com.cinehub.repository") // Active Spring Data JPA
@EnableTransactionManagement // Active la gestion des transactions
public class AppConfig implements WebMvcConfigurer {
// Configuration des beans...
}Rôles et responsabilités :
- ✅ DataSource : Configuration de la connexion MySQL
- ✅ EntityManagerFactory : Configuration JPA/Hibernate
- ✅ TransactionManager : Gestion des transactions
- ✅ MessageConverters : Conversion JSON avec Jackson
- ✅ Hibernate Properties : Dialecte, DDL auto, logs SQL
Remplace le fichier web.xml traditionnel grâce à Servlet 3.0+ :
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{AppConfig.class}; // Configuration racine
}
@Override
protected Class<?>[] getServletConfigClasses() {
return null; // Pas de config servlet séparée
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"}; // Mappage du DispatcherServlet
}
}Avantages :
- 🚀 Zero XML - Configuration 100% Java
- 🔧 Type-safe et refactorable
- 📦 Déploiement simplifié
- ⚡ Chargement dynamique au démarrage du conteneur
Configuration dans AppConfig.java :
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/cinehubDB?useSSL=false&serverTimezone=UTC");
dataSource.setUsername("root");
dataSource.setPassword("");
return dataSource;
}private Properties hibernateProperties() {
Properties properties = new Properties();
properties.put("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect");
properties.put("hibernate.show_sql", "false");
properties.put("hibernate.format_sql", "true");
properties.put("hibernate.hbm2ddl.auto", "update");
return properties;
}- Singleton : Services, Repositories (défaut)
- Prototype : DTOs, objets temporaires
Une fois déployée, l'application est accessible à :
http://localhost:8080/demo
Des fichiers .http sont disponibles dans le dossier api/ :
api/film.http- Requêtes pour les filmsapi/director.http- Requêtes pour les réalisateursapi/category.http- Requêtes pour les catégories
| Méthode | Endpoint | Description |
|---|---|---|
| GET | /api/films |
Liste tous les films |
| GET | /api/films/{id} |
Détails d'un film |
| POST | /api/films |
Créer un film |
| PUT | /api/films/{id} |
Modifier un film |
| DELETE | /api/films/{id} |
Supprimer un film |
| GET | /api/films/search?title={title} |
Rechercher par titre |
| GET | /api/films/year/{year} |
Filtrer par année |
| GET | /api/films/rating/{minRating} |
Filtrer par note |
| Méthode | Endpoint | Description |
|---|---|---|
| GET | /api/directors |
Liste tous les réalisateurs |
| GET | /api/directors/{id} |
Détails d'un réalisateur |
| POST | /api/directors |
Créer un réalisateur |
| PUT | /api/directors/{id} |
Modifier un réalisateur |
| DELETE | /api/directors/{id} |
Supprimer un réalisateur |
| GET | /api/directors/{id}/films |
Filmographie |
| GET | /api/directors/search?name={name} |
Rechercher par nom |
| Méthode | Endpoint | Description |
|---|---|---|
| GET | /api/categories |
Liste toutes les catégories |
| GET | /api/categories/{id} |
Détails d'une catégorie |
| POST | /api/categories |
Créer une catégorie |
| PUT | /api/categories/{id} |
Modifier une catégorie |
| DELETE | /api/categories/{id} |
Supprimer une catégorie |
| GET | /api/categories/{id}/films |
Films de la catégorie |
Les tests sont implémentés avec JUnit 5 et Mockito :
mvn testChaque service est testé pour :
- ✅ Création d'une entité (succès)
- ✅ Récupération par ID (succès et échec)
- ✅ Mise à jour (succès et échec)
- ✅ Suppression (succès et avec contraintes)
- ✅ Méthodes de recherche personnalisées
FilmServiceTest.javaDirectorServiceTest.javaCategoryServiceTest.java
-
Films
- ✅ Un film appartient à un seul réalisateur
- ✅ Un film appartient à une seule catégorie
- ✅ La note doit être comprise entre 0 et 10
- ✅ L'année de sortie ne peut pas être dans le futur
- ✅ La durée doit être supérieure à 0
-
Réalisateurs
- ✅ La suppression n'est possible que s'il n'a aucun film associé
- ✅ Un réalisateur peut avoir plusieurs films
-
Catégories
- ✅ La suppression n'est possible que si elle ne contient aucun film
- ✅ Une catégorie peut contenir plusieurs films
FilmNotFoundException- Film introuvableDirectorNotFoundException- Réalisateur introuvableCategoryNotFoundException- Catégorie introuvableDirectorHasFilmsException- Réalisateur avec films associésCategoryHasFilmsException- Catégorie avec films associésInvalidRatingException- Note invalideInvalidYearException- Année invalide
Les contributions sont les bienvenues ! Veuillez suivre ces étapes :
- Fork le projet
- Créer une branche pour votre fonctionnalité (
git checkout -b feature/AmazingFeature) - Commit vos changements (
git commit -m 'Add some AmazingFeature') - Push vers la branche (
git push origin feature/AmazingFeature) - Ouvrir une Pull Request
- Respecter les conventions Java
- Documenter le code avec Javadoc
- Écrire des tests unitaires
- Suivre l'architecture en couches
Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails.
- Mouad Hallaffou - Développement initial - CineHub
- Spring Framework Community
- Hibernate Team
- Tous les contributeurs du projet
Pour toute question ou suggestion :
- Email: mouadhallaffou@gmail.com
- GitHub Issues: https://github.com/MouadHallaffou/CineHub
⭐ N'oubliez pas de donner une étoile si ce projet vous a aidé !