From 3245284eccff0d16cb8b2f8e71e66691f62934ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Tue, 31 Oct 2023 12:58:24 -0500 Subject: [PATCH] feat: website apis --- .../archives/[region]/[season]/info/route.ts | 12 ++++++ .../[region]/[season]/{ => latest}/route.ts | 4 +- src/app/tools/ratings/page.tsx | 24 +++++------ .../blitzkrieg/getArchivedRatingsInfoAPI.ts | 40 +++++++++++++++++++ 4 files changed, 65 insertions(+), 15 deletions(-) create mode 100644 src/app/api/ratings/archives/[region]/[season]/info/route.ts rename src/app/api/ratings/archives/[region]/[season]/{ => latest}/route.ts (73%) create mode 100644 src/core/blitzkrieg/getArchivedRatingsInfoAPI.ts diff --git a/src/app/api/ratings/archives/[region]/[season]/info/route.ts b/src/app/api/ratings/archives/[region]/[season]/info/route.ts new file mode 100644 index 000000000..912ffe7a3 --- /dev/null +++ b/src/app/api/ratings/archives/[region]/[season]/info/route.ts @@ -0,0 +1,12 @@ +import { NextResponse } from 'next/server'; +import { Region } from '../../../../../../../constants/regions'; +import getArchivedRatingsInfo from '../../../../../../../core/blitzkrieg/getArchivedRatingsInfo'; + +export async function GET( + request: Request, + { params }: { params: { region: Region; season: number } }, +) { + return NextResponse.json( + await getArchivedRatingsInfo(params.region, params.season), + ); +} diff --git a/src/app/api/ratings/archives/[region]/[season]/route.ts b/src/app/api/ratings/archives/[region]/[season]/latest/route.ts similarity index 73% rename from src/app/api/ratings/archives/[region]/[season]/route.ts rename to src/app/api/ratings/archives/[region]/[season]/latest/route.ts index 01dd9cb31..1dede8e2a 100644 --- a/src/app/api/ratings/archives/[region]/[season]/route.ts +++ b/src/app/api/ratings/archives/[region]/[season]/latest/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server'; -import { Region } from '../../../../../../constants/regions'; -import { getArchivedRatingsLeaderboard } from '../../../../../../core/blitzkrieg/getArchivedRatingsLeaderboard'; +import { Region } from '../../../../../../../constants/regions'; +import { getArchivedRatingsLeaderboard } from '../../../../../../../core/blitzkrieg/getArchivedRatingsLeaderboard'; export async function GET( request: Request, diff --git a/src/app/tools/ratings/page.tsx b/src/app/tools/ratings/page.tsx index 7b222fcdb..628d7b8b8 100644 --- a/src/app/tools/ratings/page.tsx +++ b/src/app/tools/ratings/page.tsx @@ -12,6 +12,7 @@ import { FIRST_ARCHIVED_RATINGS_SEASON, getArchivedLatestSeasonNumberAPI, } from '../../../core/blitzkrieg/getArchivedLatestSeasonNumberAPI'; +import getArchivedRatingsInfoAPI from '../../../core/blitzkrieg/getArchivedRatingsInfoAPI'; import { useRatings } from '../../../stores/ratings'; export default function Page() { @@ -24,22 +25,19 @@ export default function Page() { // null being the latest season const [season, setSeason] = useState(null); + useEffect(() => { + getArchivedLatestSeasonNumberAPI().then(setLatestArchivedSeasonNumber); + }, []); + useEffect(() => { (async () => { - const [newRatingsInfo, newLatestArchivedSeasonNumber] = await Promise.all( - [getRatingsInfo(ratings.region), getArchivedLatestSeasonNumberAPI()], - ); - - setRatingsInfo(newRatingsInfo); - setLatestArchivedSeasonNumber(newLatestArchivedSeasonNumber); - - setSeason( - newRatingsInfo.detail == undefined - ? null - : newLatestArchivedSeasonNumber, - ); + if (season === null) { + setRatingsInfo(await getRatingsInfo(ratings.region)); + } else { + setRatingsInfo(await getArchivedRatingsInfoAPI(ratings.region, season)); + } })(); - }, [ratings.region]); + }, [season]); return ( diff --git a/src/core/blitzkrieg/getArchivedRatingsInfoAPI.ts b/src/core/blitzkrieg/getArchivedRatingsInfoAPI.ts new file mode 100644 index 000000000..89cc631c5 --- /dev/null +++ b/src/core/blitzkrieg/getArchivedRatingsInfoAPI.ts @@ -0,0 +1,40 @@ +import { RatingsInfo } from '../../commands/ratings'; +import { Region } from '../../constants/regions'; + +const INFO_CACHE: Record< + Region, + Record< + number, + RatingsInfo & { + detail: undefined; + } + > +> = { + com: {}, + eu: {}, + asia: {}, +}; + +export default async function getArchivedRatingsInfoAPI( + region: Region, + season: number, +) { + if (INFO_CACHE[region][season]) { + return INFO_CACHE[region][season]; + } + + const response = await fetch( + `/api/ratings/archives/${region}/${season}/info`, + ); + const json = (await response.json()) as RatingsInfo; + + if (json.detail) { + throw new Error( + `No ratings info found for season ${season}, region ${region}`, + ); + } + + INFO_CACHE[region][season] = json; + + return json; +}