Почтовый кабинет: регистрация, папки, черновики, вложения, грид, synthwave-интерфейс #7

Merged
Liosha84 merged 1 commits from feat/mail-cabinet into master 2026-11-05 16:43:55 +01:00
Owner

Задача владельца: доделать регистрацию, подогнать интерфейс под frontend/src/assets/synthwave-design-showcase.html, все таблицы на @jambotron/aria-grid, «по возможности полноценный почтовый кабинет».

Бэкенд

  • регистрация: GET /api/config (открыта ли, какие домены), после POST /api/register вход сразу (в ответе токен); служебные имена (postmaster, abuse, admin…) заняты, пароль от 8 символов
  • GET/PUT /api/me, PUT /api/me/password: имя, смена пароля по текущему, занятое место
  • папки: системные (V3: is_system) и свои — создать, переименовать, удалить (письма уходят в Корзину); счётчики считаются по письмам (раньше всегда 0); DELETE /api/folders/{id}/messages очищает Корзину и Спам
  • PATCH /api/messages/{id}: read, flagged, folderId. Перенос в Спам ставит отметку, из Спама снимает. Удаление: в Корзину, из Корзины насовсем вместе с файлами
  • черновики POST/PUT /api/drafts; POST /api/send с draftId отправляет письмо с файлами черновика, файлы переходят в копию в «Отправленных», черновик удаляется
  • несколько адресов в «Кому» и «Копия» (до 50), неверный или несуществующий адрес → 400 с причиной
  • входящие: вложения сохраняются (раньше брался только текст), заголовки To/Cc сохраняются (для «ответить всем»), письма заблокированных и не прошедших проверку отправителей кладутся в Спам, а не во Входящие

Старые ошибки, найденные по ходу:

  • загрузка файла всегда отвечала 415 (тело Mono<Flux<FilePart>>)
  • в базе не было колонки content_id → любой запрос к вложениям падал с 500
  • маршрут /compose;to=a@b.c отдавал 404 при перезагрузке страницы (точка в последнем сегменте пути)

Фронтенд (переписан: старые модели не совпадали с API)

  • оформление из шаблона: стекло, неон, солнце и сетка, четыре палитры, высокий контраст, выключатель анимации; иконки Material Icons (их же использует грид), FontAwesome убран
  • таблицы на @jambotron/aria-grid (frontend/.npmrc, пакет 0.1.0): письма, контакты, заблокированные отправители; подтверждения массовых действий и тосты в нашем стиле
  • письма: поиск, флажок, непрочитанные подсвечены, массово «прочитано / не прочитано / флажок / в папку / в Спам / удалить»; очистка Корзины и Спама
  • страница письма: HTML в iframe с sandbox без скриптов, внешние картинки только по кнопке; вложения; ответить, ответить всем, переслать, перенести, спам, заблокировать отправителя
  • написание: «Кому» и «Копия» с подсказками из контактов, черновик сам сохраняется каждые 15 с, файлы до 10 МБ
  • контакты (добавить, изменить, написать), заблокированные, настройки (имя, пароль, место, оформление); при 401 переход на вход
  • docker-compose.jambotron.yml: MAIL_REGISTRATION=true по умолчанию: тестовый стенд, письма наружу не уходят

Проверено

  • тесты: 30 (новые — разбор адресов; сборка письма с файлом и обратный разбор входящего: имя на кириллице, To/Cc)
  • живой прогон на временном Postgres, 45 проверок API: регистрация и отказы, черновик + файл → отправка → получатель видит и скачивает, чужое письмо даёт 404, папки, спам, корзина, блокировка, поиск, профиль, пароль, маршруты страниц
  • headless Chrome: регистрация, вход, письмо с копией и файлом, ответ всем, контакты, настройки, массовый выбор, ширина телефона; ошибок в консоли нет

Не сделано (в README): пересылка без вложений исходного письма, встроенные cid:-картинки показываются как вложения, нет лимита попыток входа и регистрации, TLS и IMAP — как раньше.

После мержа: загрузить свежий ZIP master и передеплоить. Миграция V3 применится сама.

— α

🤖 Generated with Claude Code

Задача владельца: доделать регистрацию, подогнать интерфейс под `frontend/src/assets/synthwave-design-showcase.html`, все таблицы на `@jambotron/aria-grid`, «по возможности полноценный почтовый кабинет». **Бэкенд** - регистрация: `GET /api/config` (открыта ли, какие домены), после `POST /api/register` вход сразу (в ответе токен); служебные имена (`postmaster`, `abuse`, `admin`…) заняты, пароль от 8 символов - `GET/PUT /api/me`, `PUT /api/me/password`: имя, смена пароля по текущему, занятое место - папки: системные (V3: `is_system`) и свои — создать, переименовать, удалить (письма уходят в Корзину); счётчики считаются по письмам (раньше всегда 0); `DELETE /api/folders/{id}/messages` очищает Корзину и Спам - `PATCH /api/messages/{id}`: `read`, `flagged`, `folderId`. Перенос в Спам ставит отметку, из Спама снимает. Удаление: в Корзину, из Корзины насовсем вместе с файлами - черновики `POST/PUT /api/drafts`; `POST /api/send` с `draftId` отправляет письмо с файлами черновика, файлы переходят в копию в «Отправленных», черновик удаляется - несколько адресов в «Кому» и «Копия» (до 50), неверный или несуществующий адрес → 400 с причиной - входящие: вложения сохраняются (раньше брался только текст), заголовки To/Cc сохраняются (для «ответить всем»), письма заблокированных и не прошедших проверку отправителей кладутся в Спам, а не во Входящие **Старые ошибки, найденные по ходу:** - загрузка файла всегда отвечала 415 (тело `Mono<Flux<FilePart>>`) - в базе не было колонки `content_id` → любой запрос к вложениям падал с 500 - маршрут `/compose;to=a@b.c` отдавал 404 при перезагрузке страницы (точка в последнем сегменте пути) **Фронтенд** (переписан: старые модели не совпадали с API) - оформление из шаблона: стекло, неон, солнце и сетка, четыре палитры, высокий контраст, выключатель анимации; иконки Material Icons (их же использует грид), FontAwesome убран - таблицы на `@jambotron/aria-grid` (`frontend/.npmrc`, пакет 0.1.0): письма, контакты, заблокированные отправители; подтверждения массовых действий и тосты в нашем стиле - письма: поиск, флажок, непрочитанные подсвечены, массово «прочитано / не прочитано / флажок / в папку / в Спам / удалить»; очистка Корзины и Спама - страница письма: HTML в `iframe` с sandbox без скриптов, внешние картинки только по кнопке; вложения; ответить, ответить всем, переслать, перенести, спам, заблокировать отправителя - написание: «Кому» и «Копия» с подсказками из контактов, черновик сам сохраняется каждые 15 с, файлы до 10 МБ - контакты (добавить, изменить, написать), заблокированные, настройки (имя, пароль, место, оформление); при `401` переход на вход - `docker-compose.jambotron.yml`: `MAIL_REGISTRATION=true` по умолчанию: тестовый стенд, письма наружу не уходят **Проверено** - тесты: 30 (новые — разбор адресов; сборка письма с файлом и обратный разбор входящего: имя на кириллице, To/Cc) - живой прогон на временном Postgres, 45 проверок API: регистрация и отказы, черновик + файл → отправка → получатель видит и скачивает, чужое письмо даёт 404, папки, спам, корзина, блокировка, поиск, профиль, пароль, маршруты страниц - headless Chrome: регистрация, вход, письмо с копией и файлом, ответ всем, контакты, настройки, массовый выбор, ширина телефона; ошибок в консоли нет **Не сделано** (в README): пересылка без вложений исходного письма, встроенные `cid:`-картинки показываются как вложения, нет лимита попыток входа и регистрации, TLS и IMAP — как раньше. После мержа: загрузить свежий ZIP `master` и передеплоить. Миграция V3 применится сама. — α 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Liosha84 added 1 commit 2026-11-05 16:41:37 +01:00
Бэкенд: регистрация со входом сразу и /api/config, профиль и смена пароля, свои папки, PATCH письма
(прочитано, флажок, перенос; Спам ставит отметку), корзина и очистка, черновики, несколько адресатов и копия,
вложения черновика уходят с письмом, вложения и заголовки To/Cc входящих сохраняются, письма заблокированных —
в Спам. Исправлено: загрузка файла (415), колонка content_id (500 на любых вложениях), SPA-маршрут с точкой.
Фронтенд переписан: все таблицы — грид, оформление — шаблон synthwave-design-showcase.html.

α
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Liosha84 merged commit db0249eb74 into master 2026-11-05 16:43:55 +01:00
Sign in to join this conversation.