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

📋 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/notesListe paginée + filtres (tag, color, search)
GET/notes/:idRécupérer une note par ID
POST/notesCréer une nouvelle note
PATCH/notes/:idModifier une note (partiel)
POST/notes/:id/pinÉpingler/désépingler
DELETE/notes/:idSupprimer une note
← Cours ✏️ Exercices 🧠 QCM NS01 Module 02 →