# đŸ€ Contributing to BricoLoc Architecture Evolution Merci de votre intĂ©rĂȘt pour contribuer au projet ! Ce document vous guide Ă  travers le processus de contribution. --- ## 📋 Table des MatiĂšres 1. [Code of Conduct](#code-of-conduct) 2. [Comment Contribuer](#comment-contribuer) 3. [Standards de Code](#standards-de-code) 4. [Process de Pull Request](#process-de-pull-request) 5. [Standards de Commit](#standards-de-commit) 6. [Architecture et Patterns](#architecture-et-patterns) 7. [Tests](#tests) 8. [Documentation](#documentation) --- ## Code of Conduct ### Nos Engagements - ✅ Respecter tous les contributeurs - ✅ Accueillir les nouveaux membres - ✅ Fournir des feedbacks constructifs - ✅ Se concentrer sur l'apprentissage ### Comportements Attendus - ✅ Utiliser un langage accueillant et inclusif - ✅ Respecter les points de vue diffĂ©rents - ✅ Accepter les critiques constructives - ✅ Montrer de l'empathie envers les autres --- ## Comment Contribuer ### Types de Contributions | Type | Exemples | DifficultĂ© | |------|----------|------------| | 🐛 **Bug Fixes** | Corriger un bug, amĂ©liorer performance | ⭐⭐ | | ✹ **Features** | Nouvelle fonctionnalitĂ©, microservice | ⭐⭐⭐ | | 📚 **Documentation** | README, guides, ADR | ⭐ | | đŸ§Ș **Tests** | Tests unitaires, intĂ©gration | ⭐⭐ | | 🎹 **UI/UX** | AmĂ©liorer interface, accessibilitĂ© | ⭐⭐ | | ♻ **Refactoring** | Clean code, patterns | ⭐⭐⭐ | ### Avant de Commencer 1. **Lire la documentation** : - [README.md](../README.md) - [ARCHITECTURE.md](../ARCHITECTURE.md) - [Roadmap](docs/roadmap.md) 2. **Setup environnement** : - Suivre [Setup WSL Guide](docs/guides/setup-wsl.md) 3. **VĂ©rifier les issues** : - Regarder les [issues existantes](https://github.com/VOTRE_REPO/issues) - VĂ©rifier qu'une issue similaire n'existe pas dĂ©jĂ  --- ## Standards de Code ### TypeScript **Configuration** : Suivre `tsconfig.base.json` (strict mode activĂ©) **Bonnes pratiques** : ```typescript // ✅ BON : Types explicites function calculatePrice(days: number, dailyRate: number): number { return days * dailyRate } // ❌ MAUVAIS : Types implicites any function calculatePrice(days, dailyRate) { return days * dailyRate } // ✅ BON : Interface bien dĂ©finie interface CreateReservationDTO { outilId: string dateDebut: Date dateFin: Date userId: string } // ❌ MAUVAIS : any partout function createReservation(data: any): any { // ... } // ✅ BON : Gestion d'erreurs explicite async function getUser(id: string): Promise { try { const user = await userRepository.findById(id) return user } catch (error) { logger.error('Failed to fetch user', { id, error }) throw new RepositoryError('User fetch failed') } } // ❌ MAUVAIS : Pas de gestion d'erreurs async function getUser(id: string) { return await userRepository.findById(id) } ``` ### Naming Conventions | Type | Convention | Exemples | |------|-----------|----------| | **Variables** | camelCase | `userId`, `dateDebut` | | **Constantes** | UPPER_SNAKE_CASE | `MAX_RETRIES`, `API_URL` | | **Fonctions** | camelCase + verbe | `createReservation()`, `calculatePrice()` | | **Classes** | PascalCase | `ReservationService`, `UserFactory` | | **Interfaces** | PascalCase + `I` prefix | `IReservationRepository` | | **Types** | PascalCase | `CreateReservationDTO` | | **Enums** | PascalCase | `ReservationStatus` | | **Fichiers** | kebab-case | `reservation-service.ts` | | **Dossiers** | kebab-case | `use-cases/`, `repositories/` | ### Formatage **Prettier** : Configuration automatique (`.prettierrc.json`) ```bash # Formater tout le projet pnpm prettier --write . # Formater un fichier spĂ©cifique pnpm prettier --write path/to/file.ts ``` **ESLint** : VĂ©rification automatique ```bash # Linter tout le projet pnpm lint # Linter avec auto-fix pnpm lint --fix ``` ### Structure de Fichiers (Clean Architecture) **Microservice** : ``` packages/microservices// ├── src/ │ ├── domain/ # Couche Domaine (business logic) │ │ ├── entities/ # EntitĂ©s mĂ©tier │ │ ├── value-objects/ # Value Objects │ │ ├── repositories/ # Interfaces repositories │ │ ├── factories/ # Factories pour entitĂ©s │ │ └── rules/ # RĂšgles mĂ©tier │ │ │ ├── application/ # Couche Application (use cases) │ │ ├── use-cases/ # Cas d'usage │ │ ├── services/ # Services applicatifs │ │ └── dtos/ # Data Transfer Objects │ │ │ └── infrastructure/ # Couche Infrastructure (implĂ©mentations) │ ├── repositories/ # ImplĂ©mentations des repositories │ ├── external-apis/ # APIs externes (Stripe, etc.) │ └── events/ # Event Bus │ ├── tests/ # Tests │ ├── unit/ │ ├── integration/ │ └── e2e/ │ ├── package.json ├── tsconfig.json └── README.md ``` --- ## Process de Pull Request ### 1. Fork & Clone (si externe) ```bash # Fork le repo sur GitHub # Clone votre fork git clone https://github.com/VOTRE_USERNAME/bricoloc-architecture-evolution.git cd bricoloc-architecture-evolution # Ajouter le repo original comme upstream git remote add upstream https://github.com/REPO_ORIGINAL/bricoloc-architecture-evolution.git ``` ### 2. CrĂ©er une Feature Branch ```bash git checkout develop git pull origin develop git checkout -b feature/ma-nouvelle-feature ``` ### 3. DĂ©velopper - Suivre les [standards de code](#standards-de-code) - Écrire des tests - Mettre Ă  jour la documentation ### 4. Committer Suivre [Conventional Commits](https://www.conventionalcommits.org/) : ```bash git add . git commit -m "feat(catalogue): add search filters" ``` **Format** : ``` (): [optional body] [optional footer] ``` **Types** : - `feat` : Nouvelle fonctionnalitĂ© - `fix` : Correction de bug - `docs` : Documentation - `style` : Formatage - `refactor` : Refactoring - `test` : Tests - `chore` : Maintenance ### 5. Push & Pull Request ```bash git push -u origin feature/ma-nouvelle-feature ``` **Sur GitHub** : - CrĂ©er Pull Request vers `develop` - Remplir le template - Assigner des reviewers (si applicable) **Template de PR** : ```markdown ## Description BrĂšve description des changements ## Type de changement - [ ] Bug fix - [ ] Nouvelle feature - [ ] Breaking change - [ ] Documentation ## Changements - Changement 1 - Changement 2 ## Checklist - [ ] Code compile sans erreurs - [ ] Tests passent - [ ] Linting passe - [ ] Documentation mise Ă  jour - [ ] J'ai testĂ© manuellement ## Screenshots (si UI) ``` ### 6. Review Process **Reviewer** : - VĂ©rifier le code - Tester localement si possible - Fournir feedback constructif **Contributeur** : - RĂ©pondre aux commentaires - Faire les modifications demandĂ©es - Re-push ### 7. Merge AprĂšs approbation : - **Squash and Merge** (par dĂ©faut) - Supprimer la branche feature --- ## Standards de Commit ### Messages de Commit **✅ Bons exemples** : ```bash feat(auth): implement user registration with email validation fix(inventory): resolve race condition in stock updates docs(adr): add ADR-006 for Event Bus choice refactor(reservation): apply Repository Pattern test(catalogue): add unit tests for SearchOutils use case chore(deps): upgrade Next.js to 14.2.0 style(format): run prettier on all TypeScript files ``` **❌ Mauvais exemples** : ```bash fix bug # Trop vague update # Pas de contexte WIP # Work In Progress asdfasdf # Non descriptif Fixed everything # Pas spĂ©cifique ``` ### Commit FrĂ©quence - ✅ Commits atomiques (une fonctionnalitĂ© = un commit) - ✅ Committer frĂ©quemment (toutes les 30min - 2h) - ❌ Éviter les "mega commits" (100+ fichiers) --- ## Architecture et Patterns ### Principes SOLID Toujours respecter les principes SOLID : **Single Responsibility** : ```typescript // ✅ BON : Une seule responsabilitĂ© class ReservationService { async createReservation(data: CreateReservationDTO): Promise { // Logique mĂ©tier de crĂ©ation de rĂ©servation uniquement } } // ❌ MAUVAIS : Trop de responsabilitĂ©s class ReservationService { async createReservation() { /* ... */ } async sendEmail() { /* ... */ } // Devrait ĂȘtre dans NotificationService async processPayment() { /* ... */ } // Devrait ĂȘtre dans PaymentService } ``` **Dependency Inversion** : ```typescript // ✅ BON : DĂ©pend de l'interface class ReservationService { constructor(private repo: IReservationRepository) {} } // ❌ MAUVAIS : DĂ©pend de l'implĂ©mentation class ReservationService { private repo = new SupabaseReservationRepository() } ``` ### Patterns Obligatoires | Pattern | Utilisation | Exemple | |---------|-------------|---------| | **Repository** | AccĂšs donnĂ©es | `IReservationRepository` | | **Service Layer** | Logique mĂ©tier | `ReservationService` | | **Dependency Injection** | DĂ©couplage | Container IoC | | **Factory** | CrĂ©ation entitĂ©s | `ReservationFactory` | | **Observer** | Events async | Event Bus | ### Clean Architecture Respecter les dĂ©pendances : ``` Presentation Layer → Application Layer → Domain Layer ↑ Infrastructure Layer ─────────────────┘ ``` **RĂšgles** : - ✅ Domain Layer ne dĂ©pend de RIEN - ✅ Application Layer dĂ©pend uniquement de Domain - ✅ Infrastructure implĂ©mente les interfaces du Domain - ❌ Domain ne doit JAMAIS importer de Supabase, Next.js, etc. --- ## Tests ### Coverage Minimum - ✅ **80%** de coverage pour les microservices - ✅ **70%** de coverage global ### Types de Tests **Tests Unitaires** (prioritĂ©) : ```typescript // tests/unit/ReservationService.test.ts describe('ReservationService', () => { let service: ReservationService let mockRepo: jest.Mocked beforeEach(() => { mockRepo = { create: jest.fn(), findById: jest.fn(), // ... } as any service = new ReservationService(mockRepo) }) it('should create a reservation when availability is confirmed', async () => { // Arrange const data: CreateReservationDTO = { /* ... */ } mockRepo.create.mockResolvedValue(mockReservation) // Act const result = await service.createReservation('user-1', data) // Assert expect(result).toEqual(mockReservation) expect(mockRepo.create).toHaveBeenCalledWith(data) }) }) ``` **Tests d'IntĂ©gration** : ```typescript // tests/integration/api/reservations.test.ts describe('POST /api/reservations', () => { it('should create a reservation and return 201', async () => { const response = await fetch('http://localhost:3001/api/reservations', { method: 'POST', body: JSON.stringify({ /* ... */ }), }) expect(response.status).toBe(201) const data = await response.json() expect(data).toHaveProperty('id') }) }) ``` ### Commandes ```bash # Lancer tous les tests pnpm test # Tests avec coverage pnpm test --coverage # Tests en watch mode pnpm test --watch # Tests d'un fichier spĂ©cifique pnpm test ReservationService.test.ts ``` --- ## Documentation ### Quand Documenter - ✅ Toute nouvelle feature - ✅ Changement d'architecture - ✅ Nouvelle dĂ©cision technique (ADR) - ✅ API publique ### Types de Documentation **Code Comments** : ```typescript /** * CrĂ©e une nouvelle rĂ©servation aprĂšs vĂ©rification de disponibilitĂ©. * * @param userId - ID de l'utilisateur crĂ©ant la rĂ©servation * @param data - DonnĂ©es de la rĂ©servation * @returns La rĂ©servation créée * @throws {BusinessError} Si l'outil n'est pas disponible * @throws {ValidationError} Si les dates sont invalides */ async createReservation( userId: string, data: CreateReservationDTO ): Promise { // ... } ``` **README par Microservice** : ```markdown # Reservation Service ## ResponsabilitĂ©s - Gestion des rĂ©servations - VĂ©rification de disponibilitĂ© - Calcul des prix ## Architecture - Domain : EntitĂ©s, rĂšgles mĂ©tier - Application : Use cases, services - Infrastructure : Repositories, events ## Usage \`\`\`typescript const service = container.get('ReservationService') const reservation = await service.createReservation(userId, data) \`\`\` ``` **ADR** (Architecture Decision Records) : - CrĂ©er un ADR pour toute dĂ©cision architecturale majeure - Format : `docs/architecture/ADR/XXX-title.md` - Suivre le template existant --- ## Checklist de Contribution Avant de soumettre une PR, vĂ©rifier : ### Code - [ ] ✅ Code compile sans erreurs (`pnpm build`) - [ ] ✅ Linting passe (`pnpm lint`) - [ ] ✅ Formatage correct (`pnpm prettier --check .`) - [ ] ✅ Pas de console.log oubliĂ©s - [ ] ✅ Types TypeScript corrects (pas de `any`) ### Tests - [ ] ✅ Tests passent (`pnpm test`) - [ ] ✅ Coverage > 80% pour le code ajoutĂ© - [ ] ✅ Tests unitaires ET intĂ©gration (si applicable) ### Documentation - [ ] ✅ README mis Ă  jour (si nĂ©cessaire) - [ ] ✅ Code commentĂ© (fonctions complexes) - [ ] ✅ ADR créé (si dĂ©cision architecturale) ### Git - [ ] ✅ Commits suivent Conventional Commits - [ ] ✅ PR description complĂšte - [ ] ✅ Branche Ă  jour avec `develop` --- ## Besoin d'Aide ? - 📖 **Documentation** : Lire `docs/` - 💬 **Issues** : Poser une question via [GitHub Issues](https://github.com/VOTRE_REPO/issues) - 📧 **Email** : votre.email@example.com --- ## Remerciements Merci de contribuer Ă  ce projet ! Chaque contribution, petite ou grande, est apprĂ©ciĂ©e. 🙏 --- **DerniĂšre mise Ă  jour** : Octobre 2025