From 17dbf629a25260f41e6fcd4ec86d5acf1300b2b5 Mon Sep 17 00:00:00 2001 From: HotelSync Date: Tue, 17 Mar 2026 13:33:27 +0300 Subject: [PATCH] Add docs, robots.txt and fix migration syntax - backend/README.md: full API and DB documentation - public/robots.txt: block all pages except root for SEO - index.html: add noindex meta tag for inner SPA pages - 002_extend.sql: fix RENAME COLUMN syntax (remove unsupported IF EXISTS) Co-Authored-By: Claude Sonnet 4.6 --- backend/README.md | 149 ++++++++++++++++++++++++++++++ backend/migrations/002_extend.sql | 4 +- index.html | 1 + public/robots.txt | 5 + 4 files changed, 157 insertions(+), 2 deletions(-) create mode 100644 backend/README.md create mode 100644 public/robots.txt diff --git a/backend/README.md b/backend/README.md new file mode 100644 index 0000000..6f82946 --- /dev/null +++ b/backend/README.md @@ -0,0 +1,149 @@ +# HotelSync — Backend API + +Fastify + TypeScript + PostgreSQL + Redis + +## Stack + +- **Runtime**: Node.js 20 +- **Framework**: Fastify 4 +- **Database**: PostgreSQL 16 +- **Cache / Sessions**: Redis 7 +- **Auth**: JWT (access 1h) + opaque refresh token (30d, stored in Redis) +- **Language**: TypeScript (strict mode off for unused vars) + +## API Base URL + +``` +https://api.hotelsync.ru +``` + +## Auth + +``` +POST /api/auth/login { email, password } → { token, refreshToken, user } +POST /api/auth/refresh { refreshToken } → { token } +POST /api/auth/logout +GET /api/auth/me +``` + +All protected routes require `Authorization: Bearer `. + +## Routes + +``` +GET /api/hotels (super_admin) +POST /api/hotels (super_admin) + +GET /api/hotels/:slug/rooms +POST /api/hotels/:slug/rooms +PATCH /api/hotels/:slug/rooms/:id +DELETE /api/hotels/:slug/rooms/:id + +GET /api/hotels/:slug/bookings +POST /api/hotels/:slug/bookings +PATCH /api/hotels/:slug/bookings/:id + +GET /api/hotels/:slug/guests +POST /api/hotels/:slug/guests +PATCH /api/hotels/:slug/guests/:id + +GET /api/hotels/:slug/housekeeping +POST /api/hotels/:slug/housekeeping +PATCH /api/hotels/:slug/housekeeping/:id + +GET /api/hotels/:slug/users +POST /api/hotels/:slug/users +PATCH /api/hotels/:slug/users/:id + +GET /api/hotels/:slug/channels +PATCH /api/hotels/:slug/channels/:id + +GET /api/hotels/:slug/tariffs +POST /api/hotels/:slug/tariffs +PATCH /api/hotels/:slug/tariffs/:id + +GET /api/hotels/:slug/discounts +POST /api/hotels/:slug/discounts +PATCH /api/hotels/:slug/discounts/:id + +GET /api/hotels/:slug/reviews +POST /api/hotels/:slug/reviews +PATCH /api/hotels/:slug/reviews/:id + +GET /api/hotels/:slug/maintenance +POST /api/hotels/:slug/maintenance +PATCH /api/hotels/:slug/maintenance/:id + +GET /api/hotels/:slug/pos/categories +GET /api/hotels/:slug/pos/items +GET /api/hotels/:slug/pos/orders +POST /api/hotels/:slug/pos/orders + +# CP Admin panel (super_admin only) +GET /api/admin/hotels +POST /api/admin/hotels +PATCH /api/admin/hotels/:id +GET /api/admin/users +POST /api/admin/users +PATCH /api/admin/users/:id +``` + +## Database Migrations + +Migrations run automatically on container startup (in order). + +| File | Description | +|------|-------------| +| `migrations/001_schema.sql` | Base schema: hotels, rooms, bookings, users, channels, housekeeping | +| `migrations/002_extend.sql` | Extended schema: guests, tariffs, discounts, loyalty, reviews, maintenance, POS, document templates, hotel settings | + +### Key tables + +| Table | Description | +|-------|-------------| +| `hotels` | Hotels with plan, contact info, check-in/out times | +| `rooms` | Rooms with beds JSONB, extra_place JSONB, child_policy JSONB | +| `room_categories` | Room categories per hotel | +| `guests` | Guest database with loyalty points/tiers | +| `bookings` | Bookings with guest_id, payment_status, meal_plan | +| `tariffs` | Pricing tariffs (percent / fixed / multiplier) | +| `discounts` | Discounts and promo codes | +| `loyalty_rules` | Point accrual rules (stay, review, birthday...) | +| `loyalty_tiers` | Tier thresholds (standard/silver/gold/platinum) | +| `reviews` | Guest reviews from all sources | +| `maintenance_tasks` | Maintenance tasks per room | +| `pos_categories` | POS item categories | +| `pos_items` | POS menu items with price and VAT | +| `pos_orders` | POS orders with JSONB items | +| `document_templates` | HTML templates for registration cards, invoices | +| `hotel_settings` | Key-value JSONB settings per hotel | + +## Demo accounts (seeded automatically) + +| Email | Password | Role | +|-------|----------|------| +| admin@hotelsync.io | demo | super_admin | +| manager@grand-palace.ru | demo | hotel_manager | +| cleaner@grand-palace.ru | demo | housekeeper | + +## Running locally + +```bash +cd backend +npm install +npm run dev +``` + +Requires `.env`: +``` +DATABASE_URL=postgres://hotelsync:password@localhost:5432/hotelsync +REDIS_URL=redis://localhost:6379 +JWT_SECRET=your-secret +``` + +## Docker + +```bash +docker build -t hotelsync-api . +docker run -p 3000:3000 --env-file .env hotelsync-api +``` diff --git a/backend/migrations/002_extend.sql b/backend/migrations/002_extend.sql index d226483..0b5a3c9 100644 --- a/backend/migrations/002_extend.sql +++ b/backend/migrations/002_extend.sql @@ -44,8 +44,8 @@ ALTER TABLE rooms ADD COLUMN IF NOT EXISTS photos TEXT[] NOT NULL DEFAULT '{}'; -- Переименуем старые поля для единообразия -ALTER TABLE rooms RENAME COLUMN IF EXISTS capacity TO max_guests; -ALTER TABLE rooms RENAME COLUMN IF EXISTS price_per_night TO base_rate; +ALTER TABLE rooms RENAME COLUMN capacity TO max_guests; +ALTER TABLE rooms RENAME COLUMN price_per_night TO base_rate; -- ── Guests (база гостей) ──────────────────────────────────────────────────── CREATE TABLE IF NOT EXISTS guests ( diff --git a/index.html b/index.html index cdc30b5..1074a2e 100644 --- a/index.html +++ b/index.html @@ -5,6 +5,7 @@ + HotelSync diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..18f4a15 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,5 @@ +User-agent: * +Allow: /$ +Disallow: / + +Sitemap: https://app.hotelsync.ru/sitemap.xml