# schedule-service Self-hosted сервис адаптивного расписания дня, синхронизируемого с CalDAV-календарём (Baikal → нативная синхронизация с Календарём iPhone). ## Идея - Шаблон дня хранится в Postgres как набор блоков двух типов: - **RELATIVE** — смещение от времени пробуждения (например, "завтрак: wake+105 мин") - **FIXED** — жёсткая привязка к часу и дню недели (например, дейли в 10:15 по будням) - По триггеру "проснулся" (через iOS Shortcuts → `POST /api/wake`) сервис вычисляет реальные времена на сегодня и создаёт/обновляет события в Baikal через CalDAV. - `POST /api/shift` пересчитывает и сдвигает ещё не начавшиеся сегодняшние события. - Список покупок (`shopping_item`) пополняется голосом через кастомный навык Алисы (вебхук `/api/alice/webhook`), читается бэкендом при наступлении блока категории `SHOPPING_TRIP`. - Фронт на React для ручного администрирования шаблона — собирается в один jar вместе с бэкендом. ## Стек - Spring Boot 3.3, Java 17 - Spring Data JPA + PostgreSQL (`ddl-auto: update`, без Flyway — осознанное упрощение для домашнего проекта) - RestTemplate + ical4j для CalDAV-синхронизации с Baikal - React (сборка встраивается в `classpath:/static`) ## Текущий статус Готово: - [x] Entities: `ScheduleBlock`, `ShoppingItem` - [x] Repositories - [x] `CaldavProperties` / `RestTemplateConfig` - [x] Базовый `application.yml` В работе / следующие шаги: - [ ] `ScheduleCalculationService` — расчёт конкретных времён на день из шаблона - [ ] `CaldavSyncService` — построение VEVENT (ical4j) и PUT в Baikal, детерминированный UID (например `sha256(date + title)`) для идемпотентного обновления - [ ] `WakeController` — `POST /api/wake`, `POST /api/shift` - [ ] `ScheduleBlockController`, `ShoppingController` — CRUD для фронта - [ ] `AliceWebhookController` — приём команд от навыка Алисы - [ ] React-фронт для администрирования - [ ] Dockerfile + манифесты Deployment/Service для k3s (namespace `media`) ## Локальный запуск ```bash # 1. Прокинуть Postgres из кластера kubectl port-forward -n media svc/postgres-postgresql 5432:5432 # 2. Создать БД и пользователя (один раз) psql -h localhost -U postgres -c "CREATE DATABASE schedule;" psql -h localhost -U postgres -c "CREATE USER schedule_user WITH PASSWORD 'changeme';" psql -h localhost -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE schedule TO schedule_user;" # 3. Поправить src/main/resources/application.yml (пароли caldav/db) # 4. Запуск mvn spring-boot:run ``` Baikal доступен напрямую по NodePort (`192.168.1.100:30019`), отдельный port-forward не нужен. ## Референсные данные шаблона (обсуждены, вводятся вручную через фронт/API после его готовности) Пробуждение ~9:00, отбой ~23:30. Полный список блоков и офсетов — см. историю разработки проекта, часть значений помечена как оценочная и подлежит уточнению по факту использования. Статические события: | Событие | Время | Дни | |---|---|---| | Дейли НСИ | 10:15 | будни | | Дейли Mesh | 12:30 | будни | | Созвон НСИ→ПГ | 15:00 | вторник |