initial commit

This commit is contained in:
2025-10-17 12:28:08 -07:00
commit 2b64ace453
26 changed files with 5493 additions and 0 deletions

View 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
View 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}`));

View 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;
}