Grand Hotel — архитектура и документация

Архитектура, модель данных, план имплементации и функциональные возможности системы бронирования отеля.

Grand Hotel — Карта связей

Поток данных (React Context)

                     ┌──────────────────────┐
                           Firebase        
                       Auth ──── Firestore 
                     └──┬───────┬──────┬────┘
                                     
        ┌───────────────┘             └───────────────┐
                                                     
  ┌─────────────┐     ┌──────────────┐     ┌────────────────┐
   AuthContext        DataContext        Direct reads  
                                         (Rooms,       
   user              rooms[]              Dashboard,   
   isAdmin           services[]           Admin,       
   loading           loading              SetupAdmin)  
   register()        addRoom()                         
   login()           updateRoom()       getDocs()      
   logout()          deleteRoom()       addDoc()       
  └──────┬──────┘      toggleSvc()        updateDoc()    
                     └──────┬───────┘      deleteDoc()    
                                         └───────┬────────┘
             ┌──────────────┘                     
                                                 
                                                 
  ┌─────────────────────────────────────────────────────┐
                     Components                       
    ┌──────────┐  ┌──────────┐  ┌───────────────┐    
      Navbar    RoomCard     ServiceCard       
    useAuth()   useCart()    useCart()         
    useCart()                                  
    └──────────┘  └──────────┘  └───────────────┘    
                                                       
    ┌──────────┐  ┌──────────┐  ┌───────────────┐    
      Login      Register    ProtectedRoute    
    useAuth()   useAuth()    useAuth()         
    └──────────┘  └──────────┘  └───────────────┘    
  └─────────────────────────────────────────────────────┘

  ┌──────────────┐
    CartContext │──── localStorage ('booking_cart')
    items[]     
    addToCart() 
    remove...() 
    total       
  └──────────────┘

Карта страниц и зависимостей

Страницы               Контексты          Firestore          Компоненты
─────────────────────────────────────────────────────────────────────────
Home.jsx               (нет)              (нет)             Layout
  │                                                          ├─ Navbar
  ├─ Статичные данные                                       └─ Footer
  └─ Ссылки на /rooms, /services

Rooms.jsx              useData()          bookings (read)   Layout
  │                    useState (local)   rooms (read)       └─ RoomCard × N
  ├─ Дата-пикеры                                             (available, checkIn, checkOut)
  ├─ Фильтры
  └─ Проверка доступности

RoomDetail.jsx         useData()          rooms (read)      Layout
                       useCart()                             └─ Дата-пикеры
                       useParams()

Services.jsx           useData()          services (read)   Layout
                                                             └─ ServiceCard × N

Cart.jsx               useCart()          (нет)             Layout

Payment.jsx            useCart()          bookings (write)  Layout
                       useAuth()           → addDoc

Dashboard.jsx          useAuth()          bookings (read)   Layout
                                          (query by guestId)

Login.jsx              useAuth()          auth (signIn)     Layout

Register.jsx           useAuth()          auth (createUser) Layout
                                          users (write)

Admin.jsx              useData()          rooms (CRUD)      Layout
                       useState (local)   services (update)   └─ 5 вкладок:
                                          bookings (read,      ├─ Шахматка
                                          update status)       ├─ Номера (CRUD)
                                                               ├─ Бронирования
                                                               ├─ Услуги (toggle)
                                                               └─ Настройки ( broken)

SetupAdmin.jsx         useAuth()          users/{uid}
                                          (merge role=admin)

Маршруты и защита

/                     Home              (публичный)
/rooms                Rooms             (публичный)
/rooms/:id            RoomDetail        (публичный)
/services             Services          (публичный)
/login                Login             (публичный)
/register             Register          (публичный)
/cart                 Cart              (публичный)
/payment              Payment            ProtectedRoute
/dashboard            Dashboard          ProtectedRoute
/admin                Admin              AdminRoute (требуется админ)
/setup-admin          SetupAdmin         ProtectedRoute

Граф данных (Data lineage)

Seed (DataContext)
  │
  ├──► Firestore: rooms      →  useData()  ──►  Rooms.jsx, RoomDetail.jsx, Admin.jsx
  └──► Firestore: services   →  useData()  ──►  Services.jsx, Admin.jsx

Register / SetupAdmin
  │
  └──► Firestore: users      →  AuthContext  ──►  Navbar, ProtectedRoute, AdminRoute

Payment
  │
  └──► Firestore: bookings   →  Dashboard, Admin, Rooms (проверка доступности)

Компоненты без использования

Компонент Причина
BookingForm.jsx Нигде не импортирован. Альтернатива — форма в RoomDetail.jsx
Loading.jsx Нигде не импортирован. Используются инлайн-спиннеры