From da8025a0ad193b6e57a631687cf025f9197fa596 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Fri, 18 Oct 2024 10:24:52 -0500 Subject: [PATCH] feat: remove api --- packages/api/next-env.d.ts | 5 - packages/api/next.config.js | 4 - packages/api/package.json | 18 --- .../app/[region]/rating/current/info/route.ts | 9 -- .../rating/current/league/[league]/route.ts | 11 -- .../rating/current/search/[username]/route.ts | 11 -- .../api/src/app/patreon/auth/[code]/route.ts | 24 ---- .../app/patreon/membership/[token]/route.ts | 76 ------------ .../src/app/patreon/refresh/[token]/route.ts | 19 --- .../src/app/tank-voting/[id]/average/route.ts | 78 ------------- .../src/app/tank-voting/[id]/cast/route.ts | 110 ------------------ packages/api/tsconfig.json | 7 -- 12 files changed, 372 deletions(-) delete mode 100644 packages/api/next-env.d.ts delete mode 100644 packages/api/next.config.js delete mode 100644 packages/api/package.json delete mode 100644 packages/api/src/app/[region]/rating/current/info/route.ts delete mode 100644 packages/api/src/app/[region]/rating/current/league/[league]/route.ts delete mode 100644 packages/api/src/app/[region]/rating/current/search/[username]/route.ts delete mode 100644 packages/api/src/app/patreon/auth/[code]/route.ts delete mode 100644 packages/api/src/app/patreon/membership/[token]/route.ts delete mode 100644 packages/api/src/app/patreon/refresh/[token]/route.ts delete mode 100644 packages/api/src/app/tank-voting/[id]/average/route.ts delete mode 100644 packages/api/src/app/tank-voting/[id]/cast/route.ts delete mode 100644 packages/api/tsconfig.json diff --git a/packages/api/next-env.d.ts b/packages/api/next-env.d.ts deleted file mode 100644 index 40c3d6809..000000000 --- a/packages/api/next-env.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -/// -/// - -// NOTE: This file should not be edited -// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. diff --git a/packages/api/next.config.js b/packages/api/next.config.js deleted file mode 100644 index 4678774e6..000000000 --- a/packages/api/next.config.js +++ /dev/null @@ -1,4 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = {}; - -export default nextConfig; diff --git a/packages/api/package.json b/packages/api/package.json deleted file mode 100644 index 0ce9da55d..000000000 --- a/packages/api/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "@blitzkit/api", - "private": true, - "main": "src/index.ts", - "scripts": { - "dev": "next dev", - "build": "next build" - }, - "dependencies": { - "react": "^18", - "react-dom": "^18", - "next": "14.2.8" - }, - "devDependencies": { - "@types/react": "^18", - "@types/react-dom": "^18" - } -} diff --git a/packages/api/src/app/[region]/rating/current/info/route.ts b/packages/api/src/app/[region]/rating/current/info/route.ts deleted file mode 100644 index 675be3a39..000000000 --- a/packages/api/src/app/[region]/rating/current/info/route.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { getRatingInfo, Region } from '@blitzkit/core'; -import { NextResponse } from 'next/server'; - -export async function GET( - request: Request, - { params }: { params: { region: Region } }, -) { - return NextResponse.json(await getRatingInfo(params.region)); -} diff --git a/packages/api/src/app/[region]/rating/current/league/[league]/route.ts b/packages/api/src/app/[region]/rating/current/league/[league]/route.ts deleted file mode 100644 index 1e13c8019..000000000 --- a/packages/api/src/app/[region]/rating/current/league/[league]/route.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { getRatingLeague, Region } from '@blitzkit/core'; -import { NextResponse } from 'next/server'; - -export async function GET( - request: Request, - { params }: { params: { region: Region; league: number } }, -) { - return NextResponse.json( - await getRatingLeague(params.region, params.league, true), - ); -} diff --git a/packages/api/src/app/[region]/rating/current/search/[username]/route.ts b/packages/api/src/app/[region]/rating/current/search/[username]/route.ts deleted file mode 100644 index c4506fdfd..000000000 --- a/packages/api/src/app/[region]/rating/current/search/[username]/route.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Region, searchCurrentRatingPlayers } from '@blitzkit/core'; -import { NextResponse } from 'next/server'; - -export async function GET( - request: Request, - { params }: { params: { region: Region; username: string } }, -) { - return NextResponse.json( - await searchCurrentRatingPlayers(params.region, params.username), - ); -} diff --git a/packages/api/src/app/patreon/auth/[code]/route.ts b/packages/api/src/app/patreon/auth/[code]/route.ts deleted file mode 100644 index 714cb846b..000000000 --- a/packages/api/src/app/patreon/auth/[code]/route.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { assertSecret } from '@blitzkit/core'; -import { NextResponse } from 'next/server'; - -export async function GET( - request: Request, - { params }: { params: { code: string } }, -) { - const response = await fetch( - `https://www.patreon.com/api/oauth2/token?code=${ - params.code - }&grant_type=authorization_code&client_id=${assertSecret( - process.env.PUBLIC_PATREON_CLIENT_ID, - )}&client_secret=${assertSecret( - process.env.PATREON_CLIENT_SECRET, - )}&redirect_uri=${assertSecret(process.env.PUBLIC_PATREON_REDIRECT_URI)}`, - { - method: 'POST', - headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, - }, - ); - const json = await response.json(); - - return NextResponse.json(json); -} diff --git a/packages/api/src/app/patreon/membership/[token]/route.ts b/packages/api/src/app/patreon/membership/[token]/route.ts deleted file mode 100644 index ea9d1d2d3..000000000 --- a/packages/api/src/app/patreon/membership/[token]/route.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { assertSecret } from '@blitzkit/core'; -import { NextResponse } from 'next/server'; - -interface PatreonMembershipResponse { - data: { - attributes: unknown; - id: `${number}`; - relationships: { - memberships: { - data: { - id: string; // uuid - type: 'member'; - }[]; - }; - }; - type: 'user'; - }; - included: ( - | { - attributes: { - patron_status: - | 'active_patron' - | 'declined_patron' - | 'former_patron' - | null; // null = never a paid member - }; - id: string; // uuid - relationships: { - campaign: { - data: { - id: `${number}`; // id of my campaign to check against - type: 'campaign'; - }; - links: { - related: string; // url - }; - }; - }; - type: 'member'; - } - | { - attributes: {}; - id: `${number}`; - type: 'campaign'; // ignore this discriminator - } - )[]; - links: { - self: 'https://www.patreon.com/api/oauth2/v2/user/124201389'; - }; -} - -export async function GET( - request: Request, - { params }: { params: { token: string } }, -) { - const response = await fetch( - encodeURI( - 'https://www.patreon.com/api/oauth2/v2/identity?include=memberships.campaign&fields[member]=patron_status', - ), - { headers: { Authorization: `Bearer ${params.token}` } }, - ); - - if (!response.ok) return NextResponse.json(false); - - const json = (await response.json()) as PatreonMembershipResponse; - - return NextResponse.json( - json.included.some( - (item) => - item.type === 'member' && - item.relationships.campaign.data.id === - assertSecret(process.env.PATREON_CAMPAIGN_ID) && - item.attributes.patron_status === 'active_patron', - ), - ); -} diff --git a/packages/api/src/app/patreon/refresh/[token]/route.ts b/packages/api/src/app/patreon/refresh/[token]/route.ts deleted file mode 100644 index bf58e39b7..000000000 --- a/packages/api/src/app/patreon/refresh/[token]/route.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { assertSecret } from '@blitzkit/core'; -import { NextResponse } from 'next/server'; - -export async function GET( - request: Request, - { params }: { params: { token: string } }, -) { - const response = await fetch( - `https://www.patreon.com/api/oauth2/token?grant_type=refresh_token&refresh_token=${ - params.token - }&client_id=${assertSecret( - process.env.PUBLIC_PATREON_CLIENT_ID, - )}&client_secret=${assertSecret(process.env.PATREON_CLIENT_SECRET)}`, - { method: 'POST' }, - ); - const json = await response.json(); - - return NextResponse.json(json); -} diff --git a/packages/api/src/app/tank-voting/[id]/average/route.ts b/packages/api/src/app/tank-voting/[id]/average/route.ts deleted file mode 100644 index 007727718..000000000 --- a/packages/api/src/app/tank-voting/[id]/average/route.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { - BlitzkitResponse, - BlitzkitResponseError, - fetchTankDefinitions, - isValidBlitzId, - TankVotes, - usersDatabase, -} from '@blitzkit/core'; -import { NextRequest, NextResponse } from 'next/server'; - -export async function GET( - request: NextRequest, - { params }: { params: { id: string } }, -) { - const id = Number(params.id); - const tankDefinitions = await fetchTankDefinitions(); - - if (isNaN(id) || !tankDefinitions.tanks[id]) { - return NextResponse.json({ - status: 'error', - error: 'INVALID_TANK_ID', - } satisfies BlitzkitResponseError); - } - - const blitzIdString = request.nextUrl.searchParams.get('player'); - const blitzId = Number(blitzIdString); - const blitzToken = request.nextUrl.searchParams.get('token'); - - if ((blitzIdString === null) !== (blitzToken === null)) { - return NextResponse.json({ - status: 'error', - error: 'UNDEFINED_TOKEN_OR_PLAYER_ID', - } satisfies BlitzkitResponseError); - } - - if ( - blitzIdString !== null && - (!(await isValidBlitzId(blitzId, blitzToken ?? undefined)) || - isNaN(blitzId)) - ) { - return NextResponse.json({ - status: 'error', - error: 'INVALID_TOKEN_OR_PLAYER_ID', - } satisfies BlitzkitResponseError); - } - - try { - const aggregation = await usersDatabase.tankVote.aggregate({ - where: { id }, - _count: { id: true }, - _avg: { - easiness: true, - firepower: true, - maneuverability: true, - survivability: true, - }, - }); - const userVote = await usersDatabase.tankVote.findUnique({ - where: { id, user_blitz_id: blitzId }, - select: { last_updated: true }, - }); - - return NextResponse.json({ - status: 'ok', - data: { - categories: aggregation._avg, - votes: aggregation._count.id, - last_updated: userVote?.last_updated.getTime(), - }, - } satisfies BlitzkitResponse); - } catch (message) { - return NextResponse.json({ - status: 'error', - error: 'DATABASE_ERROR', - message, - } satisfies BlitzkitResponseError); - } -} diff --git a/packages/api/src/app/tank-voting/[id]/cast/route.ts b/packages/api/src/app/tank-voting/[id]/cast/route.ts deleted file mode 100644 index b0f1bbc08..000000000 --- a/packages/api/src/app/tank-voting/[id]/cast/route.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { - BlitzkitResponse, - BlitzkitResponseError, - fetchTankDefinitions, - isValidBlitzId, - StarsInt, - TANK_VOTE_CATEGORIES, - TankVoteCategory, - usersDatabase, -} from '@blitzkit/core'; -import { NextRequest, NextResponse } from 'next/server'; - -export async function GET( - request: NextRequest, - { params }: { params: { id: string } }, -) { - const tankId = Number(params.id); - const tankDefinitions = await fetchTankDefinitions(); - - if (isNaN(tankId) || !tankDefinitions.tanks[tankId]) { - return NextResponse.json({ - status: 'error', - error: 'INVALID_TANK_ID', - } satisfies BlitzkitResponseError); - } - - const blitzIdString = request.nextUrl.searchParams.get('player'); - const blitzId = Number(blitzIdString); - const blitzToken = request.nextUrl.searchParams.get('token'); - - if (blitzIdString === null || blitzToken === null) { - return NextResponse.json({ - status: 'error', - error: 'UNDEFINED_TOKEN_OR_PLAYER_ID', - } satisfies BlitzkitResponseError); - } - - if ( - blitzIdString !== null && - (!(await isValidBlitzId(blitzId, blitzToken ?? undefined)) || - isNaN(blitzId)) - ) { - return NextResponse.json({ - status: 'error', - error: 'INVALID_TOKEN_OR_PLAYER_ID', - } satisfies BlitzkitResponseError); - } - - const votes: Partial> = {}; - let recognizedVoteCategories = 0; - - for (const category of TANK_VOTE_CATEGORIES) { - const voteRaw = request.nextUrl.searchParams.get(category); - - if (voteRaw === null) continue; - - const vote = Number(voteRaw); - - if (isNaN(vote) || !Number.isInteger(vote) || vote < 1 || vote > 5) { - return NextResponse.json({ - status: 'error', - error: 'INVALID_VOTE', - } satisfies BlitzkitResponseError); - } - - votes[category] = vote as StarsInt; - recognizedVoteCategories++; - } - - if (recognizedVoteCategories === 0) { - return NextResponse.json({ - status: 'error', - error: 'NO_VOTES', - } satisfies BlitzkitResponseError); - } - - try { - await usersDatabase.user.upsert({ - where: { blitz_id: blitzId }, - update: { - last_used: new Date(), - tank_votes: { - upsert: { - where: { id: tankId }, - update: { ...votes, last_updated: new Date() }, - create: { ...votes, id: tankId, last_updated: new Date() }, - }, - }, - }, - create: { - blitz_id: blitzId, - last_used: new Date(), - tank_votes: { - create: { ...votes, id: tankId, last_updated: new Date() }, - }, - }, - }); - - return NextResponse.json({ - status: 'ok', - data: undefined, - } satisfies BlitzkitResponse); - } catch (message) { - return NextResponse.json({ - status: 'error', - error: 'DATABASE_ERROR', - message, - } satisfies BlitzkitResponseError); - } -} diff --git a/packages/api/tsconfig.json b/packages/api/tsconfig.json deleted file mode 100644 index 379ca5245..000000000 --- a/packages/api/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "plugins": [{ "name": "next" }] - }, - "include": ["src/**/*"] -}