A full-stack food delivery order management app built as a Sr Full Stack Developer assessment.
- Frontend: https://fooddash-frontend.vercel.app
- Backend API: https://backend-production-0ad7.up.railway.app
- GitHub Repository: https://github.com/pintu544/fooddash
Clone and run locally:
git clone https://github.com/pintu544/fooddash.git
cd fooddash
npm install
# Backend setup
cd backend && cp .env.example .env
# Edit .env with your DATABASE_URL
# Run migrations & seed
npx prisma migrate dev
npx prisma db seed
# Start in two terminals
npm run dev:backend # Terminal 1: Backend (port 4000)
npm run dev:frontend # Terminal 2: Frontend (port 3000)| Layer | Technology |
|---|---|
| Frontend | Next.js 16 (App Router), TypeScript, Tailwind CSS |
| Backend | Node.js, Express, TypeScript |
| Database | PostgreSQL via Prisma ORM |
| Real-time | Socket.io (WebSockets) |
| Testing | Jest + Supertest, React Testing Library, Playwright |
| Deployment | Vercel (frontend) + Railway (backend + DB) |
- Menu Display — Browse food items with name, description, price, and image
- Cart — Add/remove items, adjust quantities, persisted to localStorage
- Checkout — Delivery details form with client and server-side validation
- Order Tracking — Real-time status updates via Socket.io WebSockets
- Auto Status Advance — Orders auto-progress: Received → Preparing → Out for Delivery → Delivered
- Admin Override —
PATCH /api/orders/:id/statusto manually set status
food-delivery/
├── backend/ # Express API + Socket.io
│ ├── prisma/
│ │ ├── schema.prisma # DB schema (MenuItem, Order)
│ │ └── seed.ts # Seed 8 menu items
│ ├── src/
│ │ ├── app.ts # Express app factory
│ │ ├── index.ts # HTTP server + Socket.io init
│ │ ├── lib/
│ │ │ ├── prisma.ts # Prisma client singleton
│ │ │ ├── socket.ts # Socket.io initialisation
│ │ │ └── orderTimer.ts # Auto-advance status logic
│ │ ├── middleware/
│ │ │ └── errorHandler.ts
│ │ └── routes/
│ │ ├── menu.ts # GET /api/menu
│ │ └── orders.ts # POST/GET/PATCH /api/orders
│ └── tests/ # Jest + Supertest tests
└── frontend/ # Next.js app
├── app/
│ ├── layout.tsx # Root layout with CartProvider + Navbar
│ ├── page.tsx # Menu page (server component)
│ ├── checkout/ # Checkout form
│ └── orders/[id]/ # Order tracking page
├── components/ui/ # MenuItemCard, CartDrawer, Navbar, etc.
├── context/ # CartContext (useReducer + localStorage)
├── hooks/ # useOrderStatus (Socket.io)
├── lib/ # API client
├── types/ # Shared TypeScript types
├── __tests__/ # React Testing Library tests
└── e2e/ # Playwright E2E tests
- Node.js 18+
- PostgreSQL 14+
git clone https://github.com/pintu544/fooddash.git
cd fooddash
npm install# Backend
cp backend/.env.example backend/.env
# Edit backend/.env with your DATABASE_URL
# Frontend
cp frontend/.env.example frontend/.env.localcd backend
# Run migrations
npx prisma migrate dev --name init
# Seed menu items
npx prisma db seed# In two terminals:
# Terminal 1 — Backend (port 4000)
npm run dev:backend
# Terminal 2 — Frontend (port 3000)
npm run dev:frontend| Method | Endpoint | Description |
|---|---|---|
| GET | /api/menu |
List all available menu items |
| POST | /api/orders |
Create a new order |
| GET | /api/orders/:id |
Get order by ID |
| PATCH | /api/orders/:id/status |
Update order status (admin) |
| GET | /health |
Health check |
{
"customerName": "Jane Doe",
"address": "123 Main Street, Springfield",
"phone": "+1 555-0100",
"items": [
{ "menuItemId": "...", "name": "Margherita Pizza", "price": 12.99, "quantity": 2 }
]
}{ "status": "PREPARING" }Valid statuses: RECEIVED, PREPARING, OUT_FOR_DELIVERY, DELIVERED
# Backend unit + API tests
npm run test:backend
# Frontend component tests
npm run test:frontend
# E2E tests (requires running dev stack)
npm run test:e2eThis project is deployed on:
- Frontend: Vercel → https://fooddash-frontend.vercel.app
- Backend API: Railway → https://backend-production-0ad7.up.railway.app
- Database: PostgreSQL on Railway
cd frontend
vercel --prodSet environment variables in Vercel dashboard:
NEXT_PUBLIC_API_URL— your Railway backend URLNEXT_PUBLIC_SOCKET_URL— your Railway backend URL
cd backend
railway login
railway upSet environment variables on Railway:
DATABASE_URL— auto-provided by Postgres addonPORT—4000FRONTEND_URL— your Vercel app URL (for CORS)NODE_ENV—production
- Monorepo with npm workspaces (
backend/,frontend/) - Prisma manages schema migrations and type-safe DB access
- Socket.io rooms — each order gets its own room
order:{id}; clients join on page load - Auto-advance timers run server-side via
setTimeoutchains (10s → 30s → 60s) - Zod validates all API inputs on the backend;
react-hook-form + zodon the frontend - Next.js App Router — menu page is a Server Component for SEO/performance; interactive pages use
"use client"