diff --git a/leaky-ships/lib/backend/components/createPlayerDB.ts b/leaky-ships/lib/backend/components/createPlayerDB.ts index 739d4f6..cfdc38d 100644 --- a/leaky-ships/lib/backend/components/createPlayerDB.ts +++ b/leaky-ships/lib/backend/components/createPlayerDB.ts @@ -1,32 +1,10 @@ import type { Player } from "@prisma/client" -import bcrypt from "bcrypt" import prisma from "../../prisma" import logging from "../logging" -async function createPlayerDB( - payload: - | { - username: string - password: string - } - | "anonymous", - next: (player: Player) => void -) { - let player: Player - if (payload === "anonymous") { - player = await prisma.player.create({ data: {} }) - logging("Anonymous player created: " + player.id, ["debug"]) - } else { - const { username, password } = payload - player = await prisma.player.create({ - data: { - username, - passwordHash: await bcrypt.hash(password, 10), - anonymous: false, - }, - }) - logging("Player registered: " + player.id, ["debug"]) - } +async function createPlayerDB(next: (player: Player) => void) { + const player = await prisma.player.create({ data: {} }) + logging("Anonymous player created: " + player.id, ["debug"]) return next(player) } diff --git a/leaky-ships/lib/backend/components/getTokenFromCookie.ts b/leaky-ships/lib/backend/components/getTokenFromCookie.ts index 6a11fec..325f9fd 100644 --- a/leaky-ships/lib/backend/components/getTokenFromCookie.ts +++ b/leaky-ships/lib/backend/components/getTokenFromCookie.ts @@ -11,7 +11,7 @@ async function getTokenFromCookie( // Checking for cookie presens, because it is necessary if (!value) { - return createPlayerDB("anonymous", (player) => + return createPlayerDB((player) => createTokenDB(player, type, (newToken) => next(newToken)) ) } diff --git a/leaky-ships/lib/backend/components/updatePlayerDB.ts b/leaky-ships/lib/backend/components/updatePlayerDB.ts new file mode 100644 index 0000000..fb102e4 --- /dev/null +++ b/leaky-ships/lib/backend/components/updatePlayerDB.ts @@ -0,0 +1,21 @@ +import type { Player, Prisma } from "@prisma/client" +import prisma from "../../prisma" +import sendError, { API } from "./sendError" +import { rejectionErrors } from "../errors" + +async function updatePlayerDB( + context: API, + player: Player, + data: Prisma.PlayerUpdateInput, + next: (updatedPlayer: Player) => void +) { + if (!player.anonymous) return sendError(context, rejectionErrors.registered) + const updatedPlayer = await prisma.player.update({ + where: { id: player.id }, + data, + }) + + return next(updatedPlayer) +} + +export default updatePlayerDB diff --git a/leaky-ships/pages/api/register.ts b/leaky-ships/pages/api/register.ts index 187633a..2708f47 100644 --- a/leaky-ships/pages/api/register.ts +++ b/leaky-ships/pages/api/register.ts @@ -1,9 +1,13 @@ import type { NextApiRequest, NextApiResponse } from "next" -import type { Player } from "@prisma/client" -import createPlayerDB from "../../lib/backend/components/createPlayerDB" +import bcrypt from "bcrypt" import sendError from "../../lib/backend/components/sendError" -import sendResponse, { Result } from "../../lib/backend/components/sendResponse" +import sendResponse from "../../lib/backend/components/sendResponse" import getUserFromBody from "../../lib/backend/components/getUserFromBody" +import getTokenFromCookie from "../../lib/backend/components/getTokenFromCookie" +import checkTokenIsValid from "../../lib/backend/components/checkTokenIsValid" +import getTokenDB from "../../lib/backend/components/getTokenDB" +import updatePlayerDB from "../../lib/backend/components/updatePlayerDB" +import getPlayerByIdDB from "../../lib/backend/components/getPlayerByIdDB" interface Data { registered: boolean @@ -15,19 +19,32 @@ export default async function register( ) { const context = { req, res } - return getUserFromBody(context, (username, password) => - createPlayerDB({ username, password }, (player) => { - sendResponse(context, registerResponse(player)) - }).catch((err) => sendError(context, err)) - ) -} - -function registerResponse(player: Player): Result { - // Successfull response - return { - message: "Player created : " + player.id, - statusCode: 201, - body: { registered: true }, - type: ["debug", "infoCyan"], - } + 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)) }