diff --git a/backend/api/src/Database.ts b/backend/api/src/Database.ts index 99d789d..aba63ad 100644 --- a/backend/api/src/Database.ts +++ b/backend/api/src/Database.ts @@ -2,23 +2,11 @@ import pgPromise from "pg-promise"; export abstract class Database { - static db = null; - get db() { - if (Database.db == null) { - Database.db = pgPromise({})('postgres://postgres:postgres@db:5432/rr') + private static _db = null; + static get db() { + if (Database._db == null) { + Database._db = pgPromise({})('postgres://postgres:postgres@db:5432/rr') } - return Database.db; + return Database._db; } - - static async catcher(request): Promise { - let data; - try { - data = await request(); - } catch (e) { - console.log((e as Error).message) - } - return data; - } - - } \ No newline at end of file diff --git a/backend/api/src/app.ts b/backend/api/src/app.ts index 9b08420..fddff85 100644 --- a/backend/api/src/app.ts +++ b/backend/api/src/app.ts @@ -1,12 +1,8 @@ import express from 'express'; -import {Database} from "./Database.js"; - import helmet from "helmet"; -import bodyParser from "body-parser"; import morgan from 'morgan'; -import {UserDataManager} from "./manager/UserDataManager.js"; -import {UserDataPgPromiseSerializer} from "./manager/UserDataPgPromiseSerializer.js"; -import {leaderboardRouter} from "./leaderboardRouter.js"; +import {leaderboardRoute} from "./leaderboardRoute.js"; +import {userRoute} from "./userRoute.js"; const app = express() @@ -18,31 +14,13 @@ app.use(helmet()) let morganFormatted = morgan('[:date[iso]] :method :url - :status') app.use(morganFormatted); -app.use('/leaderboard', leaderboardRouter) +app.use('/leaderboard', leaderboardRoute) +app.use('/user', userRoute) app.get('/helloworld', (req, res) => { res.json({message: "Hello World!"}) }) -app.get('/highscore', async (req, res) => { - let data = await Database.db.manyOrNone('SELECT * FROM lb_highscore;') - .catch((error) => console.log(error.message)) - res.json(data) -}) - -app.get('/user/:username', async (req, res) => { - let data = await Database.db.oneOrNone( - 'SELECT * FROM user_data WHERE username = $1;', - [req.params.username]) - .catch((error) => console.log(error.message) - ) - let userDataManager: UserDataManager = new UserDataManager(data, new UserDataPgPromiseSerializer); - res.json(userDataManager.userData); -}) - - - - 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 new file mode 100644 index 0000000..8267647 --- /dev/null +++ b/backend/api/src/leaderboardRoute.ts @@ -0,0 +1,23 @@ +import express from 'express'; +import {Database} from "./Database.js"; +import {TimeLeaderboardManager} from "./manager/TimeLeaderboardManager.js"; +import {HighscoreLeaderboardManager} from "./manager/HighscoreLeaderboardManager.js"; +import { + HighscoreLeaderboardPgPromiseSerializer +} from "./serializer/pgpromise/HighscoreLeaderboardPgPromiseSerializer.js"; +import {TimeLeaderboardPgPromiseSerializer} from "./serializer/pgpromise/TimeLeaderboardPgPromiseSerializer.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) +}) + +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) +}) \ No newline at end of file diff --git a/backend/api/src/leaderboardRouter.ts b/backend/api/src/leaderboardRouter.ts deleted file mode 100644 index d4b0deb..0000000 --- a/backend/api/src/leaderboardRouter.ts +++ /dev/null @@ -1,11 +0,0 @@ -import express from 'express'; -export const leaderboardRouter = express.Router() - - -leaderboardRouter.get('/highscore', (req, res) => { - res.send('highscore') -}) - -leaderboardRouter.get('/totalplaytime', (req, res) => { - res.send('total play time') -}) \ No newline at end of file diff --git a/backend/api/src/manager/HighscoreLeaderboardManager.ts b/backend/api/src/manager/HighscoreLeaderboardManager.ts new file mode 100644 index 0000000..c1955e7 --- /dev/null +++ b/backend/api/src/manager/HighscoreLeaderboardManager.ts @@ -0,0 +1,32 @@ +import {Leaderboard} 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 + +} \ No newline at end of file diff --git a/backend/api/src/manager/LeaderBoardSerializer.ts b/backend/api/src/manager/LeaderBoardSerializer.ts deleted file mode 100644 index 41a6a68..0000000 --- a/backend/api/src/manager/LeaderBoardSerializer.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface LeaderBoardSerializer { - -} \ No newline at end of file diff --git a/backend/api/src/manager/Manager.ts b/backend/api/src/manager/Manager.ts new file mode 100644 index 0000000..6cd27e3 --- /dev/null +++ b/backend/api/src/manager/Manager.ts @@ -0,0 +1,8 @@ +import {Serializer} from "../serializer/Serializer.js"; + +export interface Manager { + get content(), + set content(value: T), + get serializer(), + set serializer(value: Serializer), +} \ No newline at end of file diff --git a/backend/api/src/manager/TimeLeaderboardManager.ts b/backend/api/src/manager/TimeLeaderboardManager.ts new file mode 100644 index 0000000..df9ec0e --- /dev/null +++ b/backend/api/src/manager/TimeLeaderboardManager.ts @@ -0,0 +1,34 @@ +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