- README: add Square payments to features, expand project structure, update test count - Overview: mark Square as active, add payment integration + saved cards sections - Technical Manual: add payment handlers, API endpoints, 4 new DB tables, build tags - Admin Manual: update Take Payment from stub to live Square Terminal flow - User Manual: add paying deposits online + leaving tips sections - Future Work: mark E1-E4 (Square items) as complete
3.5 KiB
3.5 KiB
Crussell
Nail salon booking platform — Go 1.25 backend + SvelteKit 5 frontend + Docker. Built for a UK sole-trader nail artist.
Features
- Three booking flows: self-service (customer), walk-in (admin), call-in (admin)
- Slot reservations: temporary holds prevent double-booking (4 TTL types)
- Guest accounts: disposable accounts for one-off bookings, GDPR-compliant anonymization
- Service eligibility: age requirements + patch test validation
- Deposit system: 3-strike rule for late cancellations, 24-hour threshold
- Square payments: in-person Terminal + online Web Payments SDK (dev mock + prod stub, build-tagged)
- Payment types: deposit, full, partial, balance, tip — with saved cards, refunds, and webhook handling
- Scheduling: default hours, holiday overrides, time blockers
- Loyalty & discounts: stamp-based loyalty, time-based and milestone campaigns
- Portfolio gallery: S3/R2 storage with tag/category filtering
- CardDAV sync: profile photos synced to SabreDAV contacts
- Admin notifications: priority-sorted queue with bell icon,
/notificationspage, acknowledge flow - User notification preferences: per-channel toggles (email, SMS, browser) in account settings
Project Structure
Crussell/
├─ backend/ # Go 1.25 + chi router API
│ ├─ handlers/ # API handlers (auth, bookings, payments, scheduling, etc.)
│ │ ├─ payments/ # Square payment handlers (terminal, online, refunds, tips)
│ │ └─ webhooks/ # Square webhook handler
│ ├─ internal/ # Internal packages
│ │ └─ square/ # Square client (dev mock + prod stub, build-tagged)
│ └─ testutils/ # Test helpers (fixtures, testdb, JWT)
├─ frontend/ # SvelteKit 5 SPA (static build)
│ └─ src/lib/components/
│ ├─ payments/ # PaymentModal (admin), UserPaymentModal (user)
│ └─ booking/ # BookingFlow (5-step wizard)
├─ sabredav/ # PHP + Composer for DAV
├─ nginx/ # Nginx reverse-proxy for HTTP & HTTPS
├─ init-scripts/ # PostgreSQL init SQL
├─ compose.yml # Docker-Compose definition
├─ local-dev-2.sh # Dev helper using tmux (seeds DB with test data)
└─ README.md
Prerequisites
| Tool | Version |
|---|---|
| Docker & Docker Compose | >= 20.10 |
| Go | >= 1.22 |
| Node | >= 18 (npm) |
| tmux | >= 3.0 |
Getting Started
Docker Compose
cp .env.example .env
# Edit .env — set POSTGRES_*, JWT_SECRET_KEY
docker compose up --build -d
| Service | URL |
|---|---|
| Frontend | http://localhost |
| API | http://localhost/api |
| SabreDAV | http://localhost/dav |
Local Development
chmod +x local-dev-2.sh
./local-dev-2.sh
Launches a tmux session (crussell-dev) with 4 panes: psql console, Go dev server, Svelte dev server, and Rustfs logs. Seeds the database with 20 users, 12 services, 43 bookings, guest accounts, time blockers, and exceptional hours.
Default login (all password: password):
- Admin:
admin@example.com - User:
user@example.com
Building & Testing
# Backend
cd backend && go build -o bin/backend ./main.go
# Frontend
cd frontend && npm ci && npm run build
# Tests (351/351 passing)
cd backend && go test -tags "test,dev" ./...
Full Documentation
For detailed user journeys, admin workflows, architecture, API reference, and database schema, see obsidian/Crussell/.