docs(spec): document avatar/cover upload API (Back#71).

Refs EventHub/EventHubBack#71
Refs EventHub/EventHubSpec#8
This commit is contained in:
2026-08-14 21:27:41 +03:00
parent 02e49a40f5
commit 07e89052fe
2 changed files with 12 additions and 5 deletions
+8 -2
View File
@@ -229,7 +229,8 @@ Legacy: прямой `POST /v1/calendars/:id/specialists` **не использ
позиция и боевой эквайринг **подписки владельца** (не оплата услуги клиентом); DNS/SPF
без покупки домена без явного ок.
- Waitlist на событие (после уведомлений).
- Серверный logout / revoke session; загрузка файлов (avatar/cover).
- Серверный logout / revoke session; загрузка файлов avatar/cover
**сделано** (Back#71); вложения к событию — позже.
- Email-reminder booking — **сделано** (Back#70, §2.6); Web Push / prefs — позже.
- `calendar_share` (`read` | `write` | `admin`): низкий приоритет; не путать с follow,
specialist_invite и платной subscription. User HTTP API и UI — до отдельной задачи
@@ -724,7 +725,12 @@ src/
- Система не поддерживает транзакционную целостность между несколькими таблицами на уровне
приложения (полагаемся на Mnesia).
- В текущей версии отсутствует полноценная система уведомлений (только таблица).
- Загрузка файлов (вложения) пока не реализована.
- Загрузка файлов: **avatar/cover**`POST /v1/user/me/avatar`,
`POST /v1/calendars/:id/cover` (multipart field `file`); MIME jpeg/png/webp
(magic bytes), лимит `UPLOAD_MAX_BYTES` (default 2MiB) → 413/415;
хранение local disk `UPLOAD_DIR` (default `/app/data/uploads` на volume
`eventhub-data`); отдача `GET /v1/media/:kind/:owner/:file` (public).
Вложения к событию — пока не реализованы.
- Серверный рендеринг календаря работает только для владельца календаря.
- Автоматическое архивирование через `archive_controller` в локальном режиме использует
`slave:start`, который устарел; в production планируется `peer`.
+4 -3
View File
@@ -202,13 +202,13 @@ Redirects: `/discover` → `/search`; `/calendars/:id` → `/c/:id`; `/calendars
Регистрация, верификация, вход, восстановление сессии.
### 5.2. Профиль
`GET /v1/user/me` + форма на `/profile`. Редактируемые через `PATCH /v1/user/me`: `nickname`, `phone`, `timezone`, `avatar_url`, `language`; смена пароля — `current_password` + `password`. Read-only в UI: `id`, `email`, `role`, `status`. Mood — chip в AppShell рядом с BrandWordmark (+ compact на auth); persist `preferences.mood` через `PATCH /v1/user/me` (**не** в `/more`, **не** в calendar toolbar). Язык при первом визите — из браузера; при первом логине без `language` — пишется в профиль. Mood по умолчанию `calm`, при логине не сидится. Lens — только localStorage (не профиль).
`GET /v1/user/me` + форма на `/profile`. Редактируемые через `PATCH /v1/user/me`: `nickname`, `phone`, `timezone`, `avatar_url`, `language`; смена пароля — `current_password` + `password`. Upload аватара: `POST /v1/user/me/avatar` (multipart `file`) → обновляет `avatar_url` (Front#69). Read-only в UI: `id`, `email`, `role`, `status`. Mood — chip в AppShell рядом с BrandWordmark (+ compact на auth); persist `preferences.mood` через `PATCH /v1/user/me` (**не** в `/more`, **не** в calendar toolbar). Язык при первом визите — из браузера; при первом логине без `language` — пишется в профиль. Mood по умолчанию `calm`, при логине не сидится. Lens — только localStorage (не профиль).
### 5.3. Поиск (участник)
`GET /v1/search` — фильтры (`type`, `q`, `tags`, даты, `lat`/`lon`/`radius`, sort, order, пагинация). Без `q`/дат/tags/geo/sort — топы календарей и событий; иначе — поиск. В списке бейдж типа — `calendar`|`event` (не `personal`/`commercial`). Даты, теги, geo и сортировка свёрнуты по умолчанию. Переход к `/c/:id` или `/c/:id/e/:eventId`.
В результатах calendar (и event, если Back отдаёт) может быть `image_url` — Discover показывает
cover (`.eh-discover-media--photo`); иначе mood wash + initials (`.eh-discover-media--fallback`,
не fake photo-hero). Битый `image_url` → fallback. **Upload API нет** — поле URL (seed / ручная установка).
не fake photo-hero). Битый `image_url` → fallback. Cover upload владельца: `POST /v1/calendars/:id/cover` (Front#69); URL также можно задать через `PUT` `image_url`.
### 5.4. Календари
- Список своих: `GET /v1/calendars`
@@ -372,7 +372,8 @@ legal stubs; позиция по подписке **владельца**; DNS/SP
**Продукт (фаза 2):**
- серверный logout / revoke session (`POST /v1/logout` + `{ refresh_token }`; клиент зовёт до clear storage)
- загрузка файлов (avatar / cover / вложения)
- загрузка файлов: avatar `POST /v1/user/me/avatar`, cover
`POST /v1/calendars/:id/cover` (Back#71); UI — Front#69; вложения — позже
- полноценный push / reminders (email-reminder booking: Back#70 /
`process_reminders`; Web Push / prefs — позже)
- waitlist на событие