initial commit
This commit is contained in:
24
server/src/blackjack/Blackjack.ts
Normal file
24
server/src/blackjack/Blackjack.ts
Normal file
@ -0,0 +1,24 @@
|
||||
import { DatabaseEntry } from "../serverResponse";
|
||||
|
||||
interface BlackjackProperties {
|
||||
turn: "dealer" | "player";
|
||||
}
|
||||
|
||||
export class Blackjack implements DatabaseEntry {
|
||||
id: number;
|
||||
created: Date;
|
||||
modified: Date;
|
||||
deleted: Date | null;
|
||||
turn: "dealer" | "player";
|
||||
|
||||
constructor(entry: BlackjackProperties & DatabaseEntry);
|
||||
constructor(id: number);
|
||||
constructor(data: number | (BlackjackProperties & DatabaseEntry)) {
|
||||
const id = typeof data === "number" ? data : data.id;
|
||||
this.id = id;
|
||||
this.created = new Date();
|
||||
this.modified = this.created;
|
||||
this.deleted = null;
|
||||
this.turn = "dealer";
|
||||
}
|
||||
}
|
||||
35
server/src/index.ts
Normal file
35
server/src/index.ts
Normal file
@ -0,0 +1,35 @@
|
||||
import Koa from "koa";
|
||||
import Router from "@koa/router";
|
||||
import { Blackjack } from "./blackjack/Blackjack";
|
||||
import { itemResponse, itemsResponse } from "./serverResponse";
|
||||
|
||||
const PORT = 3000;
|
||||
|
||||
const app = new Koa();
|
||||
const router = new Router();
|
||||
|
||||
const tables: Blackjack[] = [];
|
||||
|
||||
router.get("/table", (ctx) => {
|
||||
ctx.status = 200;
|
||||
ctx.body = itemsResponse(tables);
|
||||
});
|
||||
|
||||
router.get("/table/:id", (ctx) => {
|
||||
const id = ctx.params["id"];
|
||||
|
||||
ctx.status = 200;
|
||||
ctx.body = itemResponse(tables[Number(id)]);
|
||||
});
|
||||
|
||||
router.post("/table", (ctx) => {
|
||||
const id = tables.length;
|
||||
|
||||
tables.push(new Blackjack(id));
|
||||
ctx.status = 201;
|
||||
ctx.body = { id };
|
||||
});
|
||||
|
||||
app.use(router.routes());
|
||||
|
||||
app.listen(3000, () => console.log(`listening on port ${PORT}`));
|
||||
44
server/src/serverResponse.ts
Normal file
44
server/src/serverResponse.ts
Normal file
@ -0,0 +1,44 @@
|
||||
export interface ApiItem<T> {
|
||||
created: string;
|
||||
deleted?: string;
|
||||
id: number;
|
||||
item?: T;
|
||||
modified: string;
|
||||
}
|
||||
|
||||
export interface DatabaseEntry {
|
||||
created: Date;
|
||||
deleted: Date | null;
|
||||
id: number;
|
||||
modified: Date;
|
||||
}
|
||||
|
||||
export function createdResponse<T extends DatabaseEntry>({ id }: T) {
|
||||
return { id };
|
||||
}
|
||||
|
||||
export function itemResponse<T>(data: T & DatabaseEntry): ApiItem<T> {
|
||||
const { id, created, modified, deleted, ...rest } = data;
|
||||
const res: ApiItem<T> = {
|
||||
id: id,
|
||||
created: created.toISOString(),
|
||||
modified: modified.toISOString(),
|
||||
};
|
||||
|
||||
if (deleted) {
|
||||
res.deleted = deleted.toISOString();
|
||||
}
|
||||
|
||||
res.item = rest as T;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
export function itemsResponse<T>(data: (T & DatabaseEntry)[]): ApiItem<T>[] {
|
||||
const res: ApiItem<T>[] = [];
|
||||
for (const item of data) {
|
||||
res.push(itemResponse(item));
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
Reference in New Issue
Block a user