Room booking REST API with conflict detection.
Live: https://mossabmirandeney.fr/bookshelf
- Node.js + Express + TypeScript
- PostgreSQL + Prisma ORM
- JWT authentication (role-based: user/admin)
- Zod input validation
- Docker (multi-stage build)
POST /api/auth/register— create accountPOST /api/auth/login— get JWT token
GET /api/rooms— list rooms (filter:?capacity=&floor=)GET /api/rooms/:id— room details + upcoming bookingsPOST /api/rooms— create room (admin)PATCH /api/rooms/:id— update room (admin)DELETE /api/rooms/:id— soft-delete (admin)
GET /api/bookings— list (filter:?mine=true&roomId=&from=&to=)POST /api/bookings— book a room (with overlap detection)POST /api/bookings/:id/cancel— cancelGET /api/bookings/room/:roomId/availability— check availability
cp .env.example .env
npm install
npx prisma migrate dev
npm run db:seed
npm run dev
src/
config/ env validation (Zod)
middleware/ auth (JWT), validate (Zod), errorHandler
routes/ auth, rooms, bookings
services/ business logic (conflict detection, CRUD)
schemas/ request validation schemas
lib/ Prisma client
When creating a booking, the API checks for overlapping time slots on the same room:
WHERE roomId = ? AND status = 'CONFIRMED'
AND startTime < :endTime AND endTime > :startTimeReturns 409 Conflict with the conflicting booking details.