Рейтинг: партии без соперников не считаются, понятная причина недоступной партии
В профиле Ivan висели две «партии» с одним участником, которые не открывались. Dev-удаление аккаунта (dev_admin) вычёркивает игрока из партий, не трогая сами партии, и 17.06 в dev-БД так опустели партии 2, 3, 6 и 7. Они засчитывались оставшемуся в число игр с ΔR 0.0, показывались в истории и списке группы, а бэкфилл 0014 проставил им last_standing. Партия меньше чем с двумя участниками больше не считается игрой: её нет в рейтинге и счётчиках (load_history), в истории игрока и в списке партий группы; админка её по-прежнему видит. Бэкфилл last_standing в 0014 теперь требует хотя бы двух участников (на уже мигрированных БД такие партии и так скрыты). «Партия не найдена» при переходе из чужого профиля в партию группы, где зритель не состоит, — это 403; страница партии теперь так и пишет. Тест: партия, опустевшая после dev-удаления, не попадает в историю, список и счётчик группы, рейтинг считается только по настоящей партии. #80 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LqSoRj99iwVEH5U5fnZgsd
This commit is contained in:
@@ -57,7 +57,7 @@ export function MatchDetailPage() {
|
||||
// Number("abc") — NaN, а не null: без проверки запрос уходил бы на /api/matches/NaN.
|
||||
const parsed = matchId ? Number(matchId) : NaN;
|
||||
const id = Number.isInteger(parsed) ? parsed : null;
|
||||
const { data: match, isLoading, refetch } = useMatch(id);
|
||||
const { data: match, isLoading, error: loadError, refetch } = useMatch(id);
|
||||
const { data: me } = useMe();
|
||||
const { data: groupFactions } = useGroupFactions(match?.group_id ?? null);
|
||||
const finish = useFinishMatch();
|
||||
@@ -132,7 +132,19 @@ export function MatchDetailPage() {
|
||||
}, [incoming, participants, match?.status, me?.id]);
|
||||
|
||||
if (isLoading) return <Spinner />;
|
||||
if (!match) return <div className="muted">Партия не найдена.</div>;
|
||||
if (!match) {
|
||||
// Из истории чужого профиля можно попасть в партию группы, где зритель не состоит:
|
||||
// сервер отдаёт 403, и «не найдена» здесь вводила бы в заблуждение.
|
||||
if (loadError instanceof ApiError && loadError.code === "NOT_GROUP_MEMBER") {
|
||||
return (
|
||||
<div className="muted">
|
||||
Партия сыграна в группе, в которой вы не состоите, — открыть её могут только
|
||||
участники группы.
|
||||
</div>
|
||||
);
|
||||
}
|
||||
return <div className="muted">Партия не найдена.</div>;
|
||||
}
|
||||
|
||||
const canModify = !!match.can_modify; // авторитетный флаг с бэкенда (любой участник группы или админ)
|
||||
const inProgress = match.status === "in_progress";
|
||||
|
||||
Reference in New Issue
Block a user