Fix admin-badges: handle non-positive userId, truncate badge code to 32 chars, only revalidate on grant
CI / check (push) Failing after 23s
CI / tests-unit (push) Skipped
CI / tests-integration (push) Skipped
CI / tests-ui (push) Skipped
CI / preflight (push) Skipped
CI / deploy (push) Skipped
Gitea Actions Runner Test / test-job (push) Successful in 3s
Gitea Runner Clean Test / test-job (push) Successful in 2s

This commit is contained in:
openhands committed 2026-10-11 20:04:06 +02:00
1 parent f14a0e5fe7
commit b13c9f47be
1 file changed
+12 -5
+12 -5
View File
@@ -31,14 +31,17 @@ export async function giveBadge(formData: FormData): Promise<void> {
}
// Process each user/code combination
let granted = false;
for (const userId of userIds) {
for (const code of codes) {
const cid = String(Number(code) || code);
if (!(Number(userId) > 0) || code.length === 0) continue;
// Truncate badge code to 32 characters.
const truncatedCode = code.slice(0, 32);
// Fire the emulator command so the badge appears live for online users.
try {
await rcon.giveBadge(Number(userId), cid);
await rcon.giveBadge(Number(userId), truncatedCode);
} catch {
// ignore rcon errors per pair
}
@@ -53,7 +56,7 @@ export async function giveBadge(formData: FormData): Promise<void> {
.where(
and(
eq(UsersBadges.userId, Number(userId)),
eq(UsersBadges.badgeCode, code),
eq(UsersBadges.badgeCode, truncatedCode),
),
)
.limit(1);
@@ -65,13 +68,17 @@ export async function giveBadge(formData: FormData): Promise<void> {
const slotId = (agg?.maxSlot ?? 0) + 1;
await db
.insert(UsersBadges)
.values({ userId: Number(userId), slotId, badgeCode: code });
.values({ userId: Number(userId), slotId, badgeCode: truncatedCode });
}
} catch {
// Best-effort: the RCON grant already succeeded for online users.
}
}
granted = true;
}
}
if (granted) {
revalidatePath("/admin/badges");
}
}