sendou.ink/app/features/team/queries/findByIdentifier.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

109 lines
3.0 KiB
TypeScript

import { sql } from "~/db/sql";
import type { Team, TeamMember, User } from "~/db/types";
import { removeDuplicates } from "~/utils/arrays";
import { parseDBJsonArray } from "~/utils/sql";
import type { DetailedTeam } from "../team-types";
const teamStm = sql.prepare(/*sql*/ `
select
"t"."id",
"t"."name",
"t"."twitter",
"t"."bio",
"t"."customUrl",
"t"."css",
"ia"."url" as "avatarSrc",
"ib"."url" as "bannerSrc",
json_group_array("User"."country") as "countries"
from "Team" as "t"
left join "UserSubmittedImage" as "ia" on "avatarImgId" = "ia"."id"
left join "UserSubmittedImage" as "ib" on "bannerImgId" = "ib"."id"
left join "TeamMember" on "TeamMember"."teamId" = "t"."id"
left join "User" on "User"."id" = "TeamMember"."userId"
where "t"."customUrl" = @customUrl
group by "t"."id"
`);
const membersStm = sql.prepare(/*sql*/ `
select
"User"."id",
"User"."username",
"User"."discordAvatar",
"User"."discordId",
"User"."patronTier",
"TeamMember"."role",
"TeamMember"."isOwner",
json_group_array(
json_object(
'weaponSplId', "UserWeapon"."weaponSplId",
'isFavorite', "UserWeapon"."isFavorite"
)
) as "weapons"
from "TeamMember"
join "User" on "User"."id" = "TeamMember"."userId"
left join "UserWeapon" on "UserWeapon"."userId" = "User"."id"
where "TeamMember"."teamId" = @teamId
group by "User"."id"
order by "UserWeapon"."order" asc
`);
type TeamRow =
| (Pick<Team, "id" | "name" | "twitter" | "bio" | "customUrl" | "css"> & {
avatarSrc: string;
bannerSrc: string;
countries: string;
})
| null;
type MemberRows = Array<
Pick<User, "id" | "username" | "discordAvatar" | "discordId" | "patronTier"> &
Pick<TeamMember, "role" | "isOwner"> & { weapons: string }
>;
export function findByIdentifier(
customUrl: string,
): { team: DetailedTeam; css: Record<string, string> | null } | null {
const team = teamStm.get({ customUrl: customUrl.toLowerCase() }) as TeamRow;
if (!team) return null;
const members = membersStm.all({ teamId: team.id }) as MemberRows;
return {
css: team.css ? (JSON.parse(team.css) as Record<string, string>) : null,
team: {
id: team.id,
name: team.name,
customUrl: team.customUrl,
twitter: team.twitter ?? undefined,
bio: team.bio ?? undefined,
avatarSrc: team.avatarSrc,
bannerSrc: team.bannerSrc,
countries: removeDuplicates(JSON.parse(team.countries).filter(Boolean)),
members: members.map((member) => ({
id: member.id,
discordAvatar: member.discordAvatar,
discordId: member.discordId,
username: member.username,
patronTier: member.patronTier,
role: member.role ?? undefined,
isOwner: Boolean(member.isOwner),
weapons: parseDBJsonArray(member.weapons),
})),
// results: {
// count: 23,
// placements: [
// {
// count: 10,
// placement: 1,
// },
// {
// count: 5,
// placement: 2,
// },
// ],
// },
},
};
}