DeliverTable — Restaurant Booking & Delivery Platform

DeliverTable is a restaurant platform that connects customers, restaurant owners and administrators: browse restaurants on an interactive map, order for delivery or dine in, and pay online.
- Context: team project (3 developers) at CCI Campus
- Role: lead developer — ~70% of the 694 commits, including all of the infrastructure, CI/CD and background workers
- Timeline: Feb – Jun 2026
- Scale: 7 .NET projects · 42 entities · 38 controllers · 86 Blazor pages and components · 770+ test cases
Overview
One application serving three audiences. Customers search and filter restaurants in a list or on a Leaflet map, build a cart, apply discount codes and promotions, order for delivery or dine-in, follow the status live and rate the restaurant afterwards. Restaurant owners manage their menu, promotions, loyalty programs and events, handle incoming orders from a real-time dashboard and track their earnings. Administrators get a platform-wide dashboard with 17 management sections, from user moderation to transactions, invoices and disputes.
Key features
- Discovery — search, cuisine and location filters, list and interactive map views, favourites and hidden restaurants
- Ordering — persistent per-restaurant cart, allergen and diet filters on dishes, discount codes, promotions, loyalty points
- Live orders — SignalR pushes status changes to customers and to the restaurant dashboard as they happen
- Payments — Stripe payment intents driven by webhooks, with refunds and a full dispute workflow
- Billing — invoice generation with its own numbering service, invoice reductions, and monthly commission statements per restaurant
- Administration — users (roles, suspensions, bans), restaurants, dishes, orders, order rules and blocked slots, ratings, notifications, moderation, transactions
- Onboarding — restaurant owner registration that creates the first restaurant in the same flow
Architecture
A .NET 10 solution split into seven projects:
| Project | Role |
|---|---|
| Server | ASP.NET Core 10 Web API — layered controllers → services → repositories, ServiceResult<T> instead of exceptions, SignalR hub |
| Client | Blazor WebAssembly SPA with a SCSS design system and CSS isolation |
| SharedLibrary | DTOs, enums and API routes shared by client and server — one source of truth for every route |
| Infrastructure | EF Core data access, Stripe gateway, invoicing, messaging |
| Worker | RabbitMQ consumers: emails (RazorLight + MailKit), invoice PDFs (QuestPDF), commission statements |
| Scheduler | Quartz jobs — monthly commission statements, order abandonment and restaurant timeout sweeps |
| Tests | NUnit 4 + NSubstitute, unit and integration suites |
Jobs are persisted before they are published, so a lost message is recovered: the worker retries through dedicated retry queues (1 min, 5 min, 15 min) before dead-lettering, and a sweep service re-publishes jobs left pending or stuck processing.
Engineering highlights
- Production deployment — Docker Compose across three isolated networks (public, frontend, backend), hardened containers, and a Cloudflare Tunnel so no port is ever exposed
- CI/CD — three-tier GitHub Actions pipeline: parallel fast gates (format, Semgrep SAST, NuGet vulnerability audit, Compose lint, license compliance) → Release build with warnings as errors → tests with a coverage threshold and production images scanned by Trivy with SBOMs
- Security — ASP.NET Core Identity with JWT bearer tokens, and claims refreshed on every authenticated request so a suspended or banned account loses access immediately
- Conventions — Conventional Commits with Azure Boards references, enforced by Git hooks that also run format checks and builds before every commit
- Documentation — specification, ER model, 33-page data dictionary, UML diagrams, mockups, brand guide and seven feature design specs (all available below)
Tech stack
- Frontend: Blazor WebAssembly, SCSS, Leaflet.js, Blazicons
- Backend: ASP.NET Core 10, Entity Framework Core, Identity, SignalR, Swagger/OpenAPI
- Async & jobs: RabbitMQ, Quartz.NET, MailKit, RazorLight, QuestPDF
- Data & storage: PostgreSQL, Redis, Garage (S3-compatible)
- Payments: Stripe
- DevOps: Docker, Nginx, Cloudflare Tunnel, GitHub Actions, Semgrep, Trivy, Dependabot