Skip to content

Couverture du plan ​

Chaque point du plan d'origine (Plan d'apprentissage NestJS, profil Java/Spring) est relié ici à la section du site qui le traite. Si vous avez lu toutes les sections citées, vous avez couvert l'ensemble du plan.

Sections générales du plan ​

Section du planContenuTraité dans
En-têteDémarrage le 9/11/2026, 11 jours, prérequis, stack, fil rouge TaskFlowPlan et méthode
1. Principe de travailMatin théorie (3 h), après-midi pratique (3 h), 30 min de LEARNINGS.md + tag jour-XX, 11/11 férié, un commit par jourMéthode, journal
2. CalendrierLes 11 jours, thèmes et livrablesCalendrier
3. Table Spring ↔ NestJSLes 34 correspondancesWeb, injection, données, pipeline, configuration, sécurité, asynchrone, tests, outillage
4. Event loop vs thread-per-requestUn thread JS, await partout, pas de calcul lourd, promesse non attendue, Promise.all, WebFluxEvent loop, conséquences, calcul CPU, WebFlux
4. Conteneur d'injectionTypes effacés, emitDecoratorMetadata, tokens pour les interfaces, déclarer et exporter, forwardRefEffacement des types, tokens, pas de scan, dépendances circulaires
4. Écosystèmenpm et lockfiles, pas de JVM, décorateurs = fonctionsÉcosystème
6. Modèle de domaineUSER, PROJECT, PROJECT_MEMBER, TASK ; statutsModèle, statuts
7. Docker Composedb, db-test (tmpfs), adminer, redis optionnel ; .env.exampledocker-compose.yml, fichiers .env
8. Structure du repoArborescence cible, conventions de nommageArborescence, conventions
9. Suivi de progressionCases J1 à J11Suivi
10. RessourcesDoc officielle, TypeORM, cours Fundamentals, event loop NodeRessources
11. Pièges fréquentsLes 8 piègesawait oublié, synchronize, entités brutes, dépendance circulaire, état dans un singleton, validation, égalité et this, @Res()

J1 · Fondations Node et Nest ​

Point du planTraité dans
Node, event loop (phases, microtasks vs macrotasks)Event loop
Promise, async/awaitPromise et async/await
Modules ES / CommonJSModules ES et CommonJS
Structure Nest : main.ts, AppModule, AppController, AppServiceStructure d'un projet Nest
Nest CLI : nest new, nest g module/controller/service/resourceNest CLI, aide-mémoire Nest CLI
npm i -g @nestjs/cli puis nest new taskflowGénérer le projet
docker-compose.yml (PostgreSQL + Adminer)Docker Compose
GET /health renvoyant { status: 'ok' }GET /health
Repo git, .gitignore, README.md, LEARNINGS.mdDépôt git
Exercice /block contre /ping, puis await sleep(5000)Exercice event loop
SpringApplication.run ↔ NestFactory.createStructure d'un projet Nest

J2 · Controllers, DTO, validation ​

Point du planTraité dans
Décorateurs de routingRouting
Status codes (@HttpCode)Codes de statut
Versioning d'APIVersioning
DTO en classes, class-validator, class-transformerDTO et validation
ValidationPipe global (whitelist, transform, forbidNonWhitelisted)ValidationPipe global
@nestjs/mapped-types : PartialType, PickType, OmitTypeMapped types
nest g resource projectsGénérer la ressource
CreateProjectDto, UpdateProjectDto avec validationDTO
CRUD en mémoireCRUD en mémoire
Pagination et filtre via @Query() et un QueryDtoPagination
@Valid + Bean Validation ↔ ValidationPipe + class-validatorSpring → NestJS
ResponseEntity ↔ objet + @HttpCode (ou @Res(), à éviter)Codes de statut, pièges

J3 · Injection de dépendances et modules ​

Point du planTraité dans
Providers : useClass, useValue, useFactory, useExistingProviders
Tokens personnalisés, @Inject, @OptionalTokens
Scopes : default, request, transient (coût et limites)Scopes
Modules : imports, exports, @GlobalModules
Modules dynamiques (forRoot, forRootAsync)Modules dynamiques
Logique isolée dans ProjectsServiceProjectsService
Abstraction ProjectsStore (interface + token) en mémoireProjectsStore
CommonModule pour les utilitaires partagésCommonModule
@Configuration + @Bean ↔ useFactoryProviders
Profil conditionnel ↔ provider choisi selon la configurationProjectsStore

J4 · PostgreSQL et TypeORM ​

Point du planTraité dans
@nestjs/typeorm, forRoot / forRootAsync / forFeature@nestjs/typeorm
Entités, colonnesEntités
Types PostgreSQL : uuid, timestamptz, jsonb, enumsTypes PostgreSQL
Repository : find, findOne, save, softDeleteRepository
QueryBuilderQueryBuilder
synchronize: true en dev uniquementsynchronize
Entité ProjectL'entité Project
Remplacer la mémoire par TypeORM sans changer le contrôleurTypeORM derrière ProjectsStore
Seed de données de devSeed
JpaRepository ↔ Repository<T> ; pas de requêtes dérivées (ILike, QueryBuilder) ; pas de Page<T> (findAndCount + skip/take)Spring → NestJS, recherche et pagination

J5 · Relations, migrations, transactions ​

Point du planTraité dans
OneToMany, ManyToOne, ManyToManyRelations
Chargement eager, lazy, relations: []Chargement
Problème N+1, leftJoinAndSelectN+1
Migrations : generate, run, revert ; désactiver synchronizeMigrations
Transactions : dataSource.transaction(), QueryRunnerTransactions, QueryRunner
Entité Task liée à ProjectL'entité Task
POST /projects/:id/tasks, PATCH /tasks/:id/statusEndpoints
Archiver un projet et ses tâches (transaction)Archiver
Première migration générée et versionnéeLa première migration
@Transactional ↔ pas d'équivalent déclaratif, manager propagéTransactions

J6 · Pipeline de requête ​

Point du planTraité dans
Ordre d'exécution Middleware → … → Exception FiltersOrdre d'exécution
Exceptions HTTP intégréesExceptions HTTP
ExceptionFilter, @Catch(), APP_FILTERFiltre global
Pipes : ParseUUIDPipe, ParseEnumPipe, pipes customPipes
Interceptors : logging, timing, mapping de réponse, cacheInterceptors
Middleware fonctionnel ou classe, configure(consumer)Middleware
AllExceptionsFilter global au format problem+jsonAllExceptionsFilter
Erreurs TypeORM : unicité → 409, non trouvé → 404Erreurs TypeORM
LoggingInterceptor (durée, méthode, route)LoggingInterceptor
CorrelationIdMiddlewareCorrelationIdMiddleware
@ControllerAdvice ↔ APP_FILTER ; Filter ↔ middleware ; @Around ↔ interceptorSpring → NestJS

J7 · Configuration et logging ​

Point du planTraité dans
ConfigModule.forRoot({ isGlobal, validate })ConfigModule
registerAs, config typéeConfiguration typée
Validation du schéma d'environnement (Joi ou class-validator)Validation
Logging : Logger Nest ou nestjs-pinoLogging
OnModuleInit, OnApplicationShutdown, enableShutdownHooks()Cycle de vie
.env.development, .env.test, .env.example (seul versionné)Fichiers .env
Config typée pour DB, JWT, portConfiguration typée
Logs JSON avec correlationId via nestjs-pinoLogs JSON
@ConfigurationProperties ↔ registerAs ; @PostConstruct ↔ OnModuleInit ; @PreDestroy ↔ OnModuleDestroy ; profils ↔ NODE_ENVSpring → NestJS, profils

J8 · Authentification et autorisation ​

Point du planTraité dans
@nestjs/passport + passport-jwt, @nestjs/jwtPassport et JWT
Hash : argon2 ou bcryptHash de mot de passe
AuthGuard, guard global, @Public()Guard global, routes publiques
Décorateurs de paramètre (@CurrentUser())@CurrentUser()
RBAC : @Roles() + RolesGuard avec ReflectorRBAC
Module users (User, rôles ADMIN / MEMBER)Module users
POST /auth/register, POST /auth/login (option refresh token)Inscription et connexion, refresh token
Guard JWT global, routes publiques @Public()Guard JWT global
Un utilisateur ne voit que ses projetsUn utilisateur ne voit que ses projets
SecurityFilterChain ↔ guards globaux ; @PreAuthorize ↔ @Roles ; SecurityContextHolder ↔ @CurrentUser()Spring → NestJS

J9 · Événements, cron, queues ​

Point du planTraité dans
@nestjs/event-emitter : emit, @OnEvent, listeners asyncÉvénements applicatifs
@nestjs/schedule : @Cron, @Interval, @TimeoutTâches planifiées
@nestjs/bullmq : processors, retries, backoffJobs Redis
Une exception de listener ne remonte pas à l'appelantErreurs asynchrones
Événement task.status.changed → NotificationsListenerÉvénement
Cron quotidien OVERDUECron OVERDUE
Optionnel : Redis + BullMQ pour les notificationsFile BullMQ
ApplicationEventPublisher ↔ EventEmitter2 ; @EventListener ↔ @OnEvent ; @Scheduled ↔ @Cron ; JMS / Batch ↔ BullMQSpring → NestJS

J10 · Tests ​

Point du planTraité dans
Jest : describe, it, jest.fn(), jest.mock(), beforeEachJest
Test.createTestingModule avec providers mockés (useValue)Testing module
e2e avec supertest et une base dédiée (Testcontainers ou Compose)Tests e2e, base de test
Mock de repositories : getRepositoryToken(Entity)Mocker un repository
Tests unitaires de ProjectsService et TasksServiceTests unitaires
e2e : register → login → projet → tâche → statutParcours e2e
Seuil de couverture, npm run test:covSeuil de couverture
Mockito ↔ jest.fn() / jest.Mocked<T> ; @SpringBootTest + MockMvc ↔ testing module + supertest ; @DataJpaTest ↔ vraie baseSpring → NestJS

J11 · Finalisation et mise en production ​

Point du planTraité dans
@nestjs/swagger : plugin CLI, @ApiProperty, @ApiTags, @ApiBearerAuthSwagger
@nestjs/terminus : DB, mémoire, disqueHealth checks
helmet, CORS, @nestjs/throttlerSécurité
Dockerfile multi-stage, non root, npm ci --omit=devDockerfile
CI GitLab : lint, tests, build de l'imageCI
Swagger sur /docsSwagger sur /docs
/health Terminus (readiness et liveness)/health
Dockerfile et service app dans le ComposeDocker
.gitlab-ci.yml : install, lint, test, buildPipeline
Revue finale : LEARNINGS.md, READMERevue finale

Au-delà du plan ​

Ces sections ne figurent pas dans le plan ; elles viennent des problèmes rencontrés en construisant TaskFlow avec les versions actuelles (NestJS 12, TypeORM 1.1, BullMQ 6) :