Задача владельца: доделать регистрацию, подогнать интерфейс под 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 применится сама.
Задача владельца: доделать регистрацию, подогнать интерфейс под `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)
Бэкенд: регистрация со входом сразу и /api/config, профиль и смена пароля, свои папки, PATCH письма
(прочитано, флажок, перенос; Спам ставит отметку), корзина и очистка, черновики, несколько адресатов и копия,
вложения черновика уходят с письмом, вложения и заголовки To/Cc входящих сохраняются, письма заблокированных —
в Спам. Исправлено: загрузка файла (415), колонка content_id (500 на любых вложениях), SPA-маршрут с точкой.
Фронтенд переписан: все таблицы — грид, оформление — шаблон synthwave-design-showcase.html.
α
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Задача владельца: доделать регистрацию, подогнать интерфейс под
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: имя, смена пароля по текущему, занятое местоis_system) и свои — создать, переименовать, удалить (письма уходят в Корзину); счётчики считаются по письмам (раньше всегда 0);DELETE /api/folders/{id}/messagesочищает Корзину и СпамPATCH /api/messages/{id}:read,flagged,folderId. Перенос в Спам ставит отметку, из Спама снимает. Удаление: в Корзину, из Корзины насовсем вместе с файламиPOST/PUT /api/drafts;POST /api/sendсdraftIdотправляет письмо с файлами черновика, файлы переходят в копию в «Отправленных», черновик удаляетсяСтарые ошибки, найденные по ходу:
Mono<Flux<FilePart>>)content_id→ любой запрос к вложениям падал с 500/compose;to=a@b.cотдавал 404 при перезагрузке страницы (точка в последнем сегменте пути)Фронтенд (переписан: старые модели не совпадали с API)
@jambotron/aria-grid(frontend/.npmrc, пакет 0.1.0): письма, контакты, заблокированные отправители; подтверждения массовых действий и тосты в нашем стилеiframeс sandbox без скриптов, внешние картинки только по кнопке; вложения; ответить, ответить всем, переслать, перенести, спам, заблокировать отправителя401переход на входdocker-compose.jambotron.yml:MAIL_REGISTRATION=trueпо умолчанию: тестовый стенд, письма наружу не уходятПроверено
Не сделано (в README): пересылка без вложений исходного письма, встроенные
cid:-картинки показываются как вложения, нет лимита попыток входа и регистрации, TLS и IMAP — как раньше.После мержа: загрузить свежий ZIP
masterи передеплоить. Миграция V3 применится сама.— α
🤖 Generated with Claude Code