Следите за соперниками: друзья и рейтинг друзей
Подписывайтесь на игроков, которых приятно обыгрывать, смотрите их в отдельной вкладке рейтинга и управляйте всеми со страницы «Друзья» с поиском по нику.

Простыми словами
В opolyx интереснее с теми, кого узнаёшь. Теперь можно подписаться на любого игрока — нажмите «Подписаться» в его профиле или найдите его по нику на новой странице «Друзья» — и он появится во вкладке рейтинга, где только вы и те, на кого вы подписаны.
Подписка односторонняя, как в большинстве соцсетей: не нужно, чтобы вас подписывали в ответ, и ничего не надо принимать. Рейтинг и так публичный, поэтому подписка ни на кого не раскрывает того, что он уже не сделал видимым.
- Подписка / отписка с любой страницы профиля одной кнопкой.
- Новая страница «Друзья» с вкладками «Подписки» и «Подписчики» и поиском по нику для поиска игроков.
- Вкладка «Друзья» в рейтинге ранжирует вас и всех, на кого вы подписаны, по XP.
- Число подписчиков и подписок теперь показывается чипами в каждом профиле.
Для тех, кому интересны детали
Миграция 0033 добавляет таблицу follows — направленное ребро (follower, followee) с защитой от дублей по первичному ключу, проверкой запрета подписки на себя и каскадным удалением. Чтения используют RLS по собственной строке (каждая сторона читает свои рёбра); записи идут через два security-definer RPC на основе auth.uid(), сделанных по образцу create_game.
-- follow_user / unfollow_user: idempotent, auth.uid()-scoped, security definer
-- 0031 grant lesson applied: default privileges grant EXECUTE to anon —
-- revoke from public, anon FIRST, then grant execute to authenticated only.Подсчёт подписчиков произвольного пользователя блокируется этим RLS по собственной строке, поэтому миграция 0034 добавляет get_follow_counts(p_user) — security-definer функцию, возвращающую подписчиков/подписки. Поскольку счётчики не чувствительны, а профили доступны для публичного чтения (профиль отображается анонимным посетителям), она выдана anon + authenticated — обратно write-RPC из 0033.
Запрос рейтинга друзей — это просто id зрителя, объединённый со всеми, на кого он подписан, отранжированными по глобальному XP. Обе миграции применены к проду через Supabase Management API и проверены (гранты: authenticated да / anon нет для записей, anon да для счётчиков) до выката веб-изменения.
