Module 01
⭐⭐ Moyen
~2h
📝 API Notes — Prise de notes TypeScript-first
Construire une API REST de prise de notes avec NestJS et TypeScript strict. Appliquer les types, interfaces, génériques et décorateurs du Module 01.
🎯 Objectifs
- Créer un projet NestJS avec la CLI et configurer TypeScript strict
- Définir les interfaces et types TypeScript pour les notes
- Implémenter les décorateurs personnalisés
@CurrentUseret@Public - Utiliser les génériques pour les réponses API paginées
- Configurer les variables d'environnement avec ConfigModule
📋 Structure attendue
notes-api/
├── src/
│ ├── notes/
│ │ ├── dto/create-note.dto.ts
│ │ ├── dto/update-note.dto.ts
│ │ ├── interfaces/note.interface.ts
│ │ ├── notes.controller.ts
│ │ ├── notes.module.ts
│ │ └── notes.service.ts
│ ├── common/
│ │ ├── decorators/current-user.decorator.ts
│ │ ├── interfaces/api-response.interface.ts
│ │ └── types/pagination.type.ts
│ ├── app.module.ts
│ └── main.ts
└── .env
🔧 Code de démarrage
interfaces/note.interface.ts
export interface Note {
readonly id: string;
title: string;
content: string;
tags: string[];
color: NoteColor;
pinned: boolean;
archived: boolean;
createdAt: Date;
updatedAt: Date;
}
export type NoteColor = 'default' | 'red' | 'orange' | 'yellow' | 'green' | 'blue' | 'purple';
export type CreateNoteDto = Omit<Note, 'id' | 'createdAt' | 'updatedAt'>;
export type UpdateNoteDto = Partial<CreateNoteDto>;
export interface NotesFilter {
tag?: string;
color?: NoteColor;
pinned?: boolean;
archived?: boolean;
search?: string;
}
export interface PaginatedNotes {
items: Note[];
total: number;
page: number;
limit: number;
totalPages: number;
}
notes.service.ts — à compléter
@Injectable()
export class NotesService {
private notes: Note[] = [];
// TODO: implémenter findAll avec filtres et pagination
findAll(filter: NotesFilter, page: number, limit: number): PaginatedNotes { ... }
// TODO: implémenter findOne (lancer NotFoundException si absent)
findOne(id: string): Note { ... }
// TODO: implémenter create avec génération UUID
create(dto: CreateNoteDto): Note { ... }
// TODO: implémenter update (merge partiel)
update(id: string, dto: UpdateNoteDto): Note { ... }
// TODO: implémenter remove
remove(id: string): void { ... }
// TODO: implémenter togglePin
togglePin(id: string): Note { ... }
}
✅ Endpoints à implémenter
| Méthode | Route | Description |
|---|---|---|
| GET | /notes | Liste paginée + filtres (tag, color, search) |
| GET | /notes/:id | Récupérer une note par ID |
| POST | /notes | Créer une nouvelle note |
| PATCH | /notes/:id | Modifier une note (partiel) |
| POST | /notes/:id/pin | Épingler/désépingler |
| DELETE | /notes/:id | Supprimer une note |