feat(admin): transfer user accounts and show local cover coverage
ci / contract / contract (сгенерированный код совпадает с openapi.yaml) (push) Successful in 1m17s
ci / ts / ts (packages + web) (push) Successful in 3m13s
ci / api / api (push) Successful in 59s
ci / mobile / mobile (Metro-бандл Android) (push) Successful in 1m31s
ci / db / db (push) Successful in 2m50s

This commit is contained in:
mrleo1nid committed 2026-10-23 02:17:06 +03:00
1 parent 0a4cd4bff1
commit f1528de948
22 files changed
+1661 -313

No files matched your search

+16
View File
@@ -56,6 +56,22 @@
Аналогично для `must_change_password` (после сброса пароля админом / модератором): разрешён только
`POST /me/password` (без `current_password`, если вход был по временному паролю).
## Перенос пользователей через файл
Администратору на странице «Пользователи» доступны «Экспорт пользователей» и «Импорт пользователей».
JSON-файл версии 1 содержит логины, отображаемые имена, роли, дополнительные права аудита загрузок
и управления обновлениями, флаги блокировки и обязательной смены пароля, а также хэши Argon2id.
Действующие пароли сохраняются; открытые пароли в файле отсутствуют. Файл содержит секретные данные
и должен храниться в защищённом месте. Экспорт охватывает всех пользователей независимо от фильтров страницы.
Импорт добавляет отсутствующие логины с новыми ID. Существующие логины пропускаются без изменений
пароля, роли и данных пользователя; список пропущенных логинов показывается в результате.
Весь файл проверяется до записи, добавление выполняется атомарно. Ограничения: 10000 пользователей,
16 MiB; параметры импортированных хэшей ограничены для безопасной проверки пароля при следующем входе.
Рекомендации, история, лайки, плейлисты, сессии и настройки интерфейса не экспортируются и не импортируются.
Язык новых записей берётся из настроек сервера. Импорт и экспорт пишутся в журнал без хэшей паролей.
API: `GET /admin/users/export`, `POST /admin/users/import` (оба только для admin).
## Пароли
- argon2id: `m=64 MiB, t=3, p=2`, соль 16 байт; параметры в хэше (PHC), при изменении — rehash при входе.
+7
View File
@@ -182,6 +182,13 @@ lower-case, `ё → е`, удаление пунктуации, схлопыва
общие файлы кэша; ошибки чтения и конвертации остаются для повтора при следующем запуске обработчика.
Клиент получает ссылку на готовый WebP через API каталога; nginx раздаёт файл из кэша.
В карточке источника показано «Локальные обложки: X из Y файлов» и число альбомов, ожидающих обработки.
Статистика обновляется каждые 10 секунд через `GET /admin/sources/{id}/cover-stats`.
Считаются аудиофайлы каталога без ошибок чтения, пропавших файлов и исключённых папок, включая
альтернативные форматы одного трека. Числитель — файлы, у альбома которых есть готовая обложка
из тегов или папки; внешние URL Genius не учитываются. Это покрытие файлов обложками альбомов,
а не количество отдельных `cover.jpg` на диске.
## Поиск
Meilisearch, индексы: