feat: auth/stars API, collections and publish routes, star/author migrations

This commit is contained in:
loki5512344 2026-10-04 12:47:20 +02:00
parent 43cf0e277d
commit 65820d4ef9
Signed by: boba
GPG key ID: 253067914055423B
43 changed files with 2008 additions and 408 deletions

View file

@ -7,9 +7,9 @@
В корне два пакета: `indexium-backend` (Rust/Axum) и `indexium-frontend` (SvelteKit). Нужно решить как организовать git: один репозиторий на всё или два отдельных. Backend уже имел пустой `.git` без коммитов, фронт без гита.
## Рассмотренные варианты
1. **Монорепо** — один `.git` в корне.
2. **Полирепо** — два независимых репозитория.
3. **Submodules** — корневой репо + сабмодули.
1. **Монорепо** - один `.git` в корне.
2. **Полирепо** - два независимых репозитория.
3. **Submodules** - корневой репо + сабмодули.
## Решение
Выбрать **монорепо**. Удалить `indexium-backend/.git`, инициализировать `Indexium/.git` в корне. См. `docs/git-strategy.md`.

View file

@ -4,10 +4,10 @@
Статус: Принято
## Контекст
Нужен дешёвый и устойчивый к лимитам GitHub способ индексировать моды. Хранить `.jar` у себя дорого, проксировать трафик — упрёмся в bandwidth и rate limits.
Нужен дешёвый и устойчивый к лимитам GitHub способ индексировать моды. Хранить `.jar` у себя дорого, проксировать трафик - упрёмся в bandwidth и rate limits.
## Решение
Бэкенд не хранит артефакты. GitHub Releases CDN — источник правды для файлов. Мы только:
Бэкенд не хранит артефакты. GitHub Releases CDN - источник правды для файлов. Мы только:
- принимаем webhook `release.published` (HMAC + queue + 202),
- воркер читает zip central directory через Range Request,
- парсит манифест (`fabric.mod.json` и т.д.),
@ -18,9 +18,9 @@
## Последствия
- Плюс: минимальный storage, нет egress costs, +5k–12.5k RPH через GitHub App.
- Минус: зависимость от доступности GitHub CDN (приемлемо — моды и так там).
- Минус: зависимость от доступности GitHub CDN (приемлемо - моды и так там).
- Вынесен malware-скан и SHA-256 сверка как обязательные.
## Альтернативы
- Хранить файлы у себя (S3) — отклонено: дорого, дублирование.
- Полный pull `.jar` на каждый релиз — отклонено: трафик, медленно.
- Хранить файлы у себя (S3) - отклонено: дорого, дублирование.
- Полный pull `.jar` на каждый релиз - отклонено: трафик, медленно.

View file

@ -24,10 +24,10 @@
## Альтернативы (отклонены на MVP)
- **Meilisearch** — отличный typo-tolerance, но +1 сервис, нужен отдельный деплой и синк.
- **Elasticsearch / OpenSearch** — оверхед по RAM/диску, нужен кластер даже для малого объёма.
- **SQLite FTS** — не подходит, уже Postgres как основной.
- **Meilisearch** - отличный typo-tolerance, но +1 сервис, нужен отдельный деплой и синк.
- **Elasticsearch / OpenSearch** - оверхед по RAM/диску, нужен кластер даже для малого объёма.
- **SQLite FTS** - не подходит, уже Postgres как основной.
## Ссылки
- `docs/database-schema.md` — секция 2 (триггер `mods_search_vector_update`), секция 3 (примеры FTS + fuzzy).
- `docs/architecture.md` — секция 4 (Поиск без Elasticsearch).
- `docs/database-schema.md` - секция 2 (триггер `mods_search_vector_update`), секция 3 (примеры FTS + fuzzy).
- `docs/architecture.md` - секция 4 (Поиск без Elasticsearch).

View file

@ -1,4 +1,4 @@
# ADR-004: Стратегия авторизации и профилей — GitHub-only + PAT (+ Device Flow позже)
# ADR-004: Стратегия авторизации и профилей - GitHub-only + PAT (+ Device Flow позже)
Дата: 2026-09-06
Статус: Принято (MVP) / Запроектировано (Phase 2)
@ -9,22 +9,22 @@
## Решение
**MVP:**
- Вход только GitHub OAuth (`read:user`, `user:email`), JWT httpOnly cookie, без паролей. Читатели — anonymous.
- Вход только GitHub OAuth (`read:user`, `user:email`), JWT httpOnly cookie, без паролей. Читатели - anonymous.
- PAT с `SHA256` хранением и скоупами `read:mods|write:mods|webhooks:manage` для CI/лаунчеров.
- `verified` бейдж если репо публичное + лицензия + GitHub App установлен.
- Sponsors (GitHub/Patreon/Ko-fi) + star/follow (in-app) + SVG badges (`/v1/badges/:slug/downloads.svg`).
**Phase 2 (спроектировано, не кодим сейчас):**
- Device Code Flow (RFC 8628) — Indexium как OAuth2 Provider для лаунчеров (`/oauth/device/code` → `/activate`).
- Device Code Flow (RFC 8628) - Indexium как OAuth2 Provider для лаунчеров (`/oauth/device/code` → `/activate`).
- Discord linked_account + бот роли `Verified Modder`.
- Collections/Modlists с экспортом Prism/packwiz, Activity Feed, аналитика по версиям/лоадерам, PGP проверка.
**Backlog:** краш-логи, лидерборды, Profile README.
## Альтернативы
- Google/email логин — отклонён для MVP (публикация всё равно требует GitHub, лишняя сложность).
- Сразу Device Flow — отклонён ( +2 недели, PAT покрывает 80% кейсов).
- Discord как логин — отклонён (только linked).
- Google/email логин - отклонён для MVP (публикация всё равно требует GitHub, лишняя сложность).
- Сразу Device Flow - отклонён ( +2 недели, PAT покрывает 80% кейсов).
- Discord как логин - отклонён (только linked).
## Последствия
- Плюс: минимум GDPR, нет паролей, доказуемое владение репо, CLI готов через PAT.

View file

@ -4,7 +4,7 @@
Статус: Принято (дизайн) / К реализации в Phase 3
## Контекст
Скачивания накручиваются CI, нужна честная метрика популярности — активные установки в рантайме. bStats де-факто стандарт для Minecraft модов: lightweight SDK → POST gzip JSON → агрегация. Пользователь предложил полный дизайн с `server_uuid`, daily_salt, `mod_telemetry_pings` + `mod_daily_stats`, opt-out и сортировкой `active_servers`.
Скачивания накручиваются CI, нужна честная метрика популярности - активные установки в рантайме. bStats де-факто стандарт для Minecraft модов: lightweight SDK → POST gzip JSON → агрегация. Пользователь предложил полный дизайн с `server_uuid`, daily_salt, `mod_telemetry_pings` + `mod_daily_stats`, opt-out и сортировкой `active_servers`.
## Решение
- **SDK:** MIT Java/Kotlin модуль `dev.indexium:analytics` ~15KB, `IndexiumMetrics(slug)` + `SimplePie`, уважает `-Dindexium.analytics.disable=true` и `config/indexium.json`.
@ -14,14 +14,14 @@
- **Приватность:** не храним IP, daily_salt ротация (не трекать сквозь дни), `custom_charts` ≤5 ключей, opt-out на клиенте.
## Альтернативы
- Сторонний bStats.org — отклонён (внешняя зависимость, нет контроля, нет breakdown по нашим лоадерам).
- ClickHouse сразу — отклонён (оверхед для MVP, Postgres хватает).
- Хранить сырые пинги навсегда — отклонён (раздувание, достаточно daily агрегата).
- Сторонний bStats.org - отклонён (внешняя зависимость, нет контроля, нет breakdown по нашим лоадерам).
- ClickHouse сразу - отклонён (оверхед для MVP, Postgres хватает).
- Хранить сырые пинги навсегда - отклонён (раздувание, достаточно daily агрегата).
## Последствия
- Плюс: честная сортировка `active_servers`, графики для авторов, бейджи, без сторонних сервисов.
- Минус: +2 таблицы, крон-агрегация, SDK нужно публиковать в Maven Central.
- План: сначала Axum handler + агрегация, потом SDK (или наоборот — можно параллельно).
- План: сначала Axum handler + агрегация, потом SDK (или наоборот - можно параллельно).
## Ссылки
- `docs/analytics.md`