sendou.ink/app/features/badges/queries/syncXPBadges.server.ts
Kalle fd48bced91
Migrate Prettier/Eslint/Stylelint setup to Biome (#1772)
* Initial

* CSS lint

* Test CI

* Add 1v1, 2v2, and 3v3 Tags (#1771)

* Initial

* CSS lint

* Test CI

* Rename step

---------

Co-authored-by: xi <104683822+ximk@users.noreply.github.com>
2024-06-24 13:07:17 +03:00

61 lines
1.5 KiB
TypeScript

import {
SPLATOON_3_XP_BADGE_VALUES,
findSplatoon3XpBadgeValue,
} from "~/constants";
import { sql } from "~/db/sql";
import invariant from "~/utils/invariant";
const badgeCodeToIdStm = sql.prepare(/* sql */ `
select "id"
from "Badge"
where "code" = @code
`);
const deleteBadgeOwnerStm = sql.prepare(/* sql */ `
delete from "TournamentBadgeOwner"
where "badgeId" = @badgeId
`);
const userTopXPowersStm = sql.prepare(/* sql */ `
select
"SplatoonPlayer"."userId",
max("XRankPlacement"."power") as "xPower"
from
"SplatoonPlayer"
left join "XRankPlacement" on "XRankPlacement"."playerId" = "SplatoonPlayer"."id"
where "SplatoonPlayer"."userId" is not null
group by "SplatoonPlayer"."userId"
`);
const addXPBadgeStm = sql.prepare(/* sql */ `
insert into "TournamentBadgeOwner" ("badgeId", "userId")
values (
(select "id" from "Badge" where "code" = @code),
@userId
)
`);
export const syncXPBadges = sql.transaction(() => {
for (const value of SPLATOON_3_XP_BADGE_VALUES) {
const badgeId = badgeCodeToIdStm
.pluck()
.get({ code: String(value) }) as number;
invariant(badgeId, `Badge ${value} not found`);
deleteBadgeOwnerStm.run({ badgeId });
}
const userTopXPowers = userTopXPowersStm.all() as Array<{
userId: number;
xPower: number;
}>;
for (const { userId, xPower } of userTopXPowers) {
const badgeValue = findSplatoon3XpBadgeValue(xPower);
if (!badgeValue) continue;
addXPBadgeStm.run({ code: String(badgeValue), userId });
}
});