- 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 <noreply@anthropic.com>
150 lines
4.0 KiB
Markdown
150 lines
4.0 KiB
Markdown
# 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 <token>`.
|
|
|
|
## 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
|
|
```
|