Update readme

This commit is contained in:
2026-02-12 22:29:42 +00:00
parent 50746595e7
commit 105831eeb3
2 changed files with 218 additions and 43 deletions
+218 -5
View File
@@ -7,12 +7,13 @@ Crussell is a **fullstack application** that powers a nailbar / salon book
```
Crussell/
├─ backend/ # Go 1.22 + chi router API
├─ frontend/ # SvelteKit SPA
├─ frontend/ # SvelteKit 5 SPA (static build)
├─ sabredav/ # PHP + Composer for DAV
├─ nginx/ # Nginx reverseproxy for HTTP & HTTPS
├─ init-scripts/ # PostgreSQL init SQL
├─ compose.yml # DockerCompose definition
├─ local-dev.sh # Development helper using tmux
├─ local-dev-2.sh # Enhanced seeding script with more test data
└─ README.md
```
@@ -22,7 +23,7 @@ Crussell/
|------|---------|
| Docker & DockerCompose | ≥ 20.10 |
| Go | ≥ 1.22 |
| Node ≥ 18 | `npm` |
| Node | ≥ 18 (npm) |
| tmux | ≥ 3.0 |
> **Tip**: If you already have Docker Desktop or Docker Engine installed, you are good to go.
@@ -65,7 +66,7 @@ chmod +x local-dev.sh
The script performs the following steps:
1. **Docker checks** starts Docker if it isnt already running.
1. **Docker checks** starts Docker if it isn't already running.
2. **PostgreSQL reset** removes the old volume and starts a fresh container.
3. **tmux session** creates `crussell-dev` with panes:
* `psql` console
@@ -92,7 +93,7 @@ The binary is then copied into the Docker image via the `Dockerfile`.
```bash
cd frontend
npm ci
npm run build # Production build
npm run build # Production build (static)
npm run dev # Development server
```
@@ -107,11 +108,13 @@ SabreDAV is bundled with PHPFPM and Composer. The Docker image installs depe
| `POSTGRES_USER` | DB username | `myuser` |
| `POSTGRES_PASSWORD` | DB password | `mysecret` |
| `POSTGRES_DB` | DB name | `mydb` |
| `JWT_SECRET_KEY` | HMAC key for JWT | `supersecret` |
| `JWT_SECRET_KEY` | HMAC key for JWT (HS256) | `supersecret` |
| `SABRE_DAV_*` | Optional SabreDAV overrides | |
Create a `.env` file in the project root based on the provided `.env.example`.
> **Note**: JWT tokens expire after 30 days. Login is rate-limited to 1 attempt per 5 seconds.
## 📊 Seeding Data
The `local-dev.sh` script automatically seeds:
@@ -120,6 +123,16 @@ The `local-dev.sh` script automatically seeds:
* Regular user (`user@example.com` / `password`)
* Six example nailbar services
The enhanced `local-dev-2.sh` script provides additional test data including:
* Multiple users with different roles and account types
* Working hours configurations
* Exceptional working hours groups (holiday schedules)
* Sample bookings with various statuses
* Payment records
* Admin notifications
* User referrals
If you want to seed manually, use the provided `init-scripts/init-script.sql` and your favourite Postgres client.
## 📌 Useful Commands
@@ -141,4 +154,204 @@ docker compose exec backend sh
---
## 🏗️ Implementation Status
### ✅ Complete
| Feature | Backend | Frontend | Notes |
|---------|---------|----------|-------|
| JWT Authentication | ✅ | ✅ | Login, register, middleware; HS256, 30-day expiry |
| Booking CRUD | ✅ | ⚠️ | Backend complete; frontend submit is stub (logs only) |
| Admin Endpoints | ✅ | ✅ | Services, users, today view, notifications |
| Scheduling System | ✅ | ✅ | Default hours, exceptional hours, working/available hours |
| Holiday Hours | ✅ | ✅ | Integrated in all 3 booking flows |
| Loyalty Backend | ✅ | ❌ | DB schema ready, no frontend component |
| VAT System | ✅ | ❌ | `get_vat_return_data()`, `calculate_vat()` functions exist |
| User Referrals | ✅ | ❌ | `user_referrals` table, backend logic exists |
### ⚠️ Partially Complete
| Feature | Status | Details |
|---------|--------|---------|
| Notifications | Backend only | Admin notifications wired; no frontend panel, no push (email/SMS), no regular user notifications |
| GDPR Compliance | DELETE only | `anonymize_user()`, `export_all_user_data()` exist but only DELETE is wired to endpoint |
| Analytics | Handler exists | `handlers/admin/analytics.go` exists but NOT wired in router |
### ❌ Not Wired (Handlers Exist)
| Handler | File | Notes |
|---------|------|-------|
| Social Auth | `handlers/auth/social.go` | OAuth integration placeholder |
| Analytics | `handlers/admin/analytics.go` | Statistics/dashboard endpoint |
| Portfolio Images | `handlers/portfolio/images.go` | Gallery management |
| RefreshTokenHandler | `handlers/auth/local.go:322` | Token refresh endpoint |
### 🚧 Critical TODOs
| Location | Issue | Priority |
|----------|-------|----------|
| `BookingFlow.svelte:600` | `submitBooking()` only logs, needs POST implementation | High |
| `BookingCreateModal.svelte:224` | Remove `console.log(users)` debug statement | Low |
| `/api/users/guest` | Guest endpoint for walk-ins not implemented | Medium |
| GDPR Export | Need endpoint for `export_all_user_data()` | Medium |
| Tax Export | Endpoint for VAT return data export | Medium |
### 📋 Feature Requests
| Feature | Description |
|---------|-------------|
| One-off Custom Services | Allow creating single-use services not in regular catalog |
| One-off Exceptional Hours | Single-day overrides without creating a group |
| Auto Lunch Protection | Prevent booking during lunch hours automatically |
---
## 🔄 Booking Flows
Crussell supports **three distinct booking flows**:
| Flow | User | Entry Point | Status |
|------|------|-------------|--------|
| Self-Service | Customer | `BookingFlow.svelte``/api/bookings` | ⚠️ Stub submit |
| Walk-In | Admin | Admin panel → walk-in modal | ✅ |
| Call/Message-In | Admin | Admin panel → booking modal | ✅ |
All three flows integrate with the **holiday/exceptional hours** system to prevent bookings during closed periods.
---
## 🔍 Helpful Greps
### All Three Booking Flows
**Backend - All Booking Creation Endpoints:**
```bash
grep -rn "func.*Create.*Booking\|func.*WalkIn\|func.*Walk.*In\|POST.*booking" backend/handlers/ --include="*.go"
```
**Frontend - All Booking Flow Components:**
```bash
grep -rln "BookingFlow\|WalkIn\|walk-in\|call.*in\|message.*in" frontend/src/lib/components/ --include="*.svelte"
```
**Combined - Single View of All Booking Flows:**
```bash
grep -rn "CreateBooking\|CreateWalkIn\|BookingFlow\|submitBooking" backend/ frontend/ --include="*.go" --include="*.svelte"
```
### Database Schema
**All Enums:**
```bash
grep -n "CREATE TYPE" init-scripts/init-script.sql
```
**All Tables:**
```bash
grep -n "CREATE TABLE" init-scripts/init-script.sql
```
**All Functions:**
```bash
grep -n "CREATE OR REPLACE FUNCTION" init-scripts/init-script.sql
```
### Router Endpoints
**All Wired Routes:**
```bash
grep -n "r\.\(Get\|Post\|Put\|Delete\|Patch\)" backend/main.go
```
**Middleware Chain:**
```bash
grep -n "r\.Use\|r\.Group" backend/main.go
```
### Authentication
**JWT Middleware:**
```bash
grep -rn "JWTMiddleware\|VerifyToken\|ParseToken" backend/ --include="*.go"
```
**Protected Routes:**
```bash
grep -n "r\.Group.*Auth" backend/main.go
```
### Holiday/Exceptional Hours
**Usage Across All Flows:**
```bash
grep -rn "exceptional.*hours\|holiday.*hours\|getExceptional\|getHoliday" backend/handlers/ frontend/src/ --include="*.go" --include="*.svelte"
```
### Notifications
**Admin Notifications:**
```bash
grep -rn "admin_notifications\|AdminNotification" backend/ --include="*.go"
```
**Notification Reasons (Enum Values):**
```bash
grep -A10 "admin_notification_reason" init-scripts/init-script.sql
```
### GDPR Functions
**Data Export/Anonymization:**
```bash
grep -rn "anonymize_user\|export_all_user_data\|delete_guest_user" backend/ --include="*.go" init-scripts/
```
### Frontend Debug Artifacts
**Console Logs to Remove:**
```bash
grep -rn "console\.log" frontend/src/ --include="*.svelte" --include="*.ts"
```
---
## 🗄️ Database Schema Overview
### Enums
| Enum | Values |
|------|--------|
| `account_role` | `user`, `admin` |
| `account_type` | `standard`, `vip`, `guest` |
| `booking_status` | `pending`, `confirmed`, `in_progress`, `completed`, `cancelled`, `no_show` |
| `payment_type` | `deposit`, `full`, `refund` |
| `payment_method` | `cash`, `card`, `bank_transfer`, `square` |
| `payment_status` | `pending`, `completed`, `failed`, `refunded` |
| `admin_notification_reason` | `pending_booking`, `cancelled_booking`, `rescheduled_booking`, `1_week_no_pay`, `1_month_no_pay`, `affiliate_claim` |
### Key Tables
| Table | Purpose |
|-------|---------|
| `users` | Customer and admin accounts |
| `services` | Salon service catalog |
| `bookings` | Appointment records |
| `booking_services` | Services per booking (many-to-many) |
| `payments` | Payment transactions |
| `working_hours` | Default weekly schedule |
| `exceptional_working_hours_groups` | Holiday/special schedules |
| `admin_notifications` | Admin alerts |
| `user_referrals` | Referral tracking |
### Validation Rules
| Field | Rules |
|-------|-------|
| Names | 1-50 chars, unicode letters/spaces/hyphen/apostrophe/dot |
| Phone | UK format → E.164 (+44...) |
| Age | Must be 16+ years |
| Login Rate Limit | 1 attempt per 5 seconds |
---
**Happy coding!**
-38
View File
@@ -1,38 +0,0 @@
# sv
Everything you need to build a Svelte project, powered by [`sv`](https://github.com/sveltejs/cli).
## Creating a project
If you're seeing this, you've probably already done this step. Congrats!
```sh
# create a new project in the current directory
npx sv create
# create a new project in my-app
npx sv create my-app
```
## Developing
Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server:
```sh
npm run dev
# or start the server and open the app in a new browser tab
npm run dev -- --open
```
## Building
To create a production version of your app:
```sh
npm run build
```
You can preview the production build with `npm run preview`.
> To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment.