Files
scheduller-service/README.md
T
2026-08-27 12:50:22 +04:00

68 lines
4.2 KiB
Markdown

# 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 | вторник |