added Model classes
This commit is contained in:
parent
fd257b335c
commit
6e8e0e0101
14 changed files with 145 additions and 33 deletions
|
|
@ -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
|
||||
|
|
|
|||
2
backend/api/.dockerignore
Normal file
2
backend/api/.dockerignore
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
build/
|
||||
node_modules/
|
||||
24
backend/api/src/Database.ts
Normal file
24
backend/api/src/Database.ts
Normal 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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -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`);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
11
backend/api/src/leaderboardRouter.ts
Normal file
11
backend/api/src/leaderboardRouter.ts
Normal 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')
|
||||
})
|
||||
3
backend/api/src/manager/LeaderBoardSerializer.ts
Normal file
3
backend/api/src/manager/LeaderBoardSerializer.ts
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
export interface LeaderBoardSerializer {
|
||||
|
||||
}
|
||||
20
backend/api/src/manager/UserDataManager.ts
Normal file
20
backend/api/src/manager/UserDataManager.ts
Normal 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;
|
||||
}
|
||||
}
|
||||
19
backend/api/src/manager/UserDataPgPromiseSerializer.ts
Normal file
19
backend/api/src/manager/UserDataPgPromiseSerializer.ts
Normal 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,
|
||||
}
|
||||
}
|
||||
}
|
||||
6
backend/api/src/manager/UserDataSerializer.ts
Normal file
6
backend/api/src/manager/UserDataSerializer.ts
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
import {UserData} from "../model/UserData.js";
|
||||
|
||||
export interface UserDataSerializer {
|
||||
serialize(data: any): UserData,
|
||||
deserialize(userData: UserData): any,
|
||||
}
|
||||
5
backend/api/src/model/Leaderboard.ts
Normal file
5
backend/api/src/model/Leaderboard.ts
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
import {LeaderboardEntry} from "./LeaderboardEntry.js";
|
||||
|
||||
export class Leaderboard<T> {
|
||||
content: LeaderboardEntry<T>[];
|
||||
}
|
||||
5
backend/api/src/model/LeaderboardEntry.ts
Normal file
5
backend/api/src/model/LeaderboardEntry.ts
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
export interface LeaderboardEntry<T> {
|
||||
rank: number,
|
||||
username: string,
|
||||
score: T,
|
||||
}
|
||||
6
backend/api/src/model/Time.ts
Normal file
6
backend/api/src/model/Time.ts
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
export interface Time {
|
||||
seconds: number,
|
||||
minutes?: number,
|
||||
hours?: number,
|
||||
days?: number,
|
||||
}
|
||||
8
backend/api/src/model/UserData.ts
Normal file
8
backend/api/src/model/UserData.ts
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
export interface UserData {
|
||||
username: string,
|
||||
highscore: number,
|
||||
totalScore: number,
|
||||
totalPlaytime: string,
|
||||
averageScore: number,
|
||||
gamesPlayed: number,
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue