Запись к мастерам
Назначение
Сервис онлайн-записи: мастера (исполнители) ведут профили и услуги с длительностью, клиенты выбирают мастера, услугу и свободный слот в календаре. Есть роли (клиент / мастер / администратор) и JWT-аутентификация.
Сущности
- Профиль мастера — описание мастера, привязка к пользователю.
- Услуга — название, длительность в минутах, цена, принадлежит конкретному мастеру.
- Расписание — по дням недели: интервалы рабочего времени (
MasterSchedule). - Запись (appointment) — выбранный мастер, услуга, клиент, начало и конец, статус (например
confirmed,pending).
Потоки работы
- Регистрация и вход — пользователь получает JWT и дальше передаёт его в заголовке
Authorization. - Просмотр мастеров и услуг — публичные или защищённые эндпоинты в зависимости от сценария.
- Свободные слоты — для выбранного мастера, услуги и дня API возвращает список допустимых времени начала: строятся из расписания мастера с шагом (например 30 минут), с учётом длительности услуги и исключения пересечений с уже существующими записями.
- Бронирование — клиент отправляет
master_id,service_id,start_at; сервер проверяет, что слот свободен, и создаёт запись; при конфликте возвращается ошибка (например409сslot_taken). - Список своих записей — эндпоинт для просмотра записей текущего пользователя.
Telegram
В этом демо нет Telegram-бота: клиенты и мастера работают через браузер. Поле telegram_id у пользователя в модели зарезервировано на будущее, BOT_TOKEN не используется.
Инфраструктура
- PostgreSQL (отдельный контейнер
masters-db, томmasters_pg). - API FastAPI на порту 8100 снаружи (внутри контейнера 8000).
- Веб-интерфейс Vite/React на порту 5174 снаружи (внутри 5173).
Демо-данные при старте
Если в БД ещё нет ни одного MasterProfile, при запуске API выполняется однократный seed: три мастера (стилист, барбер, ногтевой сервис) с услугами и расписанием, тестовый клиент и администратор. Логины см. в masters-booking/README.md.
Переменные
DATABASE_URL,SECRET_KEYдля JWT (в корневом.env—MASTERS_PG_PASSWORD,MASTERS_SECRET_KEY,MASTERS_PUBLIC_API_URLдля сборки фронта).