1. RESTful Notes & Tagging API
Build a production-grade RESTful Notes API featuring user authentication, markdown note CRUD operations, tag filtering, and PostgreSQL storage with Prisma ORM.
Node.js
Express
TypeScript
PostgreSQL
Prisma
Zod
JWT
Bcrypt
Core Features & Requirements
JWT Authentication (Register, Login, Me)
Full CRUD operations for Notes with Markdown content
Tag assignment & tag filtering query parameters
Request body validation using Zod schemas
Centralized Error Handler and standard response wrapper
Recommended Production Directory Structure
notes-api/ ├── prisma/ │ └── schema.prisma ├── src/ │ ├── config/ │ │ └── env.ts │ ├── controllers/ │ │ ├── auth.controller.ts │ │ └── notes.controller.ts │ ├── middleware/ │ │ ├── auth.middleware.ts │ │ └── error.middleware.ts │ ├── routes/ │ │ ├── auth.routes.ts │ │ └── notes.routes.ts │ ├── services/ │ │ └── notes.service.ts │ ├── utils/ │ │ └── jwt.ts │ └── app.ts ├── package.json └── tsconfig.json
Step-by-Step Implementation Guide
1Initialize Project & Dependencies
Set up package.json, install express, prisma, @prisma/client, jsonwebtoken, bcryptjs, zod, and typescript.
npm init -y npm install express prisma @prisma/client jsonwebtoken bcryptjs zod dotenv npm install -D typescript @types/node @types/express @types/jsonwebtoken @types/bcryptjs tsx
2Define Prisma Relational Schema
Create User and Note models with 1:N relations in prisma/schema.prisma.
model User {
id String @id @default(uuid())
email String @unique
password String
notes Note[]
createdAt DateTime @default(now())
}
model Note {
id String @id @default(uuid())
title String
content String
tags String[]
userId String
user User @relation(fields: [userId], references: [id])
createdAt DateTime @default(now())
}3Build Authentication & Notes Controllers
Implement secure registration, bcrypt password hashing, JWT signing, and CRUD route controllers.
