From 550ccd797a3f91a765f53815efd1a2d9971bd77a Mon Sep 17 00:00:00 2001 From: "Kalle (Sendou)" <38327916+Sendouc@users.noreply.github.com> Date: Fri, 11 Dec 2020 20:23:23 +0200 Subject: [PATCH] user page player / player page backend --- .husky/pre-commit | 2 +- components/player/PlayerTable.tsx | 4 +- pages/player/[id].tsx | 14 ++-- pages/u/[identifier].tsx | 35 ++------ prisma/queries/getPlayerWithPlacements.ts | 85 ++++++++++++++++++++ prisma/queries/getPlayersPeak.ts | 47 +++++++++++ prisma/queries/getPlayersTop500Placements.ts | 29 ------- 7 files changed, 149 insertions(+), 67 deletions(-) create mode 100644 prisma/queries/getPlayerWithPlacements.ts create mode 100644 prisma/queries/getPlayersPeak.ts delete mode 100644 prisma/queries/getPlayersTop500Placements.ts diff --git a/.husky/pre-commit b/.husky/pre-commit index 209abfcd6..1581e836d 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1,4 @@ #!/bin/sh . "$(dirname $0)/_/husky.sh" -npm run ex:pre-commit && npm run prettier:pre-commit \ No newline at end of file +npm run prettier:pre-commit && npm run ex:pre-commit \ No newline at end of file diff --git a/components/player/PlayerTable.tsx b/components/player/PlayerTable.tsx index 85f69b371..c390b906a 100644 --- a/components/player/PlayerTable.tsx +++ b/components/player/PlayerTable.tsx @@ -12,10 +12,10 @@ import { import WeaponImage from "components/common/WeaponImage"; import { getRankingString } from "lib/strings"; import { useMyTheme } from "lib/useMyTheme"; -import { GetPlayersTop500Placements } from "prisma/queries/getPlayersTop500Placements"; +import { GetPlayerWithPlacementsData } from "prisma/queries/getPlayerWithPlacements"; interface Props { - placements: NonNullable["placements"]; + placements: NonNullable["placements"]; } const PlayerPage: React.FC = ({ placements }) => { diff --git a/pages/player/[id].tsx b/pages/player/[id].tsx index dcf18d450..31c436cb2 100644 --- a/pages/player/[id].tsx +++ b/pages/player/[id].tsx @@ -4,14 +4,16 @@ import PlayerTable from "components/player/PlayerTable"; import { GetStaticPaths, GetStaticProps } from "next"; import prisma from "prisma/client"; import { - GetPlayersTop500Placements, - getPlayersTop500Placements, -} from "prisma/queries/getPlayersTop500Placements"; + getPlayerWithPlacements, + GetPlayerWithPlacementsData, +} from "prisma/queries/getPlayerWithPlacements"; const PlayerPage = ({ player }: Props) => { // TODO: spinner if (!player) return null; + console.log({ player }); + return ( <> { }; interface Props { - player: GetPlayersTop500Placements; + player: GetPlayerWithPlacementsData; } export const getStaticProps: GetStaticProps = async ({ params }) => { - const player = await getPlayersTop500Placements(params!.id as string); + const player = await getPlayerWithPlacements(params!.id as string); if (!player || !player.placements) return { notFound: true }; return { props: { - player: { ...player, leaguePlacements: null } as any, + player: player, }, }; }; diff --git a/pages/u/[identifier].tsx b/pages/u/[identifier].tsx index 96d8990b1..2ab814da5 100644 --- a/pages/u/[identifier].tsx +++ b/pages/u/[identifier].tsx @@ -16,7 +16,7 @@ import useUser from "lib/useUser"; import { isCustomUrl } from "lib/validators/profile"; import { GetStaticPaths, GetStaticProps } from "next"; import prisma from "prisma/client"; -import { getPlayersTop500Placements } from "prisma/queries/getPlayersTop500Placements"; +import { getPlayersPeak } from "prisma/queries/getPlayersPeak"; import { getUserByIdentifier, GetUserByIdentifierData, @@ -192,38 +192,15 @@ export const getStaticProps: GetStaticProps = async ({ params }) => { }; } - const peakXPowers: Partial> = {}; - let peakLeaguePowers: Partial> = {}; - - if (!!user.player?.switchAccountId) { - const player = await getPlayersTop500Placements( - user.player.switchAccountId - ); - - for (const placement of player!.placements) { - peakXPowers[placement.mode] = Math.max( - peakXPowers[placement.mode] ?? 0, - placement.xPower - ); - } - - peakLeaguePowers = player!.leaguePlacements.reduce( - (acc, cur) => { - acc[cur.squad.type] = Math.max( - acc[cur.squad.type], - cur.squad.leaguePower - ); - return acc; - }, - { TWIN: -1, QUAD: -1 } - ); - } + const peak = user.player?.switchAccountId + ? await getPlayersPeak(user.player.switchAccountId) + : { peakXPowers: {}, peakLeaguePowers: {} }; return { props: { user, - peakXPowers, - peakLeaguePowers, + peakXPowers: peak.peakXPowers, + peakLeaguePowers: peak.peakLeaguePowers, }, revalidate: 1, }; diff --git a/prisma/queries/getPlayerWithPlacements.ts b/prisma/queries/getPlayerWithPlacements.ts new file mode 100644 index 000000000..c692c6e52 --- /dev/null +++ b/prisma/queries/getPlayerWithPlacements.ts @@ -0,0 +1,85 @@ +import { Prisma } from "@prisma/client"; +import prisma from "prisma/client"; + +export type GetPlayerWithPlacementsData = Prisma.PromiseReturnType< + typeof getPlayerWithPlacements +>; + +export const getPlayerWithPlacements = async (switchAccountId: string) => { + const player = await getPlayer(); + + if (!player) return null; + + type PlayerWithPlacements = Prisma.PromiseReturnType; + type LeaguePlacementArray = NonNullable["leaguePlacements"]; + + return { + ...player, + placements: player.placements.sort((a, b) => { + if (a.year !== b.year) return b.year - a.year; + if (a.month !== b.month) return b.month - a.month; + + const modes = ["SZ", "TC", "RM", "CB"]; + return modes.indexOf(a.mode) - modes.indexOf(b.mode); + }), + leaguePlacements: JSON.parse( + JSON.stringify(getTopLeaguePlacements()) + ) as ReturnType, + }; + + function getTopLeaguePlacements() { + const result: { TWIN: LeaguePlacementArray; QUAD: LeaguePlacementArray } = { + TWIN: [], + QUAD: [], + }; + + if (!player) return result; + + for (const placement of player.leaguePlacements) { + result[placement.squad.members.length === 2 ? "TWIN" : "QUAD"].push( + placement + ); + } + + result.TWIN.sort((a, b) => b.squad.leaguePower - a.squad.leaguePower); + result.QUAD.sort((a, b) => b.squad.leaguePower - a.squad.leaguePower); + + return { TWIN: result.TWIN.slice(0, 10), QUAD: result.QUAD.slice(0, 10) }; + } + + function getPlayer() { + return prisma.player.findUnique({ + where: { switchAccountId }, + include: { + leaguePlacements: { + select: { + squad: { + select: { + startTime: true, + leaguePower: true, + members: { + select: { + weapon: true, + player: { + include: { + user: { + select: { + username: true, + discriminator: true, + discordId: true, + discordAvatar: true, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + placements: true, + }, + }); + } +}; diff --git a/prisma/queries/getPlayersPeak.ts b/prisma/queries/getPlayersPeak.ts new file mode 100644 index 000000000..8b7063415 --- /dev/null +++ b/prisma/queries/getPlayersPeak.ts @@ -0,0 +1,47 @@ +import { Prisma, RankedMode } from "@prisma/client"; +import prisma from "prisma/client"; + +export type GetPlayersPeakData = Prisma.PromiseReturnType< + typeof getPlayersPeak +>; + +export const getPlayersPeak = async (switchAccountId: string) => { + const player = await prisma.player.findUnique({ + where: { switchAccountId }, + select: { + placements: { + select: { + xPower: true, + mode: true, + }, + }, + leaguePlacements: { + select: { squad: { select: { leaguePower: true, type: true } } }, + }, + }, + }); + + if (!player) return { peakXPowers: {}, peakLeaguePowers: {} }; + + const peakXPowers: Partial> = {}; + + for (const placement of player.placements) { + peakXPowers[placement.mode] = Math.max( + peakXPowers[placement.mode] ?? 0, + placement.xPower + ); + } + + const peakLeaguePowers = player.leaguePlacements.reduce( + (acc: { TWIN?: number; QUAD?: number }, cur) => { + acc[cur.squad.type] = Math.max( + acc[cur.squad.type] ?? 0, + cur.squad.leaguePower + ); + return acc; + }, + { TWIN: undefined, QUAD: undefined } + ); + + return { peakXPowers, peakLeaguePowers }; +}; diff --git a/prisma/queries/getPlayersTop500Placements.ts b/prisma/queries/getPlayersTop500Placements.ts deleted file mode 100644 index 2518f753c..000000000 --- a/prisma/queries/getPlayersTop500Placements.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Prisma } from "@prisma/client"; -import prisma from "prisma/client"; - -export type GetPlayersTop500Placements = Prisma.PromiseReturnType< - typeof getPlayersTop500Placements ->; - -export const getPlayersTop500Placements = async (switchAccountId: string) => { - const player = await prisma.player.findUnique({ - where: { switchAccountId }, - include: { - leaguePlacements: { include: { squad: { include: { members: true } } } }, - placements: true, - }, - }); - - if (!player) return null; - - return { - ...player, - placements: player.placements.sort((a, b) => { - if (a.year !== b.year) return b.year - a.year; - if (a.month !== b.month) return b.month - a.month; - - const modes = ["SZ", "TC", "RM", "CB"]; - return modes.indexOf(a.mode) - modes.indexOf(b.mode); - }), - }; -};