# Presaver

Сервис обмена пресейвами для музыкантов. Пользователь делает пресейвы чужих треков (band.link),
грузит скриншоты-пруфы, получает по 1 баллу за каждую подтверждённую чужую ссылку и тратит баллы
на публикацию своей ссылки, выбирая, сколько пресейвов заказать. Сервис честно распределяет
кампании между всеми.

> **Ограничение по дизайну:** клики на *чужой* странице band.link отследить нельзя (same-origin,
> нет API band.link). Поэтому проверка — по доказательствам: скриншот → vision-распознавание
> (название трека + факт нажатия пресейва) → фаззи-матч к заданию → дедуп по pHash и правилу
> «1 балл на ссылку» → рейтинг доверия/модерация. Это снижает выгоду накрутки, но не гарантирует 100%.

## Стек
- Laravel 12, PHP 8.3, MySQL
- Socialite + VK ID / Яндекс OAuth (только вход)
- Anthropic vision для распознавания скринов (фолбэк-заглушка без ключа)
- jenssegers/imagehash (pHash) — дедуп скриншотов
- Blade + Tailwind (Play CDN), mobile-first

## Запуск (Laragon)
```
composer install
cp .env.example .env   # затем заполнить (см. ниже)
php artisan key:generate
php artisan migrate
php artisan storage:link
php artisan db:seed --class=DemoSeeder   # демо-кампании (опционально)
php artisan serve
```

### .env — ключевые переменные
```
DB_DATABASE=presaver
VK_CLIENT_ID=... / VK_CLIENT_SECRET=...          # VK ID OAuth-приложение
YANDEX_CLIENT_ID=... / YANDEX_CLIENT_SECRET=...  # oauth.yandex.ru
ANTHROPIC_API_KEY=...                             # без него распознавание = заглушка (всё отклоняется)
PROOF_MATCH_THRESHOLD=70                          # порог совпадения названия трека
PRESAVER_TRUST_THRESHOLD=40                       # ниже — пруфы уходят на модерацию
```

### Локальный вход без OAuth
В `local`-окружении: `GET /dev/login` — вход как dev-админ (для проверки кабинета и модерации).

## Архитектура
- `app/Services/CreditService.php` — атомарный реестр баллов (`credit_ledger` — источник правды).
- `app/Services/QueueService.php` — честная выдача заданий (weighted-fair: голодные и старые — первыми).
- `app/Services/VerificationService.php` — оркестрация проверки пруфа.
- `app/Services/Vision/*` — распознавание скринов (Anthropic / фейк).
- `app/Services/BandLinkParser.php` — OG-метаданные band.link (title/artist для матчинга).
- `app/Services/ImageHasher.php`, `TitleMatcher.php` — pHash-дедуп и фаззи-матч.

## Тесты
```
php artisan test
```
Покрыто: реестр баллов (не уходит в минус, атомарность), честная очередь, верификация
(матч / нет пресейва / нет матча / дубликат по треку и по pHash / модерация) и HTTP-поток
(заработал балл → опубликовал кампанию, лимит по балансу, редирект-лог).
