From 549d0f1d77d4ac9aca9c4ced9795ab1a3517aa8c Mon Sep 17 00:00:00 2001 From: aronmal Date: Sat, 15 Apr 2023 12:09:25 +0200 Subject: [PATCH] Backend rewrite using async/await --- .../components/checkPasswordIsValid.ts | 7 +- .../backend/components/checkTokenIsValid.ts | 12 +-- .../lib/backend/components/createPlayerDB.ts | 4 +- .../lib/backend/components/createTokenDB.ts | 5 +- .../lib/backend/components/decodeToken.ts | 14 +-- .../lib/backend/components/getPinFromBody.ts | 6 +- .../lib/backend/components/getPlayer.ts | 18 ++-- .../lib/backend/components/getPlayerByIdDB.ts | 7 +- .../backend/components/getPlayerByNameDB.ts | 7 +- .../lib/backend/components/getTokenDB.ts | 9 +- .../backend/components/getTokenFromBody.ts | 9 +- .../backend/components/getTokenFromCookie.ts | 30 +++--- .../lib/backend/components/getUserFromBody.ts | 11 +-- .../lib/backend/components/sendResponse.ts | 1 + .../lib/backend/components/updatePlayerDB.ts | 7 +- leaky-ships/lib/frontend/getAccessToken.ts | 2 +- leaky-ships/pages/api/game/create.ts | 99 +++++++++---------- leaky-ships/pages/api/game/join.ts | 98 +++++++++--------- leaky-ships/pages/api/user/auth.ts | 41 ++++---- leaky-ships/pages/api/user/data.ts | 16 ++- leaky-ships/pages/api/user/login.ts | 42 ++++---- leaky-ships/pages/api/user/loginCheck.ts | 21 ++-- leaky-ships/pages/api/user/logout.ts | 27 ++--- leaky-ships/pages/api/user/register.ts | 46 ++++----- leaky-ships/pages/api/user/remove.ts | 40 ++++---- leaky-ships/pages/api/ws.ts | 2 +- 26 files changed, 259 insertions(+), 322 deletions(-) diff --git a/leaky-ships/lib/backend/components/checkPasswordIsValid.ts b/leaky-ships/lib/backend/components/checkPasswordIsValid.ts index 8d0a19d..18dfcae 100644 --- a/leaky-ships/lib/backend/components/checkPasswordIsValid.ts +++ b/leaky-ships/lib/backend/components/checkPasswordIsValid.ts @@ -6,12 +6,11 @@ import bcrypt from "bcrypt" export default async function checkPasswordIsValid( context: API, player: Player, - password: string, - next: () => void + password: string ) { // Validate for correct password const result = await bcrypt.compare(password, player.passwordHash ?? "") - if (!result) return sendError(context, rejectionErrors.wrongPassword) + if (!result) throw sendError(context, rejectionErrors.wrongPassword) - return next() + return } diff --git a/leaky-ships/lib/backend/components/checkTokenIsValid.ts b/leaky-ships/lib/backend/components/checkTokenIsValid.ts index ff17140..05ba0f3 100644 --- a/leaky-ships/lib/backend/components/checkTokenIsValid.ts +++ b/leaky-ships/lib/backend/components/checkTokenIsValid.ts @@ -4,11 +4,7 @@ import type { IdToken, RawToken } from "./createTokenDB" import sendError, { API } from "./sendError" import jwt from "jsonwebtoken" -async function checkTokenIsValid( - context: API, - rawToken: RawToken, - next: (token: IdToken) => void -) { +async function checkTokenIsValid(context: API, rawToken: RawToken) { const { value, type } = rawToken // Verify the token and get the payload @@ -17,13 +13,13 @@ async function checkTokenIsValid( data = jwt.verify(value, process.env.TOKEN_SECRET as string) } catch (err: any) { // Deal with the problem in more detail - return sendError(context, jwtVerifyCatch(type, err)) + throw sendError(context, jwtVerifyCatch(type, err)) } // Making sure the token data is not a string (because it should be an object) if (typeof data === "string") - return sendError(context, rejectionErrorFns.tokenWasString(type, value)) + throw sendError(context, rejectionErrorFns.tokenWasString(type, value)) - return next({ id: data.id, type }) + return { id: data.id, type } } export default checkTokenIsValid diff --git a/leaky-ships/lib/backend/components/createPlayerDB.ts b/leaky-ships/lib/backend/components/createPlayerDB.ts index ee2cbf5..eeef9a2 100644 --- a/leaky-ships/lib/backend/components/createPlayerDB.ts +++ b/leaky-ships/lib/backend/components/createPlayerDB.ts @@ -2,11 +2,11 @@ import prisma from "../../prisma" import logging from "../logging" import type { Player } from "@prisma/client" -async function createPlayerDB(next: (player: Player) => void) { +async function createPlayerDB() { const player = await prisma.player.create({ data: {} }) logging("Anonymous player created: " + player.id, ["debug"]) - return next(player) + return player } export default createPlayerDB diff --git a/leaky-ships/lib/backend/components/createTokenDB.ts b/leaky-ships/lib/backend/components/createTokenDB.ts index d6dd7c7..37c4950 100644 --- a/leaky-ships/lib/backend/components/createTokenDB.ts +++ b/leaky-ships/lib/backend/components/createTokenDB.ts @@ -18,8 +18,7 @@ export const tokenLifetime = { export default async function createTokenDB( player: Player, - newTokenType: TokenType, - next: (newToken: RawToken, newTokenDB: Token) => void + newTokenType: TokenType ) { // Create token entry in DB const newTokenDB = await prisma.token.create({ @@ -41,5 +40,5 @@ export default async function createTokenDB( { expiresIn: tokenLifetime[newTokenType] } ) - return next({ value: newToken, type: newTokenType }, newTokenDB) + return { newToken: { value: newToken, type: newTokenType }, newTokenDB } } diff --git a/leaky-ships/lib/backend/components/decodeToken.ts b/leaky-ships/lib/backend/components/decodeToken.ts index 357c8d5..9f4661f 100644 --- a/leaky-ships/lib/backend/components/decodeToken.ts +++ b/leaky-ships/lib/backend/components/decodeToken.ts @@ -5,11 +5,7 @@ import type { IdToken, RawToken } from "./createTokenDB" import sendError, { API } from "./sendError" import jwt from "jsonwebtoken" -async function decodeToken( - context: API, - rawToken: RawToken, - next: (token: IdToken) => void -) { +async function decodeToken(context: API, rawToken: RawToken) { const { value, type } = rawToken // Verify the token and get the payload @@ -22,14 +18,14 @@ async function decodeToken( const fallbackData = jwt.decode(value) // Making sure the token data is not a string (because it should be an object) if (typeof fallbackData === "string") - return sendError(context, rejectionErrorFns.tokenWasString(type, value)) - return next({ id: fallbackData?.id, type }) + throw sendError(context, rejectionErrorFns.tokenWasString(type, value)) + return { id: fallbackData?.id, type } } // Making sure the token data is not a string (because it should be an object) if (typeof data === "string") - return sendError(context, rejectionErrorFns.tokenWasString(type, value)) + throw sendError(context, rejectionErrorFns.tokenWasString(type, value)) - return next({ id: data.id, type }) + return { id: data.id, type } } export default decodeToken diff --git a/leaky-ships/lib/backend/components/getPinFromBody.ts b/leaky-ships/lib/backend/components/getPinFromBody.ts index dc75de3..e4100b0 100644 --- a/leaky-ships/lib/backend/components/getPinFromBody.ts +++ b/leaky-ships/lib/backend/components/getPinFromBody.ts @@ -1,6 +1,6 @@ import sendError, { API } from "./sendError" -async function getPinFromBody(context: API, next: (pin: string) => void) { +async function getPinFromBody(context: API) { const body = JSON.parse(context.req.body) if ( typeof body !== "object" || @@ -8,7 +8,7 @@ async function getPinFromBody(context: API, next: (pin: string) => void) { !("pin" in body) || typeof body.pin !== "string" ) - return sendError(context, { + throw sendError(context, { rejected: true, message: "No pin in request body!", statusCode: 401, @@ -17,7 +17,7 @@ async function getPinFromBody(context: API, next: (pin: string) => void) { }) const { pin } = body - return next(pin) + return pin } export default getPinFromBody diff --git a/leaky-ships/lib/backend/components/getPlayer.ts b/leaky-ships/lib/backend/components/getPlayer.ts index 4e15e5a..cd83bfe 100644 --- a/leaky-ships/lib/backend/components/getPlayer.ts +++ b/leaky-ships/lib/backend/components/getPlayer.ts @@ -3,19 +3,13 @@ import getPlayerByIdDB from "./getPlayerByIdDB" import getTokenDB from "./getTokenDB" import getTokenFromBody from "./getTokenFromBody" import { API } from "./sendError" -import { Player, Token } from "@prisma/client" -function getPlayer( - context: API, - next: (player: Player, tokenDB: Token) => void -) { - return getTokenFromBody(context, (accessToken) => { - checkTokenIsValid(context, accessToken, (token) => { - getTokenDB(context, token, (tokenDB) => { - getPlayerByIdDB(context, tokenDB, (player) => next(player, tokenDB)) - }) - }) - }) +async function getPlayer(context: API) { + const accessToken = await getTokenFromBody(context) + const token = await checkTokenIsValid(context, accessToken) + const tokenDB = await getTokenDB(context, token) + const player = await getPlayerByIdDB(context, tokenDB) + return { player, tokenDB } } export default getPlayer diff --git a/leaky-ships/lib/backend/components/getPlayerByIdDB.ts b/leaky-ships/lib/backend/components/getPlayerByIdDB.ts index af84e59..e1d8959 100644 --- a/leaky-ships/lib/backend/components/getPlayerByIdDB.ts +++ b/leaky-ships/lib/backend/components/getPlayerByIdDB.ts @@ -5,8 +5,7 @@ import type { Player, Token } from "@prisma/client" export default async function getPlayerByIdDB( context: API, - tokenDB: Token, - next: (player: Player) => void + tokenDB: Token ) { // Find Host in DB if it still exists (just to make sure) const player = await prisma.player.findUnique({ @@ -15,8 +14,8 @@ export default async function getPlayerByIdDB( }, }) if (!player) { - return sendError(context, rejectionErrors.playerNotFound) + throw sendError(context, rejectionErrors.playerNotFound) } - return next(player) + return player } diff --git a/leaky-ships/lib/backend/components/getPlayerByNameDB.ts b/leaky-ships/lib/backend/components/getPlayerByNameDB.ts index a74b35b..3c3518a 100644 --- a/leaky-ships/lib/backend/components/getPlayerByNameDB.ts +++ b/leaky-ships/lib/backend/components/getPlayerByNameDB.ts @@ -5,8 +5,7 @@ import type { Player } from "@prisma/client" export default async function getPlayerByNameDB( context: API, - username: string, - next: (player: Player) => void + username: string ) { // Find Player in DB if it still exists (just to make sure) const player = await Promise.any([ @@ -21,7 +20,7 @@ export default async function getPlayerByNameDB( }, }), ]).catch(() => null) - if (player === null) return sendError(context, rejectionErrors.playerNotFound) + if (player === null) throw sendError(context, rejectionErrors.playerNotFound) - return next(player) + return player } diff --git a/leaky-ships/lib/backend/components/getTokenDB.ts b/leaky-ships/lib/backend/components/getTokenDB.ts index 6303dfc..48c662d 100644 --- a/leaky-ships/lib/backend/components/getTokenDB.ts +++ b/leaky-ships/lib/backend/components/getTokenDB.ts @@ -2,13 +2,12 @@ import prisma from "../../prisma" import { rejectionErrorFns, rejectionErrors } from "../errors" import type { IdToken } from "./createTokenDB" import sendError, { API } from "./sendError" -import type { Token } from "@prisma/client" import { deleteCookie } from "cookies-next" async function getTokenDB( context: API, token: IdToken, - next: (tokenDB: Token) => void, + ignoreChecks?: boolean ) { const { id, type } = token @@ -20,11 +19,11 @@ async function getTokenDB( }) if (!tokenDB) { deleteCookie("token", { ...context, path: "/api" }) - return sendError(context, rejectionErrorFns.tokenNotFound(type)) + throw sendError(context, rejectionErrorFns.tokenNotFound(type)) } if (tokenDB.used && !ignoreChecks) - return sendError(context, rejectionErrors.tokenUsed) + throw sendError(context, rejectionErrors.tokenUsed) await prisma.token.update({ where: { @@ -37,7 +36,7 @@ async function getTokenDB( // await logging('Old token has been invalidated.', ['debug'], req) - return next(tokenDB) + return tokenDB } export default getTokenDB diff --git a/leaky-ships/lib/backend/components/getTokenFromBody.ts b/leaky-ships/lib/backend/components/getTokenFromBody.ts index a39a968..fe85b22 100644 --- a/leaky-ships/lib/backend/components/getTokenFromBody.ts +++ b/leaky-ships/lib/backend/components/getTokenFromBody.ts @@ -2,10 +2,7 @@ import { rejectionErrorFns } from "../errors" import type { RawToken } from "./createTokenDB" import sendError, { API } from "./sendError" -async function getTokenFromBody( - context: API, - next: (accessToken: RawToken) => void -) { +async function getTokenFromBody(context: API): Promise { const type = "ACCESS" const body = JSON.parse(context.req.body) // Checking for cookie presens, because it is necessary @@ -16,11 +13,11 @@ async function getTokenFromBody( typeof body.token === "string" ) { const value = body.token - return next({ value, type }) + return { value, type } } console.log(body) - return sendError(context, rejectionErrorFns.noToken(type)) + throw sendError(context, rejectionErrorFns.noToken(type)) } export default getTokenFromBody diff --git a/leaky-ships/lib/backend/components/getTokenFromCookie.ts b/leaky-ships/lib/backend/components/getTokenFromCookie.ts index 3ba7ce7..f836b44 100644 --- a/leaky-ships/lib/backend/components/getTokenFromCookie.ts +++ b/leaky-ships/lib/backend/components/getTokenFromCookie.ts @@ -3,25 +3,29 @@ import createTokenDB, { RawToken } from "./createTokenDB" import type { API } from "./sendError" import { Player, Token } from "@prisma/client" -async function getTokenFromCookie( - context: API, - next: ( - refreshToken: RawToken, - newPlayer?: { player: Player; newToken: RawToken; newTokenDB: Token } - ) => void -) { +interface Returning { + refreshToken: RawToken + newPlayer?: { player: Player; newToken: RawToken; newTokenDB: Token } +} + +async function getTokenFromCookie(context: API): Promise { const type = "REFRESH" const value = context.req.cookies.token // Checking for cookie presens, because it is necessary if (!value) { - return createPlayerDB((player) => - createTokenDB(player, type, (newToken, newTokenDB) => - next(newToken, { player, newToken, newTokenDB }) - ) - ) + const player = await createPlayerDB() + const { newToken, newTokenDB } = await createTokenDB(player, type) + return { + refreshToken: newToken, + newPlayer: { + player, + newToken, + newTokenDB, + }, + } } - return next({ value, type }) + return { refreshToken: { value, type } } } export default getTokenFromCookie diff --git a/leaky-ships/lib/backend/components/getUserFromBody.ts b/leaky-ships/lib/backend/components/getUserFromBody.ts index 39dace9..da430ed 100644 --- a/leaky-ships/lib/backend/components/getUserFromBody.ts +++ b/leaky-ships/lib/backend/components/getUserFromBody.ts @@ -1,10 +1,7 @@ import { rejectionErrors } from "../errors" import sendError, { API } from "./sendError" -async function getUserFromBody( - context: API, - next: (username: string, password: string) => void -) { +async function getUserFromBody(context: API) { const body = JSON.parse(context.req.body) if ( typeof body !== "object" || @@ -12,13 +9,13 @@ async function getUserFromBody( !("username" in body) || typeof body.username !== "string" ) - return sendError(context, rejectionErrors.noUsername) + throw sendError(context, rejectionErrors.noUsername) const { username } = body if (!("password" in body) || typeof body.password !== "string") - return sendError(context, rejectionErrors.noPassword) + throw sendError(context, rejectionErrors.noPassword) const { password } = body - return next(username, password) + return { username, password } } export default getUserFromBody diff --git a/leaky-ships/lib/backend/components/sendResponse.ts b/leaky-ships/lib/backend/components/sendResponse.ts index 5525f4e..69a59e4 100644 --- a/leaky-ships/lib/backend/components/sendResponse.ts +++ b/leaky-ships/lib/backend/components/sendResponse.ts @@ -37,4 +37,5 @@ export default function sendResponse(context: API, result: Result) { res.status(result.statusCode ?? 200) result.body ? res.json(result.body) : res.end() logging(result.message, result.type ?? ["debug"], req) + return "done" as const } diff --git a/leaky-ships/lib/backend/components/updatePlayerDB.ts b/leaky-ships/lib/backend/components/updatePlayerDB.ts index f870873..83fe23f 100644 --- a/leaky-ships/lib/backend/components/updatePlayerDB.ts +++ b/leaky-ships/lib/backend/components/updatePlayerDB.ts @@ -6,16 +6,15 @@ import type { Player, Prisma } from "@prisma/client" async function updatePlayerDB( context: API, player: Player, - data: Prisma.PlayerUpdateInput, - next: (updatedPlayer: Player) => void + data: Prisma.PlayerUpdateInput ) { - if (!player.anonymous) return sendError(context, rejectionErrors.registered) + if (!player.anonymous) throw sendError(context, rejectionErrors.registered) const updatedPlayer = await prisma.player.update({ where: { id: player.id }, data, }) - return next(updatedPlayer) + return updatedPlayer } export default updatePlayerDB diff --git a/leaky-ships/lib/frontend/getAccessToken.ts b/leaky-ships/lib/frontend/getAccessToken.ts index 571b2bf..fe0aed3 100644 --- a/leaky-ships/lib/frontend/getAccessToken.ts +++ b/leaky-ships/lib/frontend/getAccessToken.ts @@ -28,7 +28,7 @@ async function getAccessToken() { .then(successfulResponse) .then((response) => { try { - const token = tokenSchema.parse(response) + const { token } = tokenSchema.parse(response) return token } catch (err: any) { diff --git a/leaky-ships/pages/api/game/create.ts b/leaky-ships/pages/api/game/create.ts index c024d73..2eba34a 100644 --- a/leaky-ships/pages/api/game/create.ts +++ b/leaky-ships/pages/api/game/create.ts @@ -1,8 +1,6 @@ -import sendError from "@backend/components/sendError" import sendResponse from "@backend/components/sendResponse" import getPlayer from "@lib/backend/components/getPlayer" import prisma from "@lib/prisma" -import { Game, Gamepin, Player_Game } from "@prisma/client" import type { NextApiRequest, NextApiResponse } from "next" import { z } from "zod" @@ -36,25 +34,40 @@ export default async function create( ) { const context = { req, res } - return getPlayer(context, async (player) => { - // Generate a random 4-digit code - const pin = Math.floor(Math.random() * 10000) - .toString() - .padStart(4, "0") + const { player } = await getPlayer(context) + // Generate a random 4-digit code + const pin = Math.floor(Math.random() * 10000) + .toString() + .padStart(4, "0") - let created = false - let game: - | (Game & { - pin: Gamepin | null - players: Player_Game[] - }) - | null + let created = false - game = await prisma.game.findFirst({ - where: { - running: true, + let game = await prisma.game.findFirst({ + where: { + running: true, + players: { + some: { + playerId: player.id, + }, + }, + }, + include: { + pin: true, + players: true, + }, + }) + if (!game) { + created = true + game = await prisma.game.create({ + data: { + pin: { + create: { + pin, + }, + }, players: { - some: { + create: { + isOwner: true, playerId: player.id, }, }, @@ -64,42 +77,20 @@ export default async function create( players: true, }, }) - if (!game) { - created = true - game = await prisma.game.create({ - data: { - pin: { - create: { - pin, - }, - }, - players: { - create: { - isOwner: true, - playerId: player.id, - }, - }, - }, - include: { - pin: true, - players: true, - }, - }) - } + } - return sendResponse(context, { - message: `Player: ${player.id} created game: ${game.id}`, - statusCode: created ? 201 : 200, - body: { - game, - pin: game.pin?.pin, - player: { - id: player.id, - username: player.username ?? undefined, - isOwner: true, - }, + return sendResponse(context, { + message: `Player: ${player.id} created game: ${game.id}`, + statusCode: created ? 201 : 200, + body: { + game, + pin: game.pin?.pin, + player: { + id: player.id, + username: player.username ?? undefined, + isOwner: true, }, - type: ["debug", "infoCyan"], - }) - }).catch((err) => sendError(context, err)) + }, + type: ["debug", "infoCyan"], + }) } diff --git a/leaky-ships/pages/api/game/join.ts b/leaky-ships/pages/api/game/join.ts index 2a8f431..7e08473 100644 --- a/leaky-ships/pages/api/game/join.ts +++ b/leaky-ships/pages/api/game/join.ts @@ -17,63 +17,61 @@ export default async function join( ) { const context = { req, res } - return getPinFromBody(context, (pin) => - getPlayer(context, async (player) => { - try { - const pinDB = await prisma.gamepin.update({ - where: { - pin, - }, - data: { - game: { - update: { - players: { - create: { - isOwner: false, - playerId: player.id, - }, - }, + const pin = await getPinFromBody(context) + const { player } = await getPlayer(context) + try { + const pinDB = await prisma.gamepin.update({ + where: { + pin, + }, + data: { + game: { + update: { + players: { + create: { + isOwner: false, + playerId: player.id, }, }, }, + }, + }, + include: { + game: { include: { - game: { + players: { include: { - players: { - include: { - player: true, - }, - }, + player: true, }, }, }, - }) - - const enemy = pinDB.game.players.find( - (enemy) => enemy.player.id !== player.id - ) - return sendResponse(context, { - message: `Player: ${player.id} joined game: ${pinDB.game.id}`, - body: { - game: pinDB.game, - pin: pinDB.pin, - player: { - id: player.id, - username: player.username ?? undefined, - isOwner: true, - }, - enemy: { - id: enemy?.player.id, - username: enemy?.player.username ?? undefined, - isOwner: false, - }, - }, - type: ["debug", "infoCyan"], - }) - } catch (err: any) { - console.log("HERE".red, err.code, err.meta, err.message) - return sendError(context, rejectionErrors.gameNotFound) - } + }, + }, }) - ).catch((err) => sendError(context, err)) + + const enemy = pinDB.game.players.find( + (enemy) => enemy.player.id !== player.id + ) + return sendResponse(context, { + message: `Player: ${player.id} joined game: ${pinDB.game.id}`, + body: { + game: pinDB.game, + pin: pinDB.pin, + player: { + id: player.id, + username: player.username ?? undefined, + isOwner: true, + }, + enemy: { + id: enemy?.player.id, + username: enemy?.player.username ?? undefined, + isOwner: false, + }, + }, + type: ["debug", "infoCyan"], + }) + } catch (err: any) { + console.log("HERE".red, err.code, err.meta, err.message) + throw sendError(context, rejectionErrors.gameNotFound) + } } diff --git a/leaky-ships/pages/api/user/auth.ts b/leaky-ships/pages/api/user/auth.ts index 0e3c4ad..85f9c64 100644 --- a/leaky-ships/pages/api/user/auth.ts +++ b/leaky-ships/pages/api/user/auth.ts @@ -19,24 +19,25 @@ export default async function auth( const context = { req, res } const type = "ACCESS" - return getTokenFromCookie(context, (refreshToken, newPlayer) => { - const next = (player: Player, tokenDB: Token, cookie?: string) => - createTokenDB(player, type, (newToken, newTokenDB) => - sendResponse(context, { - message: `Access-Token generated: ${newTokenDB.id} with Refreshtoken-Token: ${tokenDB.id}`, - body: { token: newToken.value }, - type: ["debug", "infoCyan"], - cookie, - }) - ) - if (!newPlayer) { - return checkTokenIsValid(context, refreshToken, (token) => - getTokenDB(context, token, (tokenDB) => - getPlayerByIdDB(context, tokenDB, (player) => next(player, tokenDB)) - ) - ) - } - const { player, newToken, newTokenDB } = newPlayer - return next(player, newTokenDB, newToken.value) - }).catch((err) => sendError(context, err)) + const { refreshToken, newPlayer } = await getTokenFromCookie(context) + + let player: Player, tokenDB: Token, cookie: string | undefined + + if (!newPlayer) { + const token = await checkTokenIsValid(context, refreshToken) + tokenDB = await getTokenDB(context, token) + player = await getPlayerByIdDB(context, tokenDB) + } else { + player = newPlayer.player + tokenDB = newPlayer.newTokenDB + cookie = newPlayer.newToken.value + } + + const { newToken, newTokenDB } = await createTokenDB(player, type) + return sendResponse(context, { + message: `Access-Token generated: ${newTokenDB.id} with Refreshtoken-Token: ${tokenDB.id}`, + body: { token: newToken.value }, + type: ["debug", "infoCyan"], + cookie, + }) } diff --git a/leaky-ships/pages/api/user/data.ts b/leaky-ships/pages/api/user/data.ts index e810c9e..1cdb2b1 100644 --- a/leaky-ships/pages/api/user/data.ts +++ b/leaky-ships/pages/api/user/data.ts @@ -1,4 +1,3 @@ -import sendError from "@backend/components/sendError" import sendResponse from "@backend/components/sendResponse" import getPlayer from "@lib/backend/components/getPlayer" import type { Game } from "@prisma/client" @@ -14,12 +13,11 @@ export default async function data( ) { const context = { req, res } - return getPlayer(context, (player, tokenDB) => { - const games: any = {} - sendResponse(context, { - message: `Requested data of user: ${player.id} with Access-Token: ${tokenDB.id}`, - body: { games }, - type: ["debug", "infoCyan"], - }) - }).catch((err) => sendError(context, err)) + const { player, tokenDB } = await getPlayer(context) + const games: any = {} + return sendResponse(context, { + message: `Requested data of user: ${player.id} with Access-Token: ${tokenDB.id}`, + body: { games }, + type: ["debug", "infoCyan"], + }) } diff --git a/leaky-ships/pages/api/user/login.ts b/leaky-ships/pages/api/user/login.ts index d1e1c7c..cdeba92 100644 --- a/leaky-ships/pages/api/user/login.ts +++ b/leaky-ships/pages/api/user/login.ts @@ -7,7 +7,6 @@ import sendResponse from "@backend/components/sendResponse" import logging from "@backend/logging" import { rejectionErrors } from "@lib/backend/errors" import prisma from "@lib/prisma" -import { setCookie } from "cookies-next" import jwt from "jsonwebtoken" import type { NextApiRequest, NextApiResponse } from "next" @@ -21,34 +20,29 @@ export default async function login( ) { const context = { req, res } - return preCheck(context, () => - getUserFromBody(context, (username, password) => - getPlayerByNameDB(context, username, (player) => { - checkPasswordIsValid(context, player, password, () => { - createTokenDB(player, "REFRESH", (newToken, newTokenDB) => { - sendResponse(context, { - message: - "User " + - player.id + - " logged in and generated Refresh-Token: " + - newTokenDB.id, - body: { loggedIn: true }, - type: ["debug", "infoCyan"], - cookie: newToken.value, - }) - }) - }) - }) - ) - ).catch((err) => sendError(context, err)) + await preCheck(context) + const { username, password } = await getUserFromBody(context) + const player = await getPlayerByNameDB(context, username) + await checkPasswordIsValid(context, player, password) + const { newToken, newTokenDB } = await createTokenDB(player, "REFRESH") + return sendResponse(context, { + message: + "User " + + player.id + + " logged in and generated Refresh-Token: " + + newTokenDB.id, + body: { loggedIn: true }, + type: ["debug", "infoCyan"], + cookie: newToken.value, + }) } -async function preCheck(context: API, next: () => void) { +async function preCheck(context: API) { const { req } = context const oldRefreshToken = req.cookies.token try { - if (!oldRefreshToken) return sendError(context, rejectionErrors.noCookie) + if (!oldRefreshToken) throw sendError(context, rejectionErrors.noCookie) // Check for old cookie, if unused invalidate it const tokenData = jwt.verify( oldRefreshToken, @@ -80,5 +74,5 @@ async function preCheck(context: API, next: () => void) { // err is expected if no correct cookie, just continue, otherwise it has been invalidated above } - return next() + return } diff --git a/leaky-ships/pages/api/user/loginCheck.ts b/leaky-ships/pages/api/user/loginCheck.ts index 61e082e..ebc344f 100644 --- a/leaky-ships/pages/api/user/loginCheck.ts +++ b/leaky-ships/pages/api/user/loginCheck.ts @@ -2,7 +2,6 @@ import checkTokenIsValid from "@backend/components/checkTokenIsValid" import getPlayerByIdDB from "@backend/components/getPlayerByIdDB" import getTokenDB from "@backend/components/getTokenDB" import getTokenFromCookie from "@backend/components/getTokenFromCookie" -import sendError from "@backend/components/sendError" import sendResponse from "@backend/components/sendResponse" import type { NextApiRequest, NextApiResponse } from "next" @@ -16,16 +15,12 @@ export default async function auth( ) { const context = { req, res } - getTokenFromCookie(context, (refreshToken) => { - checkTokenIsValid(context, refreshToken, (token) => { - getTokenDB(context, token, (tokenDB) => { - getPlayerByIdDB(context, tokenDB, (player) => { - sendResponse(context, { - message: "loginCheck -> true : " + player.id, - type: ["debug", "infoCyan"], - }) - }) - }) - }) - }).catch((err) => sendError(context, err)) + const { refreshToken } = await getTokenFromCookie(context) + const token = await checkTokenIsValid(context, refreshToken) + const tokenDB = await getTokenDB(context, token) + const player = await getPlayerByIdDB(context, tokenDB) + return sendResponse(context, { + message: "loginCheck -> true : " + player.id, + type: ["debug", "infoCyan"], + }) } diff --git a/leaky-ships/pages/api/user/logout.ts b/leaky-ships/pages/api/user/logout.ts index 11cde18..1924a86 100644 --- a/leaky-ships/pages/api/user/logout.ts +++ b/leaky-ships/pages/api/user/logout.ts @@ -15,21 +15,14 @@ export default async function logout( ) { const context = { req, res } - return getTokenFromCookie(context, (refreshToken) => - decodeToken(context, refreshToken, (token) => - getTokenDB( - context, - token, - (tokenDB) => { - return sendResponse(context, { - message: "User of Token " + tokenDB.id + " logged out.", - body: { loggedOut: true }, - type: ["debug", "infoCyan"], - cookie: "", - }) - }, - true - ) - ) - ).catch((err) => sendError(context, err)) + const { refreshToken } = await getTokenFromCookie(context) + const token = await decodeToken(context, refreshToken) + const tokenDB = await getTokenDB(context, token, true) + + return sendResponse(context, { + message: "User of Token " + tokenDB.id + " logged out.", + body: { loggedOut: true }, + type: ["debug", "infoCyan"], + cookie: "", + }) } diff --git a/leaky-ships/pages/api/user/register.ts b/leaky-ships/pages/api/user/register.ts index 9f0a5a7..68b5228 100644 --- a/leaky-ships/pages/api/user/register.ts +++ b/leaky-ships/pages/api/user/register.ts @@ -19,32 +19,22 @@ export default async function register( ) { const context = { req, res } - return getTokenFromCookie(context, (refreshToken) => { - checkTokenIsValid(context, refreshToken, (token) => { - getTokenDB(context, token, (tokenDB) => { - getUserFromBody(context, (username, password) => - getPlayerByIdDB(context, tokenDB, async (player) => - updatePlayerDB( - context, - player, - { - username, - email: "arst", - passwordHash: await bcrypt.hash(password, 10), - anonymous: false, - }, - (player) => { - sendResponse(context, { - message: "Player registered : " + player.id, - statusCode: 201, - body: { registered: true }, - type: ["debug", "infoCyan"], - }) - } - ) - ) - ) - }) - }) - }).catch((err) => sendError(context, err)) + const { refreshToken } = await getTokenFromCookie(context) + const token = await checkTokenIsValid(context, refreshToken) + const tokenDB = await getTokenDB(context, token) + const { username, password } = await getUserFromBody(context) + let player = await getPlayerByIdDB(context, tokenDB) + player = await updatePlayerDB(context, player, { + username, + email: "arst", + passwordHash: await bcrypt.hash(password, 10), + anonymous: false, + }) + + return sendResponse(context, { + message: "Player registered : " + player.id, + statusCode: 201, + body: { registered: true }, + type: ["debug", "infoCyan"], + }) } diff --git a/leaky-ships/pages/api/user/remove.ts b/leaky-ships/pages/api/user/remove.ts index 67caf09..21dcf81 100644 --- a/leaky-ships/pages/api/user/remove.ts +++ b/leaky-ships/pages/api/user/remove.ts @@ -16,25 +16,23 @@ export default async function remove( ) { const context = { req, res } - return getUserFromBody(context, (username, password) => - getPlayerByNameDB(context, username, (player) => { - checkPasswordIsValid(context, player, password, () => { - prisma.player.update({ - where: { - id: player.id, - }, - data: { - deleted: true, - username: null, - email: null, - passwordHash: null, - }, - }) - sendResponse(context, { - message: "User successfully deleted: " + player.id, - type: ["debug", "infoCyan"], - }) - }) - }) - ).catch((err) => sendError(context, err)) + const { username, password } = await getUserFromBody(context) + const player = await getPlayerByNameDB(context, username) + await checkPasswordIsValid(context, player, password) + prisma.player.update({ + where: { + id: player.id, + }, + data: { + deleted: true, + username: null, + email: null, + passwordHash: null, + }, + }) + + return sendResponse(context, { + message: "User successfully deleted: " + player.id, + type: ["debug", "infoCyan"], + }) } diff --git a/leaky-ships/pages/api/ws.ts b/leaky-ships/pages/api/ws.ts index 4e1b77a..3967b20 100644 --- a/leaky-ships/pages/api/ws.ts +++ b/leaky-ships/pages/api/ws.ts @@ -34,7 +34,7 @@ interface SocketData { // const authenticate = (socket, next) => { // socket.isAuthenticated = false -// next() +// // } async function checkTokenIsValid(rawToken: string) {