68 lines
4.2 KiB
Markdown
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 | вторник |
|