API REST simples para gerenciar cursos, estudantes e matrículas.
- Instale as dependências:
npm install- Inicie a aplicação em modo de desenvolvimento:
npm run dev- A API estará disponível em:
http://localhost:3000
- A documentação Swagger está disponível em:
http://localhost:3000/docs
- Inicie o serviço com Docker Compose:
docker compose up --build- A API estará disponível em:
http://localhost:3000
- Para rodar em segundo plano:
docker compose up -d --build- Para parar e remover os containers:
docker compose downA aplicação usa
express,Prisma, SQLite ezodpara validação.
catalog-api/
├── src/
│ ├── app.ts
│ ├── config/
│ │ ├── openapi.ts
│ │ └── swagger.ts
│ ├── db/
│ │ └── prisma.ts
│ ├── routes/
│ │ ├── course.routes.ts
│ │ ├── enrollment.routes.ts
│ │ ├── index.ts
│ │ └── student.routes.ts
│ ├── middlewares/
│ │ ├── AppError.ts
│ │ ├── errorHandler.ts
│ │ └── notFoundHandler.ts
│ ├── student/
│ │ ├── student.controller.ts
│ │ ├── student.repository.ts
│ │ ├── student.schema.ts
│ │ └── student.service.ts
│ ├── course/
│ │ ├── course.controller.ts
│ │ ├── course.repository.ts
│ │ ├── course.schema.ts
│ │ └── course.service.ts
│ └── enrollment/
│ ├── enrollment.controller.ts
│ ├── enrollment.repository.ts
│ ├── enrollment.schema.ts
│ └── enrollment.service.ts
├── prisma/
│ ├── schema.prisma
│ ├── seed.ts
│ └── migrations/
├── tests/
│ ├── course.integration.spec.ts
│ ├── enrollment.integration.spec.ts
│ ├── student.integration.spec.ts
│ └── helpers/reset-db.ts
├── jest.config.ts
├── package.json
└── tsconfig.json
src/routes/: definição das rotas e endpoints.src/*/*.controller.ts: lógica de entrada e resposta por recurso.src/*/*.service.ts: regras de negócio e validações de alto nível.src/*/*.repository.ts: acesso direto ao banco via Prisma.src/*/*.schema.ts: validação de request/response com Zod.src/middlewares/: tratamento de erros, 404 e respostas de exceção.src/config/: configuração da geração OpenAPI/Swagger.
POST /courses- Body:
{ title, category?, description? } - Retorna:
201com o curso criado.
- Body:
GET /courses- Query opcional:
cursorId,cursorCategory - Retorna:
200com a lista de cursos.
- Query opcional:
GET /courses/:id- Retorna:
200com o curso encontrado.
- Retorna:
PUT /courses/:id- Body:
{ title, category?, description? } - Retorna:
200com o curso atualizado.
- Body:
DELETE /courses/:id- Retorna:
204quando o curso é removido.
- Retorna:
POST /students- Body:
{ name, email } - Retorna:
201com o estudante criado.
- Body:
GET /students- Query opcional:
cursorId,cursorCategory - Retorna:
200com a lista de estudantes.
- Query opcional:
GET /students/:id- Retorna:
200com o estudante encontrado.
- Retorna:
PUT /students/:id- Body:
{ name, email } - Retorna:
200com o estudante atualizado.
- Body:
DELETE /students/:id- Retorna:
204quando o estudante é removido.
- Retorna:
POST /enrollments?courseId={courseId}&studentId={studentId}- Cria uma matrícula entre curso e estudante.
- Retorna:
201com a matrícula criada.
GET /students/:studentId/enrollments- Retorna:
200com as matrículas do estudante.
- Retorna:
DELETE /enrollments/:id- Retorna:
204quando a matrícula é removida.
- Retorna:
- Executa o banco de testes e os testes Jest:
npm test- Executa com geração de cobertura:
npm run test:coverageOs scripts já aplicam
prisma db pushno banco de teste antes de rodar.
- Validações de entrada usam
zod. - Documentação Swagger gerada automaticamente a partir dos schemas em
/docs. - Erros do Prisma e validação retornam códigos HTTP apropriados (
400,404,409,422,500). - A API é organizada em camadas de rota, controller, service e repository.