diff --git a/EventHubBackSpec.md b/EventHubBackSpec.md index 1633bf6..58a73bf 100644 --- a/EventHubBackSpec.md +++ b/EventHubBackSpec.md @@ -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 2 MiB) → 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`. diff --git a/EventHubFrontSpec.md b/EventHubFrontSpec.md index 0ad13ad..36a4113 100644 --- a/EventHubFrontSpec.md +++ b/EventHubFrontSpec.md @@ -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 на событие