added Model classes

This commit is contained in:
j-weissen 2022-12-12 11:35:53 +01:00
parent fd257b335c
commit 6e8e0e0101
14 changed files with 145 additions and 33 deletions

View file

@ -24,4 +24,18 @@ erDiagram
int average_score
int games_played
}
```
lb_highscore {
int rank
string username
int highscore
}
lb_total_playtime {
int rank
string username
time total_playtime
}
```
## API Endpoints

View file

@ -0,0 +1,2 @@
build/
node_modules/

View file

@ -0,0 +1,24 @@
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')
}
return Database.db;
}
static async catcher(request): Promise<any> {
let data;
try {
data = await request();
} catch (e) {
console.log((e as Error).message)
}
return data;
}
}

View file

@ -1,9 +1,13 @@
import express from 'express';
import {Database} from "./Database.js";
import pgPromise from "pg-promise";
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";
const app = express()
const port = 3000
@ -14,30 +18,31 @@ app.use(helmet())
let morganFormatted = morgan('[:date[iso]] :method :url - :status')
app.use(morganFormatted);
// init database connection
const pgp = pgPromise({});
const db = pgp('postgres://postgres:postgres@db:5432/rr')
app.use('/leaderboard', leaderboardRouter)
app.get('/helloworld', (req, res) => {
res.json({message: "Hello World!"})
})
app.get('/highscore', async (req, res) => {
let data = await dbQueryCatcher(async () =>
await db.manyOrNone('SELECT * FROM lb_highscore;')
)
let data = await Database.db.manyOrNone('SELECT * FROM lb_highscore;')
.catch((error) => console.log(error.message))
res.json(data)
})
async function dbQueryCatcher(request): Promise<any> {
let data;
try {
data = await request();
} catch (e) {
console.log((e as Error).message)
}
return 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`);

View file

@ -1,16 +0,0 @@
import * as express from 'express';
import * as bodyParser from "body-parser";
let router = express.Router();
router.use(bodyParser.json())
router.get('/helloworld', (req, res) => {
res.json({message: "Hello World!"})
})
router.post('/echo', (req, res) => {
res.json(req.body)
})
module.exports = router

View file

@ -0,0 +1,11 @@
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')
})

View file

@ -0,0 +1,3 @@
export interface LeaderBoardSerializer {
}

View file

@ -0,0 +1,20 @@
import {UserData} from "../model/UserData.js";
import {UserDataSerializer} from "./UserDataSerializer.js";
export class UserDataManager {
private _userData: UserData;
private serializer: UserDataSerializer;
constructor(data: any, serializer: UserDataSerializer) {
this.serializer = serializer;
this._userData = this.serializer.serialize(data);
}
get userData(): UserData {
return this._userData;
}
set userData(value: UserData) {
this._userData = value;
}
}

View file

@ -0,0 +1,19 @@
import {UserData} from "../model/UserData.js";
import {UserDataSerializer} from "./UserDataSerializer.js";
export class UserDataPgPromiseSerializer implements UserDataSerializer {
deserialize(userData: UserData): any {
throw new Error("Method not implemented")
}
serialize(data: any): UserData {
return {
username: data.username,
highscore: data.highscore,
totalScore: data.total_score,
totalPlaytime: data.total_playtime,
averageScore: data.averageScore,
gamesPlayed: data.games_played,
}
}
}

View file

@ -0,0 +1,6 @@
import {UserData} from "../model/UserData.js";
export interface UserDataSerializer {
serialize(data: any): UserData,
deserialize(userData: UserData): any,
}

View file

@ -0,0 +1,5 @@
import {LeaderboardEntry} from "./LeaderboardEntry.js";
export class Leaderboard<T> {
content: LeaderboardEntry<T>[];
}

View file

@ -0,0 +1,5 @@
export interface LeaderboardEntry<T> {
rank: number,
username: string,
score: T,
}

View file

@ -0,0 +1,6 @@
export interface Time {
seconds: number,
minutes?: number,
hours?: number,
days?: number,
}

View file

@ -0,0 +1,8 @@
export interface UserData {
username: string,
highscore: number,
totalScore: number,
totalPlaytime: string,
averageScore: number,
gamesPlayed: number,
}