Improve code quality
This commit is contained in:
parent
39ddf8fde9
commit
8193b85274
26 changed files with 187 additions and 138 deletions
|
@ -4,7 +4,7 @@ import type { Socket as NetSocket } from "net"
|
||||||
import type { Server as IOServer } from "socket.io"
|
import type { Server as IOServer } from "socket.io"
|
||||||
|
|
||||||
interface SocketServer extends HTTPServer {
|
interface SocketServer extends HTTPServer {
|
||||||
io?: IOServer | undefined
|
io?: IOServer
|
||||||
}
|
}
|
||||||
|
|
||||||
interface SocketWithIO extends NetSocket {
|
interface SocketWithIO extends NetSocket {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Player } from "@prisma/client"
|
import type { Player } from "@prisma/client"
|
||||||
import bcrypt from "bcrypt"
|
import bcrypt from "bcrypt"
|
||||||
import errors from "../errors"
|
import errors from "../errors"
|
||||||
import sendError, { API } from "./sendError"
|
import sendError, { API } from "./sendError"
|
||||||
|
@ -10,7 +10,7 @@ export default async function checkPasswordIsValid(
|
||||||
next: () => void
|
next: () => void
|
||||||
) {
|
) {
|
||||||
// Validate for correct password
|
// Validate for correct password
|
||||||
const result = await bcrypt.compare(password, player.passwordHash)
|
const result = await bcrypt.compare(password, player.passwordHash ?? "")
|
||||||
if (!result) return sendError(context, errors.wrongPassword)
|
if (!result) return sendError(context, errors.wrongPassword)
|
||||||
|
|
||||||
return next()
|
return next()
|
||||||
|
|
|
@ -2,7 +2,7 @@ import jwt from "jsonwebtoken"
|
||||||
import errors from "../errors"
|
import errors from "../errors"
|
||||||
import jwtVerifyCatch from "../jwtVerifyCatch"
|
import jwtVerifyCatch from "../jwtVerifyCatch"
|
||||||
import sendError, { API } from "./sendError"
|
import sendError, { API } from "./sendError"
|
||||||
import { IdToken, RawToken } from "./createTokenDB"
|
import type { IdToken, RawToken } from "./createTokenDB"
|
||||||
|
|
||||||
async function checkTokenIsValid(
|
async function checkTokenIsValid(
|
||||||
context: API,
|
context: API,
|
||||||
|
@ -14,7 +14,7 @@ async function checkTokenIsValid(
|
||||||
// Verify the token and get the payload
|
// Verify the token and get the payload
|
||||||
let data: string | jwt.JwtPayload
|
let data: string | jwt.JwtPayload
|
||||||
try {
|
try {
|
||||||
data = jwt.verify(value, process.env.ACCESS_TOKEN_SECRET as string)
|
data = jwt.verify(value, process.env.TOKEN_SECRET as string)
|
||||||
} catch (err: any) {
|
} catch (err: any) {
|
||||||
// Deal with the problem in more detail
|
// Deal with the problem in more detail
|
||||||
return sendError(context, jwtVerifyCatch(type, err))
|
return sendError(context, jwtVerifyCatch(type, err))
|
||||||
|
|
|
@ -1,28 +0,0 @@
|
||||||
import prisma from "../../prisma"
|
|
||||||
|
|
||||||
async function createAnonymousDB<T>(payload: T) {
|
|
||||||
const player = await prisma.player.create({
|
|
||||||
data: {
|
|
||||||
anonymous: true,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
// .catch((err: any) => {
|
|
||||||
// if (err.code === 11000) {
|
|
||||||
// return Promise.reject({
|
|
||||||
// message: `Duplicate key error while creating Player in DB!`,
|
|
||||||
// statusCode: 409,
|
|
||||||
// solved: true,
|
|
||||||
// type: 'warn'
|
|
||||||
// })
|
|
||||||
// } else {
|
|
||||||
// console.log(err)
|
|
||||||
// return Promise.reject({
|
|
||||||
// message: `Unknown error while creating Player in DB.`,
|
|
||||||
// solved: false
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
// })
|
|
||||||
return { ...payload, player }
|
|
||||||
}
|
|
||||||
|
|
||||||
export default createAnonymousDB
|
|
|
@ -1,19 +1,32 @@
|
||||||
import { Player } from "@prisma/client"
|
import type { Player } from "@prisma/client"
|
||||||
import bcrypt from "bcrypt"
|
import bcrypt from "bcrypt"
|
||||||
import prisma from "../../prisma"
|
import prisma from "../../prisma"
|
||||||
|
import logging from "../logging"
|
||||||
|
|
||||||
async function createPlayerDB(
|
async function createPlayerDB(
|
||||||
username: string,
|
payload:
|
||||||
password: string,
|
| {
|
||||||
|
username: string
|
||||||
|
password: string
|
||||||
|
}
|
||||||
|
| "anonymous",
|
||||||
next: (player: Player) => void
|
next: (player: Player) => void
|
||||||
) {
|
) {
|
||||||
const player = await prisma.player.create({
|
let player: Player
|
||||||
data: {
|
if (payload === "anonymous") {
|
||||||
username,
|
player = await prisma.player.create({ data: {} })
|
||||||
passwordHash: await bcrypt.hash(password, 10),
|
logging("Anonymous player created: " + player.id, ["debug"])
|
||||||
anonymous: false,
|
} 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"])
|
||||||
|
}
|
||||||
|
|
||||||
return next(player)
|
return next(player)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Player, Token, TokenType } from "@prisma/client"
|
import type { Player, Token, TokenType } from "@prisma/client"
|
||||||
import jwt from "jsonwebtoken"
|
import jwt from "jsonwebtoken"
|
||||||
import prisma from "../../prisma"
|
import prisma from "../../prisma"
|
||||||
|
|
||||||
|
@ -41,5 +41,5 @@ export default async function createTokenDB(
|
||||||
{ expiresIn: tokenLifetime[newTokenType] }
|
{ expiresIn: tokenLifetime[newTokenType] }
|
||||||
)
|
)
|
||||||
|
|
||||||
return next({ value: newToken, type: "ACCESS" }, newTokenDB)
|
return next({ value: newToken, type: newTokenType }, newTokenDB)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Player, Token } from "@prisma/client"
|
import type { Player, Token } from "@prisma/client"
|
||||||
import errors from "../errors"
|
import errors from "../errors"
|
||||||
import prisma from "../../prisma"
|
import prisma from "../../prisma"
|
||||||
import sendError, { API } from "./sendError"
|
import sendError, { API } from "./sendError"
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Player } from "@prisma/client"
|
import type { Player } from "@prisma/client"
|
||||||
import errors from "../errors"
|
import errors from "../errors"
|
||||||
import prisma from "../../prisma"
|
import prisma from "../../prisma"
|
||||||
import sendError, { API } from "./sendError"
|
import sendError, { API } from "./sendError"
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
|
import type { Token } from "@prisma/client"
|
||||||
|
import type { IdToken } from "./createTokenDB"
|
||||||
import prisma from "../../prisma"
|
import prisma from "../../prisma"
|
||||||
import { Token } from "@prisma/client"
|
|
||||||
import errors from "../errors"
|
import errors from "../errors"
|
||||||
import sendError, { API } from "./sendError"
|
import sendError, { API } from "./sendError"
|
||||||
import { IdToken } from "./createTokenDB"
|
|
||||||
|
|
||||||
async function getTokenDB(
|
async function getTokenDB(
|
||||||
context: API,
|
context: API,
|
||||||
|
|
|
@ -1,26 +1,25 @@
|
||||||
|
import type { RawToken } from "./createTokenDB"
|
||||||
import sendError, { API } from "./sendError"
|
import sendError, { API } from "./sendError"
|
||||||
import { RawToken } from "./createTokenDB"
|
import errors from "../errors"
|
||||||
|
|
||||||
async function getTokenFromBody(
|
async function getTokenFromBody(
|
||||||
context: API,
|
context: API,
|
||||||
next: (accessToken: RawToken) => void
|
next: (accessToken: RawToken) => void
|
||||||
) {
|
) {
|
||||||
|
const type = "ACCESS"
|
||||||
const body = JSON.parse(context.req.body)
|
const body = JSON.parse(context.req.body)
|
||||||
// Checking for cookie presens, because it is necessary
|
// Checking for cookie presens, because it is necessary
|
||||||
if (
|
if (
|
||||||
typeof body !== "object" ||
|
typeof body === "object" &&
|
||||||
!body ||
|
body &&
|
||||||
!("token" in body) ||
|
"token" in body &&
|
||||||
typeof body.token !== "string"
|
typeof body.token === "string"
|
||||||
)
|
) {
|
||||||
return sendError(context, {
|
const value = body.token
|
||||||
message: "Unauthorized. No Access-Token.",
|
return next({ value, type })
|
||||||
statusCode: 401,
|
}
|
||||||
solved: true,
|
|
||||||
})
|
|
||||||
const value = body.token
|
|
||||||
|
|
||||||
return next({ value, type: "ACCESS" })
|
return sendError(context, errors.noToken(type))
|
||||||
}
|
}
|
||||||
|
|
||||||
export default getTokenFromBody
|
export default getTokenFromBody
|
||||||
|
|
|
@ -1,17 +1,21 @@
|
||||||
import errors from "../errors"
|
import createPlayerDB from "./createPlayerDB"
|
||||||
import { RawToken } from "./createTokenDB"
|
import createTokenDB, { RawToken } from "./createTokenDB"
|
||||||
import sendError, { API } from "./sendError"
|
import type { API } from "./sendError"
|
||||||
|
|
||||||
async function getTokenFromCookie(
|
async function getTokenFromCookie(
|
||||||
context: API,
|
context: API,
|
||||||
next: (refreshToken: RawToken) => void
|
next: (refreshToken: RawToken) => void
|
||||||
) {
|
) {
|
||||||
|
const type = "REFRESH"
|
||||||
const value = context.req.cookies.token
|
const value = context.req.cookies.token
|
||||||
|
|
||||||
// Checking for cookie presens, because it is necessary
|
// Checking for cookie presens, because it is necessary
|
||||||
if (!value) return sendError(context, errors.noCookie)
|
if (!value) {
|
||||||
|
return createPlayerDB("anonymous", (player) =>
|
||||||
return next({ value, type: "REFRESH" })
|
createTokenDB(player, type, (newToken) => next(newToken))
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return next({ value, type })
|
||||||
}
|
}
|
||||||
|
|
||||||
export default getTokenFromCookie
|
export default getTokenFromCookie
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
import { Token } from "@prisma/client"
|
|
||||||
import { Logging } from "../logging"
|
|
||||||
|
|
||||||
export default async function loginCheck<T>(
|
|
||||||
payload: T & { loginCheck: boolean; tokenDB: Token; tokenType: "REFRESH" }
|
|
||||||
) {
|
|
||||||
const { loginCheck, tokenDB } = payload
|
|
||||||
// True login check response
|
|
||||||
if (loginCheck) {
|
|
||||||
return Promise.resolve({
|
|
||||||
message: "loginCheck " + loginCheck + " of " + tokenDB.id,
|
|
||||||
body: { loggedIn: true },
|
|
||||||
type: ["debug", "info.cyan"] as Logging[],
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return payload
|
|
||||||
}
|
|
|
@ -1,15 +1,16 @@
|
||||||
import { NextApiRequest, NextApiResponse } from "next"
|
import type { NextApiRequest, NextApiResponse } from "next"
|
||||||
import logging from "../logging"
|
import logging from "../logging"
|
||||||
|
import type { rejectionError } from "../errors"
|
||||||
|
|
||||||
export interface API {
|
export interface API {
|
||||||
req: NextApiRequest
|
req: NextApiRequest
|
||||||
res: NextApiResponse
|
res: NextApiResponse
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function sendError(context: API, err: any) {
|
export default function sendError(context: API, err: rejectionError | Error) {
|
||||||
const { res, req } = context
|
const { res, req } = context
|
||||||
// If something went wrong, let the client know with status 500
|
// If something went wrong, let the client know with status 500
|
||||||
res.status(err.statusCode ?? 500).end()
|
res.status("statusCode" in err ? err.statusCode : 500).end()
|
||||||
logging(err.message, [err.type ?? (err.solved ? "debug" : "error")], req)
|
logging(err.message, ["solved" in err && err.solved ? "debug" : "error"], req)
|
||||||
if (err.name) console.log(err)
|
if ("name" in err) console.log(err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,21 +1,23 @@
|
||||||
import { TokenType } from "@prisma/client"
|
import type { TokenType } from "@prisma/client"
|
||||||
|
import type { rejectionError } from "./errors"
|
||||||
|
|
||||||
export default async function jwtVerifyCatch(tokenType: TokenType, err: Error) {
|
export default function jwtVerifyCatch(
|
||||||
|
tokenType: TokenType,
|
||||||
|
err: Error
|
||||||
|
): rejectionError {
|
||||||
switch (err.message) {
|
switch (err.message) {
|
||||||
case "jwt expired":
|
case "jwt expired":
|
||||||
return {
|
return {
|
||||||
message: `JWT (${tokenType}) expired!`,
|
message: `JWT (${tokenType}) expired!`,
|
||||||
statusCode: 403,
|
statusCode: 403,
|
||||||
solved: true,
|
solved: true,
|
||||||
type: "warn",
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case "invalid signature":
|
case "invalid signature":
|
||||||
return {
|
return {
|
||||||
message: `Invalid JWT (${tokenType}) signature! Token: `,
|
message: `Invalid JWT (${tokenType}) signature! Token: `,
|
||||||
statusCode: 401,
|
statusCode: 401,
|
||||||
solved: true,
|
solved: false,
|
||||||
type: "error",
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case "jwt must be provided":
|
case "jwt must be provided":
|
||||||
|
@ -23,11 +25,14 @@ export default async function jwtVerifyCatch(tokenType: TokenType, err: Error) {
|
||||||
message: `No JWT (${tokenType}) given.`,
|
message: `No JWT (${tokenType}) given.`,
|
||||||
statusCode: 401,
|
statusCode: 401,
|
||||||
solved: true,
|
solved: true,
|
||||||
type: "warn",
|
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
console.log(err)
|
console.log(err)
|
||||||
return { message: `Unknown error on 'JWT.verify()'.`, solved: false }
|
return {
|
||||||
|
statusCode: 500,
|
||||||
|
message: `Unknown error on 'JWT.verify()'.`,
|
||||||
|
solved: false,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { useCallback, useEffect, useMemo, useReducer, useState } from "react"
|
import { useCallback, useEffect, useReducer, useState } from "react"
|
||||||
import {
|
import {
|
||||||
hitReducer,
|
hitReducer,
|
||||||
initlialLastLeftTile,
|
initlialLastLeftTile,
|
||||||
|
@ -13,7 +13,7 @@ import {
|
||||||
Target,
|
Target,
|
||||||
Position,
|
Position,
|
||||||
} from "../../interfaces/frontend"
|
} from "../../interfaces/frontend"
|
||||||
import { PointerProps } from "../../components/Gamefield/GamefieldPointer"
|
import type { PointerProps } from "../../components/Gamefield/GamefieldPointer"
|
||||||
|
|
||||||
const modes: Mode[] = [
|
const modes: Mode[] = [
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Hit, HitDispatch } from "../../interfaces/frontend"
|
import type { Hit, HitDispatch } from "../../interfaces/frontend"
|
||||||
|
|
||||||
export function borderCN(count: number, x: number, y: number) {
|
export function borderCN(count: number, x: number, y: number) {
|
||||||
if (x === 0) return "left"
|
if (x === 0) return "left"
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
import { NextApiRequest, NextApiResponse } from "next"
|
import type { NextApiRequest, NextApiResponse } from "next"
|
||||||
import { Logging } from "../../lib/backend/logging"
|
import type { Token } from "@prisma/client"
|
||||||
import { Token } from "@prisma/client"
|
|
||||||
import sendError from "../../lib/backend/components/sendError"
|
import sendError from "../../lib/backend/components/sendError"
|
||||||
import getTokenFromCookie from "../../lib/backend/components/getTokenFromCookie"
|
import getTokenFromCookie from "../../lib/backend/components/getTokenFromCookie"
|
||||||
import checkTokenIsValid from "../../lib/backend/components/checkTokenIsValid"
|
import checkTokenIsValid from "../../lib/backend/components/checkTokenIsValid"
|
||||||
|
@ -9,7 +8,7 @@ import getPlayerByIdDB from "../../lib/backend/components/getPlayerByIdDB"
|
||||||
import createTokenDB, {
|
import createTokenDB, {
|
||||||
RawToken,
|
RawToken,
|
||||||
} from "../../lib/backend/components/createTokenDB"
|
} from "../../lib/backend/components/createTokenDB"
|
||||||
import sendResponse from "../../lib/backend/components/sendResponse"
|
import sendResponse, { Result } from "../../lib/backend/components/sendResponse"
|
||||||
|
|
||||||
interface Data {
|
interface Data {
|
||||||
token: string
|
token: string
|
||||||
|
@ -20,12 +19,13 @@ export default async function auth(
|
||||||
res: NextApiResponse<Data>
|
res: NextApiResponse<Data>
|
||||||
) {
|
) {
|
||||||
const context = { req, res }
|
const context = { req, res }
|
||||||
|
const type = "ACCESS"
|
||||||
|
|
||||||
getTokenFromCookie(context, (refreshToken) => {
|
getTokenFromCookie(context, (refreshToken) => {
|
||||||
checkTokenIsValid(context, refreshToken, (token) => {
|
checkTokenIsValid(context, refreshToken, (token) => {
|
||||||
getTokenDB(context, token, (tokenDB) => {
|
getTokenDB(context, token, (tokenDB) => {
|
||||||
getPlayerByIdDB(context, tokenDB, (player) => {
|
getPlayerByIdDB(context, tokenDB, (player) => {
|
||||||
createTokenDB(player, "ACCESS", (newToken, newTokenDB) => {
|
createTokenDB(player, type, (newToken, newTokenDB) => {
|
||||||
sendResponse(context, authResponse(newToken, newTokenDB, tokenDB))
|
sendResponse(context, authResponse(newToken, newTokenDB, tokenDB))
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -34,11 +34,15 @@ export default async function auth(
|
||||||
}).catch((err) => sendError(context, err))
|
}).catch((err) => sendError(context, err))
|
||||||
}
|
}
|
||||||
|
|
||||||
function authResponse(newToken: RawToken, newTokenDB: Token, tokenDB: Token) {
|
function authResponse(
|
||||||
|
newToken: RawToken,
|
||||||
|
newTokenDB: Token,
|
||||||
|
tokenDB: Token
|
||||||
|
): Result<Data> {
|
||||||
// Successfull response
|
// Successfull response
|
||||||
return {
|
return {
|
||||||
message: `Access-Token generated: ${newTokenDB.id} with Refreshtoken-Token: ${tokenDB.id}`,
|
message: `Access-Token generated: ${newTokenDB.id} with Refreshtoken-Token: ${tokenDB.id}`,
|
||||||
body: { token: newToken.value },
|
body: { token: newToken.value },
|
||||||
type: ["debug", "info.cyan"] as Logging[],
|
type: ["debug", "infoCyan"],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,11 @@
|
||||||
import { NextApiRequest, NextApiResponse } from "next"
|
import type { NextApiRequest, NextApiResponse } from "next"
|
||||||
|
import type { Game, Player, Token } from "@prisma/client"
|
||||||
import getTokenFromBody from "../../lib/backend/components/getTokenFromBody"
|
import getTokenFromBody from "../../lib/backend/components/getTokenFromBody"
|
||||||
import checkTokenIsValid from "../../lib/backend/components/checkTokenIsValid"
|
import checkTokenIsValid from "../../lib/backend/components/checkTokenIsValid"
|
||||||
import getTokenDB from "../../lib/backend/components/getTokenDB"
|
import getTokenDB from "../../lib/backend/components/getTokenDB"
|
||||||
import getPlayerByIdDB from "../../lib/backend/components/getPlayerByIdDB"
|
import getPlayerByIdDB from "../../lib/backend/components/getPlayerByIdDB"
|
||||||
import sendResponse from "../../lib/backend/components/sendResponse"
|
import sendResponse, { Result } from "../../lib/backend/components/sendResponse"
|
||||||
import sendError from "../../lib/backend/components/sendError"
|
import sendError from "../../lib/backend/components/sendError"
|
||||||
import { Logging } from "../../lib/backend/logging"
|
|
||||||
import { Game, Player, Token } from "@prisma/client"
|
|
||||||
|
|
||||||
interface Data {
|
interface Data {
|
||||||
games: Game[]
|
games: Game[]
|
||||||
|
@ -29,12 +28,12 @@ export default async function data(
|
||||||
}).catch((err) => sendError(context, err))
|
}).catch((err) => sendError(context, err))
|
||||||
}
|
}
|
||||||
|
|
||||||
function dataResponse<T>(player: Player, tokenDB: Token) {
|
function dataResponse(player: Player, tokenDB: Token): Result<Data> {
|
||||||
const games: any = {}
|
const games: any = {}
|
||||||
// Successfull response
|
// Successfull response
|
||||||
return {
|
return {
|
||||||
message: `Requested data of user: ${player.id} with Access-Token: ${tokenDB.id}`,
|
message: `Requested data of user: ${player.id} with Access-Token: ${tokenDB.id}`,
|
||||||
body: { games },
|
body: { games },
|
||||||
type: ["debug", "info.cyan"] as Logging[],
|
type: ["debug", "infoCyan"],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,14 +1,13 @@
|
||||||
import { NextApiRequest, NextApiResponse } from "next"
|
import type { NextApiRequest, NextApiResponse } from "next"
|
||||||
import logging, { Logging } from "../../lib/backend/logging"
|
import type { Player, Token } from "@prisma/client"
|
||||||
|
import logging from "../../lib/backend/logging"
|
||||||
import getPlayerByNameDB from "../../lib/backend/components/getPlayerByNameDB"
|
import getPlayerByNameDB from "../../lib/backend/components/getPlayerByNameDB"
|
||||||
import checkPasswordIsValid from "../../lib/backend/components/checkPasswordIsValid"
|
import checkPasswordIsValid from "../../lib/backend/components/checkPasswordIsValid"
|
||||||
import createTokenDB, {
|
import createTokenDB, {
|
||||||
IdToken,
|
|
||||||
RawToken,
|
RawToken,
|
||||||
} from "../../lib/backend/components/createTokenDB"
|
} from "../../lib/backend/components/createTokenDB"
|
||||||
import sendResponse from "../../lib/backend/components/sendResponse"
|
import sendResponse, { Result } from "../../lib/backend/components/sendResponse"
|
||||||
import { setCookie } from "cookies-next"
|
import { setCookie } from "cookies-next"
|
||||||
import { Player, Token } from "@prisma/client"
|
|
||||||
import prisma from "../../lib/prisma"
|
import prisma from "../../lib/prisma"
|
||||||
import jwt from "jsonwebtoken"
|
import jwt from "jsonwebtoken"
|
||||||
import errors from "../../lib/backend/errors"
|
import errors from "../../lib/backend/errors"
|
||||||
|
@ -50,7 +49,7 @@ async function preCheck(context: API, next: () => void) {
|
||||||
// Check for old cookie, if unused invalidate it
|
// Check for old cookie, if unused invalidate it
|
||||||
const tokenData = jwt.verify(
|
const tokenData = jwt.verify(
|
||||||
oldRefreshToken,
|
oldRefreshToken,
|
||||||
process.env.ACCESS_TOKEN_SECRET as string
|
process.env.TOKEN_SECRET as string
|
||||||
)
|
)
|
||||||
|
|
||||||
if (!tokenData || typeof tokenData === "string") return
|
if (!tokenData || typeof tokenData === "string") return
|
||||||
|
@ -86,7 +85,7 @@ function loginResponse(
|
||||||
player: Player,
|
player: Player,
|
||||||
newToken: RawToken,
|
newToken: RawToken,
|
||||||
newTokenDB: Token
|
newTokenDB: Token
|
||||||
) {
|
): Result<Data> {
|
||||||
const { req, res } = context
|
const { req, res } = context
|
||||||
// const { player, req, res } = payload
|
// const { player, req, res } = payload
|
||||||
const { value } = newToken
|
const { value } = newToken
|
||||||
|
@ -110,6 +109,6 @@ function loginResponse(
|
||||||
" logged in and generated Refresh-Token: " +
|
" logged in and generated Refresh-Token: " +
|
||||||
newTokenDB.id,
|
newTokenDB.id,
|
||||||
body: { loggedIn: true },
|
body: { loggedIn: true },
|
||||||
type: ["debug", "info.cyan"] as Logging[],
|
type: ["debug", "infoCyan"],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
31
leaky-ships/pages/api/loginCheck.ts
Normal file
31
leaky-ships/pages/api/loginCheck.ts
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
import type { NextApiRequest, NextApiResponse } from "next"
|
||||||
|
import sendError from "../../lib/backend/components/sendError"
|
||||||
|
import getTokenFromCookie from "../../lib/backend/components/getTokenFromCookie"
|
||||||
|
import checkTokenIsValid from "../../lib/backend/components/checkTokenIsValid"
|
||||||
|
import getTokenDB from "../../lib/backend/components/getTokenDB"
|
||||||
|
import getPlayerByIdDB from "../../lib/backend/components/getPlayerByIdDB"
|
||||||
|
import sendResponse from "../../lib/backend/components/sendResponse"
|
||||||
|
|
||||||
|
interface Data {
|
||||||
|
token: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export default async function auth(
|
||||||
|
req: NextApiRequest,
|
||||||
|
res: NextApiResponse<Data>
|
||||||
|
) {
|
||||||
|
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))
|
||||||
|
}
|
|
@ -1,12 +1,11 @@
|
||||||
import { NextApiRequest, NextApiResponse } from "next"
|
import type { NextApiRequest, NextApiResponse } from "next"
|
||||||
|
import type { Token } from "@prisma/client"
|
||||||
import checkTokenIsValid from "../../lib/backend/components/checkTokenIsValid"
|
import checkTokenIsValid from "../../lib/backend/components/checkTokenIsValid"
|
||||||
import sendResponse from "../../lib/backend/components/sendResponse"
|
import sendResponse, { Result } from "../../lib/backend/components/sendResponse"
|
||||||
import sendError from "../../lib/backend/components/sendError"
|
import sendError from "../../lib/backend/components/sendError"
|
||||||
import { deleteCookie } from "cookies-next"
|
import { deleteCookie } from "cookies-next"
|
||||||
import { Token } from "@prisma/client"
|
|
||||||
import getTokenDB from "../../lib/backend/components/getTokenDB"
|
import getTokenDB from "../../lib/backend/components/getTokenDB"
|
||||||
import getTokenFromCookie from "../../lib/backend/components/getTokenFromCookie"
|
import getTokenFromCookie from "../../lib/backend/components/getTokenFromCookie"
|
||||||
import { Logging } from "../../lib/backend/logging"
|
|
||||||
|
|
||||||
interface Data {
|
interface Data {
|
||||||
loggedOut: boolean
|
loggedOut: boolean
|
||||||
|
@ -31,7 +30,7 @@ function logoutResponse<T>(
|
||||||
tokenDB: Token,
|
tokenDB: Token,
|
||||||
req: NextApiRequest,
|
req: NextApiRequest,
|
||||||
res: NextApiResponse<T>
|
res: NextApiResponse<T>
|
||||||
) {
|
): Result<Data> {
|
||||||
// Set login cookie
|
// Set login cookie
|
||||||
deleteCookie("token", { req, res })
|
deleteCookie("token", { req, res })
|
||||||
|
|
||||||
|
@ -39,6 +38,6 @@ function logoutResponse<T>(
|
||||||
return {
|
return {
|
||||||
message: "User of Token " + tokenDB.id + " logged out.",
|
message: "User of Token " + tokenDB.id + " logged out.",
|
||||||
body: { loggedOut: true },
|
body: { loggedOut: true },
|
||||||
type: ["debug", "info.cyan"] as Logging[],
|
type: ["debug", "infoCyan"],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
import { NextApiRequest, NextApiResponse } from "next"
|
import type { NextApiRequest, NextApiResponse } from "next"
|
||||||
|
import type { Player } from "@prisma/client"
|
||||||
import createPlayerDB from "../../lib/backend/components/createPlayerDB"
|
import createPlayerDB from "../../lib/backend/components/createPlayerDB"
|
||||||
import sendError from "../../lib/backend/components/sendError"
|
import sendError from "../../lib/backend/components/sendError"
|
||||||
import sendResponse from "../../lib/backend/components/sendResponse"
|
import sendResponse, { Result } from "../../lib/backend/components/sendResponse"
|
||||||
import { Logging } from "../../lib/backend/logging"
|
|
||||||
import { Player } from "@prisma/client"
|
|
||||||
import getUserFromBody from "../../lib/backend/components/getUserFromBody"
|
import getUserFromBody from "../../lib/backend/components/getUserFromBody"
|
||||||
|
|
||||||
interface Data {
|
interface Data {
|
||||||
|
@ -17,18 +16,18 @@ export default async function register(
|
||||||
const context = { req, res }
|
const context = { req, res }
|
||||||
|
|
||||||
return getUserFromBody(context, (username, password) =>
|
return getUserFromBody(context, (username, password) =>
|
||||||
createPlayerDB(username, password, (player) => {
|
createPlayerDB({ username, password }, (player) => {
|
||||||
sendResponse(context, registerResponse(player))
|
sendResponse(context, registerResponse(player))
|
||||||
}).catch((err) => sendError(context, err))
|
}).catch((err) => sendError(context, err))
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
function registerResponse<T>(player: Player) {
|
function registerResponse(player: Player): Result<Data> {
|
||||||
// Successfull response
|
// Successfull response
|
||||||
return {
|
return {
|
||||||
message: "Player created : " + player.id,
|
message: "Player created : " + player.id,
|
||||||
statusCode: 201,
|
statusCode: 201,
|
||||||
body: { registered: true },
|
body: { registered: true },
|
||||||
type: ["debug", "info.cyan"] as Logging[],
|
type: ["debug", "infoCyan"],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
40
leaky-ships/pages/api/remove.ts
Normal file
40
leaky-ships/pages/api/remove.ts
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
import { NextApiRequest, NextApiResponse } from "next"
|
||||||
|
import getPlayerByNameDB from "../../lib/backend/components/getPlayerByNameDB"
|
||||||
|
import checkPasswordIsValid from "../../lib/backend/components/checkPasswordIsValid"
|
||||||
|
import sendResponse from "../../lib/backend/components/sendResponse"
|
||||||
|
import prisma from "../../lib/prisma"
|
||||||
|
import sendError from "../../lib/backend/components/sendError"
|
||||||
|
import getUserFromBody from "../../lib/backend/components/getUserFromBody"
|
||||||
|
|
||||||
|
interface Data {
|
||||||
|
loggedIn: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
export default async function remove(
|
||||||
|
req: NextApiRequest,
|
||||||
|
res: NextApiResponse<Data>
|
||||||
|
) {
|
||||||
|
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))
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
import type { NextApiRequest } from "next"
|
import type { NextApiRequest } from "next"
|
||||||
|
import type { NextApiResponseWithSocket } from "../../interfaces/NextApiSocket"
|
||||||
import { Server } from "socket.io"
|
import { Server } from "socket.io"
|
||||||
import { NextApiResponseWithSocket } from "../../interfaces/NextApiSocket"
|
|
||||||
import jwt from "jsonwebtoken"
|
import jwt from "jsonwebtoken"
|
||||||
import prisma from "../../lib/prisma"
|
import prisma from "../../lib/prisma"
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ async function checkTokenIsValid(rawToken: string) {
|
||||||
// Verify the token and get the payload
|
// Verify the token and get the payload
|
||||||
let tokenData: string | jwt.JwtPayload
|
let tokenData: string | jwt.JwtPayload
|
||||||
try {
|
try {
|
||||||
tokenData = jwt.verify(rawToken, process.env.ACCESS_TOKEN_SECRET as string)
|
tokenData = jwt.verify(rawToken, process.env.TOKEN_SECRET as string)
|
||||||
} catch (err: any) {
|
} catch (err: any) {
|
||||||
// Deal with the problem in more detail
|
// Deal with the problem in more detail
|
||||||
return Promise.reject()
|
return Promise.reject()
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { ChangeEventHandler, useEffect, useState } from "react"
|
import { ChangeEventHandler, useEffect, useState } from "react"
|
||||||
import { io, Socket } from "socket.io-client"
|
import { io, Socket } from "socket.io-client"
|
||||||
import getAccessToken from "../../lib/frontend/getAccessToken"
|
import getAccessToken from "../../lib/frontend/getAccessToken"
|
||||||
import { ClientToServerEvents, ServerToClientEvents } from "../api/ws"
|
import type { ClientToServerEvents, ServerToClientEvents } from "../api/ws"
|
||||||
let socket: Socket<ServerToClientEvents, ClientToServerEvents>
|
let socket: Socket<ServerToClientEvents, ClientToServerEvents>
|
||||||
|
|
||||||
const Home = () => {
|
const Home = () => {
|
||||||
|
|
|
@ -11,10 +11,11 @@ model Player {
|
||||||
id String @id @default(cuid())
|
id String @id @default(cuid())
|
||||||
createdAt DateTime @default(now())
|
createdAt DateTime @default(now())
|
||||||
updatedAt DateTime @updatedAt
|
updatedAt DateTime @updatedAt
|
||||||
|
deleted Boolean @default(false)
|
||||||
anonymous Boolean @default(true)
|
anonymous Boolean @default(true)
|
||||||
username String? @unique
|
username String? @unique
|
||||||
email String? @unique
|
email String? @unique
|
||||||
passwordHash String @default("")
|
passwordHash String? @unique
|
||||||
tokens Token[]
|
tokens Token[]
|
||||||
games Player_Game[]
|
games Player_Game[]
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue