Files
hotelsync/backend
HotelSync a29f58282f feat: chat — edit/delete messages + emoji reactions
- Migration 074: edited_at, deleted_at columns + chat_reactions table
- Backend: PATCH edit (own only), DELETE soft-delete (own/admin), POST toggle reaction
  fetchMessage helper returns full message with aggregated reactions in one query
- API types: ChatReaction interface, editedAt/deletedAt/reactions in ChatMessage
- ChatWidget: hover toolbar (😊 react · ✏️ edit · 🗑️ delete), inline edit with
  save/cancel (Enter/Esc), reaction emoji picker (8 emojis), reaction pills below
  messages (click to toggle), '· изм.' label on edited messages, soft-deleted
  messages show 'Сообщение удалено' placeholder

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14 12:31:17 +03:00
..

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

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

docker build -t hotelsync-api .
docker run -p 3000:3000 --env-file .env hotelsync-api