hochzeit/src/server/Server.ts
2020-12-08 20:24:21 +01:00

87 lines
3.0 KiB
TypeScript

import * as express from "express";
import {createServer, Server as HTTPServer} from "http";
import * as path from "path";
import * as mysql from "mysql";
export class Server {
private httpServer: HTTPServer;
private app: express.Application;
private mysqlConnection;
// private io: socketIO.Server;
// private activeSockets: string[] = [];
// private senders: string[] = [];
private readonly DEFAULT_PORT = parseInt(process.env.PORT) || 5000;
constructor() {
this.initialize();
}
private initialize(): void {
this.app = express();
this.httpServer = createServer(this.app);
this.mysqlConnection = mysql.createConnection({
host: process.env.MYSQL_HOST || "localhost",
user: process.env.MYSQL_USER || "root",
password: process.env.MYSQL_PASSWORD || "",
database: process.env.MYSQL_DATABASE || "hochzeit"
});
this.configureApp();
this.configureRoutes();
// this.handleSocketConnection();
}
private async query(sql): Promise<any[]> {
return new Promise((resolve, reject) => {
this.mysqlConnection.query(sql, (error, results) => {
if (error) {
reject(error)
} else {
resolve(results);
}
})
})
}
private configureApp(): void {
this.app.use(express.json({limit: "1mb"}));
this.app.use(express.static(path.join(__dirname, "../../dist")));
}
private configureRoutes(): void {
this.app.get("/", (req, res) => {
res.sendFile("index.html");
});
this.app.get("/presents", async (req, res) => {
res.json(await this.query("SELECT * FROM presents"));
})
this.app.post("/presents", async (req, res) => {
const id = parseInt(req.body.id);
const isBought = (req.body.isBought === true)?1:0;
const version = parseInt(req.body.version) || 0;
const newVersion = version + 1;
const presents = await this.query("SELECT * FROM presents WHERE id = '" + id + "'");
if (presents.length === 0) {
await this.query("INSERT INTO presents (id, isBought, version) VALUES (" + id + ", " + isBought + ", " + newVersion + ");");
} else {
const present = presents[0];
if (present.version === version) {
await this.query("UPDATE presents SET version = " + newVersion + ", isBought = " + isBought + " WHERE ID = " + id);
} else {
return res.json({"success": false, "error": "wrong-version", present: present});
}
}
return res.json({"success": true, present: {id: id, isBought: isBought, version: newVersion}})
})
}
public listen(callback: (port: number) => void): void {
this.httpServer.listen(this.DEFAULT_PORT, () => {
callback(this.DEFAULT_PORT);
});
}
}