Skip to content
Back to projects

Pierre

Full-stack restaurant ordering platform — menu browsing, cart, checkout, and live order tracking, with an admin dashboard behind role-based access.

Pi

Overview

Pierre is a food ordering platform built as a two-part application: a NestJS REST API and a Next.js App Router frontend. The backend follows a pragmatic clean architecture — every feature module runs Controller → Service → Repository, so business rules never build SQL and database rows never leave a module. Every response travels in a single envelope, and the Zod schemas that validate requests are the same objects that generate the Swagger docs.

What it does

  • RESTful NestJS API with JWT authentication — access and rotating refresh tokens, reuse detection, and Argon2id password hashing.
  • Role-based authorization with globally applied guards; public routes are the explicit exception, not the default.
  • Relational data modelling with PostgreSQL and Drizzle ORM, with money stored as integer cents so floats never touch prices.
  • Redis for read-through caching, rate limiting, refresh-token storage, and JWT blacklisting.
  • Order lifecycle governed by a state machine, with domain events fanning out to BullMQ queues and Socket.IO clients.
  • Next.js frontend covering menu browsing, cart, checkout, order tracking, and an admin dashboard.
  • Containerized with Docker Compose and deployed behind Nginx with Let’s Encrypt HTTPS and GitHub Actions CI.

Built with

NestJSTypeScriptPostgreSQLDrizzle ORMRedisBullMQSocket.IONext.jsTailwind CSSJWTSwaggerDockerNginx