sendou.ink/app/features/tournament/queries/findTeamsByTournamentId.server.ts
Kalle ef78d3a2c2
Tournament full (#1373)
* Got something going

* Style overwrites

* width != height

* More playing with lines

* Migrations

* Start bracket initial

* Unhardcode stage generation params

* Link to match page

* Matches page initial

* Support directly adding seed to map list generator

* Add docs

* Maps in matches page

* Add invariant about tie breaker map pool

* Fix PICNIC lacking tie breaker maps

* Only link in bracket when tournament has started

* Styled tournament roster inputs

* Prefer IGN in tournament match page

* ModeProgressIndicator

* Some conditional rendering

* Match action initial + better error display

* Persist bestOf in DB

* Resolve best of ahead of time

* Move brackets-manager to core

* Score reporting works

* Clear winner on score report

* ModeProgressIndicator: highlight winners

* Fix inconsistent input

* Better text when submitting match

* mapCountPlayedInSetWithCertainty that works

* UNDO_REPORT_SCORE implemented

* Permission check when starting tournament

* Remove IGN from upsert

* View match results page

* Source in DB

* Match page waiting for teams

* Move tournament bracket to feature folder

* REOPEN_MATCH initial

* Handle proper resetting of match

* Inline bracket-manager

* Syncify

* Transactions

* Handle match is locked gracefully

* Match page auto refresh

* Fix match refresh called "globally"

* Bracket autoupdate

* Move fillWithNullTillPowerOfTwo to utils with testing

* Fix map lists not visible after tournament started

* Optimize match events

* Show UI while in progress to members

* Fix start tournament alert not being responsive

* Teams can check in

* Fix map list 400

* xxx -> TODO

* Seeds page

* Remove map icons for team page

* Don't display link to seeds after tournament has started

* Admin actions initial

* Change captain admin action

* Make all hooks ts

* Admin actions functioning

* Fix validate error not displaying in CatchBoundary

* Adjust validate args order

* Remove admin loader

* Make delete team button menancing

* Only include checked in teams to bracket

* Optimize to.id route loads

* Working show map list generator toggle

* Update full tournaments flow

* Make full tournaments work with many start times

* Handle undefined in crud

* Dynamic stage banner

* Handle default strat if map list generation fails

* Fix crash on brackets if less than 2 teams

* Add commented out test for reference

* Add TODO

* Add players from team during register

* TrustRelationship

* Prefers not to host feature

* Last before merge

* Rename some vars

* More renames
2023-05-15 22:37:43 +03:00

103 lines
2.8 KiB
TypeScript

import { sql } from "~/db/sql";
import type {
MapPoolMap,
Tournament,
TournamentTeam,
TournamentTeamCheckIn,
TournamentTeamMember,
UserWithPlusTier,
} from "~/db/types";
import { parseDBJsonArray } from "~/utils/sql";
const stm = sql.prepare(/*sql*/ `
with "TeamWithMembers" as (
select
"TournamentTeam"."id",
"TournamentTeam"."name",
"TournamentTeam"."seed",
"TournamentTeamCheckIn"."checkedInAt",
"TournamentTeam"."prefersNotToHost",
json_group_array(
json_object(
'userId',
"TournamentTeamMember"."userId",
'isOwner',
"TournamentTeamMember"."isOwner",
'discordName',
"User"."discordName",
'discordDiscriminator',
"User"."discordDiscriminator",
'discordId',
"User"."discordId",
'discordAvatar',
"User"."discordAvatar",
'inGameName',
"User"."inGameName",
'plusTier',
"PlusTier"."tier"
)
) as "members"
from
"TournamentTeam"
left join "TournamentTeamCheckIn" on "TournamentTeamCheckIn"."tournamentTeamId" = "TournamentTeam"."id"
left join "TournamentTeamMember" on "TournamentTeamMember"."tournamentTeamId" = "TournamentTeam"."id"
left join "User" on "User"."id" = "TournamentTeamMember"."userId"
left join "PlusTier" on "User"."id" = "PlusTier"."userId"
where
"TournamentTeam"."tournamentId" = @tournamentId
group by
"TournamentTeam"."id"
)
select
"TeamWithMembers".*,
json_group_array(
json_object(
'stageId',
"MapPoolMap"."stageId",
'mode',
"MapPoolMap"."mode"
)
) as "mapPool"
from
"TeamWithMembers"
left join "MapPoolMap" on "MapPoolMap"."tournamentTeamId" = "TeamWithMembers"."id"
group by
"TeamWithMembers"."id"
order by
"TeamWithMembers"."seed" asc
`);
export interface FindTeamsByTournamentIdItem {
id: TournamentTeam["id"];
name: TournamentTeam["name"];
seed: TournamentTeam["seed"];
checkedInAt: TournamentTeamCheckIn["checkedInAt"];
prefersNotToHost: TournamentTeam["prefersNotToHost"];
members: Array<
Pick<TournamentTeamMember, "userId" | "isOwner"> &
Pick<
UserWithPlusTier,
| "discordAvatar"
| "discordId"
| "discordName"
| "plusTier"
| "discordDiscriminator"
| "inGameName"
>
>;
mapPool?: Array<Pick<MapPoolMap, "mode" | "stageId">>;
}
export type FindTeamsByTournamentId = Array<FindTeamsByTournamentIdItem>;
export function findTeamsByTournamentId(tournamentId: Tournament["id"]) {
const rows = stm.all({ tournamentId });
return rows.map((row) => {
return {
...row,
members: parseDBJsonArray(row.members),
mapPool: parseDBJsonArray(row.mapPool),
};
}) as FindTeamsByTournamentId;
}