diff --git a/README.md b/README.md index 0565d04..a532d44 100644 --- a/README.md +++ b/README.md @@ -143,7 +143,7 @@
-POST /api/teams (Liste aller Teams) +GET /api/team (Liste aller Teams) ##### Request Body @@ -165,8 +165,24 @@ "name": string, // Teamfarbe in HEX "color": string, - // UUIDs aller Teammitglieder - "users": (string | null)[] + // UTC timestamp wann das Team zuletzt gejoined ist + "lastJoined": number | null, + // Gewichtung aller Strikes + "strikeWeight": number, + // Spieler 1 des Teams + "memberOne": { + // UUID des Spielers + "uuid": string, + // Ob der Spieler Tot ist + "dead": boolean + } | null, + // Spieler 2 des Teams + "memberTwo": { + // UUID des Spielers + "uuid": string, + // Ob der Spieler Tot ist + "dead": boolean + } | null } ``` diff --git a/src/db/database.ts b/src/db/database.ts index 3bbb96f..aa4814c 100644 --- a/src/db/database.ts +++ b/src/db/database.ts @@ -26,7 +26,9 @@ import { type GetTeamByUserUuidReq, getTeamByUserUuid, type EditTeamReq, - editTeam + editTeam, + type GetTeamsFullReq, + getTeamsFull } from './schema/team'; import { addTeamDraft, @@ -176,6 +178,7 @@ export class Database { editTeam = (values: EditTeamReq) => editTeam(this.db, values); deleteTeam = (values: DeleteTeamReq) => deleteTeam(this.db, values); getTeams = (values: GetTeamsReq) => getTeams(this.db, values); + getTeamsFull = (values: GetTeamsFullReq) => getTeamsFull(this.db, values); getTeamById = (values: GetTeamByIdReq) => getTeamById(this.db, values); getTeamByName = (values: GetTeamByNameReq) => getTeamByName(this.db, values); getTeamByUserUuid = (values: GetTeamByUserUuidReq) => getTeamByUserUuid(this.db, values); diff --git a/src/db/schema/team.ts b/src/db/schema/team.ts index d03a3d7..29cae91 100644 --- a/src/db/schema/team.ts +++ b/src/db/schema/team.ts @@ -1,9 +1,14 @@ -import { char, int, mysqlTable, timestamp, varchar } from 'drizzle-orm/mysql-core'; +import { alias, char, int, mysqlTable, timestamp, varchar } from 'drizzle-orm/mysql-core'; import type { MySql2Database } from 'drizzle-orm/mysql2'; -import { aliasedTable, and, asc, desc, eq, like } from 'drizzle-orm'; +import { aliasedTable, and, asc, desc, eq, like, sql } from 'drizzle-orm'; import { teamMember } from './teamMember.ts'; import { user } from './user.ts'; import { teamDraft } from './teamDraft.ts'; +import { death } from '@db/schema/death.ts'; +import { report } from '@db/schema/report.ts'; +import { reportStatus } from '@db/schema/reportStatus.ts'; +import { strikeReason } from '@db/schema/strikeReason.ts'; +import { strike } from '@db/schema/strike.ts'; type Database = MySql2Database<{ team: typeof team }>; @@ -31,6 +36,8 @@ export type GetTeamsReq = { limit?: number; }; +export type GetTeamsFullReq = {}; + export type GetTeamByIdReq = { id: number; }; @@ -127,6 +134,45 @@ export async function getTeams(db: Database, values: GetTeamsReq) { .limit(values?.limit ?? 100); } +export async function getTeamsFull(db: Database, _values: GetTeamsFullReq) { + const memberOneTeamMember = alias(teamMember, 'member_one_team_member'); + const memberTwoTeamMember = alias(teamMember, 'member_two_team_member'); + const memberOneUser = alias(user, 'member_one_user'); + const memberTwoUser = alias(user, 'member_two_user'); + const memberOneDeath = alias(death, 'member_one_death'); + const memberTwoDeath = alias(death, 'member_two_death'); + + const strikeWeightSubquery = db + .select({ + teamId: team.id, + strikeWeight: sql`cast(sum(${strikeReason.weight}) as int)`.as('strikeWeight') + }) + .from(strike) + .innerJoin(strikeReason, eq(strike.strikeReasonId, strikeReason.id)) + .innerJoin(reportStatus, eq(strike.id, reportStatus.strikeId)) + .innerJoin(report, eq(reportStatus.reportId, report.id)) + .innerJoin(team, eq(report.reportedTeamId, team.id)) + .as('strike_weight_subquery'); + + return db + .select({ + team: team, + memberOne: memberOneUser, + memberTwo: memberTwoUser, + memberOneDeath: memberOneDeath, + memberTwoDeath: memberTwoDeath, + strikeWeight: strikeWeightSubquery.strikeWeight + }) + .from(team) + .leftJoin(memberOneTeamMember, eq(team.id, memberOneTeamMember.teamId)) + .leftJoin(memberTwoTeamMember, eq(team.id, memberTwoTeamMember.teamId)) + .leftJoin(memberOneUser, eq(memberOneTeamMember.userId, memberOneUser.id)) + .leftJoin(memberTwoUser, eq(memberTwoTeamMember.userId, memberTwoUser.id)) + .leftJoin(memberOneDeath, eq(memberOneUser.id, memberOneDeath.deadUserId)) + .leftJoin(memberTwoDeath, eq(memberTwoUser.id, memberTwoDeath.deadUserId)) + .leftJoin(strikeWeightSubquery, eq(team.id, strikeWeightSubquery.teamId)); +} + export async function getTeamById(db: Database, values: GetTeamByIdReq) { const teams = await db.select().from(team).where(eq(team.id, values.id)); diff --git a/src/pages/api/team/index.ts b/src/pages/api/team/index.ts index 5c1202f..ca7da9e 100644 --- a/src/pages/api/team/index.ts +++ b/src/pages/api/team/index.ts @@ -7,18 +7,27 @@ export const GET: APIRoute = async ({ request }) => { return new Response(null, { status: 401 }); } - const teams = await db.getTeams({}); + const teams = await db.getTeamsFull({}); const response = []; for (const team of teams) { - const users = []; - if (team.memberOne.uuid) users.push(team.memberOne.uuid); - if (team.memberTwo.uuid) users.push(team.memberTwo.uuid); - response.push({ - name: team.name, - color: team.color, - users: users + name: team.team.name, + color: team.team.color, + lastJoined: team.team.lastJoined ? new Date(team.team.lastJoined).getTime() : null, + strikeWeight: team.strikeWeight ?? 0, + memberOne: team.memberOne + ? { + uuid: team.memberOne.uuid, + dead: team.memberOneDeath != null + } + : null, + memberTwo: team.memberTwo + ? { + uuid: team.memberTwo.uuid, + dead: team.memberTwoDeath != null + } + : null }); }