From fff55edf7944f4badca3e0c26b778114fef3e8fb Mon Sep 17 00:00:00 2001 From: j-weissen Date: Wed, 28 Dec 2022 15:39:58 +0100 Subject: [PATCH] overhauled structure, leaderboardRoute.ts and userRoute.ts working --- backend/api/package-lock.json | 46 +++++++++- backend/api/package.json | 2 +- backend/api/src/app.ts | 8 ++ backend/api/src/leaderboardRoute.ts | 32 ++++--- .../manager/HighscoreLeaderboardManager.ts | 32 +------ backend/api/src/manager/Manager.ts | 11 ++- .../api/src/manager/TimeLeaderboardManager.ts | 34 +------- backend/api/src/manager/UserManager.ts | 10 +++ backend/api/src/manager/UserScoresManager.ts | 33 +------ .../HighscoreLeaderboardPgPromiseManager.ts | 29 +++++++ .../TimeLeaderboardPgPromiseManager.ts | 29 +++++++ .../manager/pgPromise/UserPgPromiseManager.ts | 53 +++++++++++ .../pgPromise/UserScoresPgPromiseManager.ts | 27 ++++++ backend/api/src/model/Leaderboard.ts | 5 +- backend/api/src/model/User.ts | 4 + backend/api/src/model/UserScores.ts | 6 +- .../HighscoreLeaderboardSerializer.ts | 4 - backend/api/src/serializer/Serializer.ts | 4 - .../serializer/TimeLeaderboardSerializer.ts | 5 -- .../src/serializer/UserScoresSerializer.ts | 4 - ...HighscoreLeaderboardPgPromiseSerializer.ts | 20 ----- .../TimeLeaderboardPgPromiseSerializer.ts | 20 ----- .../UserScoresPgPromiseSerializer.ts | 20 ----- backend/api/src/userRoute.ts | 87 ++++++++++++++----- backend/db/initScripts/_createSchema.sql | 2 +- 25 files changed, 315 insertions(+), 212 deletions(-) create mode 100644 backend/api/src/manager/UserManager.ts create mode 100644 backend/api/src/manager/pgPromise/HighscoreLeaderboardPgPromiseManager.ts create mode 100644 backend/api/src/manager/pgPromise/TimeLeaderboardPgPromiseManager.ts create mode 100644 backend/api/src/manager/pgPromise/UserPgPromiseManager.ts create mode 100644 backend/api/src/manager/pgPromise/UserScoresPgPromiseManager.ts create mode 100644 backend/api/src/model/User.ts delete mode 100644 backend/api/src/serializer/HighscoreLeaderboardSerializer.ts delete mode 100644 backend/api/src/serializer/Serializer.ts delete mode 100644 backend/api/src/serializer/TimeLeaderboardSerializer.ts delete mode 100644 backend/api/src/serializer/UserScoresSerializer.ts delete mode 100644 backend/api/src/serializer/pgpromise/HighscoreLeaderboardPgPromiseSerializer.ts delete mode 100644 backend/api/src/serializer/pgpromise/TimeLeaderboardPgPromiseSerializer.ts delete mode 100644 backend/api/src/serializer/pgpromise/UserScoresPgPromiseSerializer.ts diff --git a/backend/api/package-lock.json b/backend/api/package-lock.json index 2cf000a..d786a7e 100644 --- a/backend/api/package-lock.json +++ b/backend/api/package-lock.json @@ -9,8 +9,8 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "body-parser": "^1.20.1", "express": "^4.18.2", + "express-validator": "^6.14.2", "helmet": "^6.0.1", "morgan": "^1.10.0", "pg-promise": "^10.15.4", @@ -413,6 +413,18 @@ "node": ">= 0.10.0" } }, + "node_modules/express-validator": { + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/express-validator/-/express-validator-6.14.2.tgz", + "integrity": "sha512-8XfAUrQ6Y7dIIuy9KcUPCfG/uCbvREctrxf5EeeME+ulanJ4iiW71lWmm9r4YcKKYOCBMan0WpVg7FtHu4Z4Wg==", + "dependencies": { + "lodash": "^4.17.21", + "validator": "^13.7.0" + }, + "engines": { + "node": ">= 8.0.0" + } + }, "node_modules/finalhandler": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", @@ -533,6 +545,11 @@ "node": ">= 0.10" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -1055,6 +1072,14 @@ "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" }, + "node_modules/validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -1408,6 +1433,15 @@ "vary": "~1.1.2" } }, + "express-validator": { + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/express-validator/-/express-validator-6.14.2.tgz", + "integrity": "sha512-8XfAUrQ6Y7dIIuy9KcUPCfG/uCbvREctrxf5EeeME+ulanJ4iiW71lWmm9r4YcKKYOCBMan0WpVg7FtHu4Z4Wg==", + "requires": { + "lodash": "^4.17.21", + "validator": "^13.7.0" + } + }, "finalhandler": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", @@ -1495,6 +1529,11 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, "make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -1857,6 +1896,11 @@ "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" }, + "validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", diff --git a/backend/api/package.json b/backend/api/package.json index 46e3922..e553c95 100644 --- a/backend/api/package.json +++ b/backend/api/package.json @@ -11,8 +11,8 @@ "author": "jweissen", "license": "ISC", "dependencies": { - "body-parser": "^1.20.1", "express": "^4.18.2", + "express-validator": "^6.14.2", "helmet": "^6.0.1", "morgan": "^1.10.0", "pg-promise": "^10.15.4", diff --git a/backend/api/src/app.ts b/backend/api/src/app.ts index fddff85..ae7a775 100644 --- a/backend/api/src/app.ts +++ b/backend/api/src/app.ts @@ -10,10 +10,14 @@ const port = 3000 app.use(helmet()) + // configure & use logger let morganFormatted = morgan('[:date[iso]] :method :url - :status') app.use(morganFormatted); + +app.use(express.json()) + app.use('/leaderboard', leaderboardRoute) app.use('/user', userRoute) @@ -21,6 +25,10 @@ app.get('/helloworld', (req, res) => { res.json({message: "Hello World!"}) }) +app.post('/echo', async (req, res) => { + res.json(req.body) +}) + app.listen(port, () => { console.log(`Server started at http://localhost:3000`); diff --git a/backend/api/src/leaderboardRoute.ts b/backend/api/src/leaderboardRoute.ts index 8267647..aaa0da9 100644 --- a/backend/api/src/leaderboardRoute.ts +++ b/backend/api/src/leaderboardRoute.ts @@ -1,23 +1,33 @@ import express from 'express'; -import {Database} from "./Database.js"; import {TimeLeaderboardManager} from "./manager/TimeLeaderboardManager.js"; +import {TimeLeaderboardPgPromiseManager} from "./manager/pgPromise/TimeLeaderboardPgPromiseManager.js"; +import {HighscoreLeaderboardPgPromiseManager} from "./manager/pgPromise/HighscoreLeaderboardPgPromiseManager.js"; import {HighscoreLeaderboardManager} from "./manager/HighscoreLeaderboardManager.js"; -import { - HighscoreLeaderboardPgPromiseSerializer -} from "./serializer/pgpromise/HighscoreLeaderboardPgPromiseSerializer.js"; -import {TimeLeaderboardPgPromiseSerializer} from "./serializer/pgpromise/TimeLeaderboardPgPromiseSerializer.js"; +import {HighscoreLeaderboard, TimeLeaderboard} from "./model/Leaderboard.js"; export const leaderboardRoute = express.Router() leaderboardRoute.get('/highscore', async (req, res) => { - let data = await Database.db.manyOrNone('SELECT * FROM lb_highscore INNER JOIN "user" ON user_id = id ORDER BY RANK;') - const leaderboardManager = new HighscoreLeaderboardManager(data, new HighscoreLeaderboardPgPromiseSerializer); - res.send(leaderboardManager.content) + try { + const highscoreLeaderboardManager: HighscoreLeaderboardManager = new HighscoreLeaderboardPgPromiseManager; + const highscoreLeaderboard: HighscoreLeaderboard = await highscoreLeaderboardManager.getAll(); + res.send(highscoreLeaderboard); + } catch (error) { + // handle errors + console.log(error) + res.status(500).json({ errors: [{msg: "Internal server error"}]}) + } }) leaderboardRoute.get('/totalplaytime', async (req, res) => { - let data = await Database.db.manyOrNone('SELECT * FROM lb_total_playtime INNER JOIN "user" ON user_id = id ORDER BY RANK;') - const leaderboardManager = new TimeLeaderboardManager(data, new TimeLeaderboardPgPromiseSerializer); - res.send(leaderboardManager.content) + try { + const timeLeaderboardManager: TimeLeaderboardManager = new TimeLeaderboardPgPromiseManager; + const timeLeaderboard: TimeLeaderboard = await timeLeaderboardManager.getAll(); + res.send(timeLeaderboard); + } catch (error) { + // handle errors + console.log(error) + res.status(500).json({ errors: [{msg: "Internal server error"}]}) + } }) \ No newline at end of file diff --git a/backend/api/src/manager/HighscoreLeaderboardManager.ts b/backend/api/src/manager/HighscoreLeaderboardManager.ts index c1955e7..995fc00 100644 --- a/backend/api/src/manager/HighscoreLeaderboardManager.ts +++ b/backend/api/src/manager/HighscoreLeaderboardManager.ts @@ -1,32 +1,6 @@ -import {Leaderboard} from "../model/Leaderboard.js"; +import {HighscoreLeaderboard} from "../model/Leaderboard.js"; import {Manager} from "./Manager.js"; -import {HighscoreLeaderboardSerializer} from "../serializer/HighscoreLeaderboardSerializer.js"; - -export class HighscoreLeaderboardManager implements Manager>{ - private _content: Leaderboard; - private _serializer: HighscoreLeaderboardSerializer; - - constructor(rawData: any, serializer: HighscoreLeaderboardSerializer) { - this.serializer = serializer; - this._content = this.serializer.serialize(rawData); - } - - //region getter&setter - get content() { - return this._content; - } - - set content(value: Leaderboard) { - this._content = value; - } - - get serializer() { - return this._serializer; - } - - set serializer(value: HighscoreLeaderboardSerializer) { - this._serializer = value; - } - //endregion +export abstract class HighscoreLeaderboardManager extends Manager{ + abstract getAll(): Promise; } \ No newline at end of file diff --git a/backend/api/src/manager/Manager.ts b/backend/api/src/manager/Manager.ts index 6cd27e3..1538078 100644 --- a/backend/api/src/manager/Manager.ts +++ b/backend/api/src/manager/Manager.ts @@ -1,8 +1,7 @@ -import {Serializer} from "../serializer/Serializer.js"; +export abstract class Manager { + //region getter&setter + protected abstract serialize(raw: any): T; -export interface Manager { - get content(), - set content(value: T), - get serializer(), - set serializer(value: Serializer), + protected abstract deserialize(parsed: T): any; + //endregion } \ No newline at end of file diff --git a/backend/api/src/manager/TimeLeaderboardManager.ts b/backend/api/src/manager/TimeLeaderboardManager.ts index df9ec0e..6b6f0b2 100644 --- a/backend/api/src/manager/TimeLeaderboardManager.ts +++ b/backend/api/src/manager/TimeLeaderboardManager.ts @@ -1,34 +1,6 @@ import {Manager} from "./Manager.js"; -import {Leaderboard} from "../model/Leaderboard.js"; -import {Time} from "../model/Time.js"; -import {TimeLeaderboardSerializer} from "../serializer/TimeLeaderboardSerializer.js"; -import {TimeLeaderboardPgPromiseSerializer} from "../serializer/pgpromise/TimeLeaderboardPgPromiseSerializer.js"; - -export class TimeLeaderboardManager implements Manager> { - private _content: Leaderboard