diff --git a/src/main.ts b/src/main.ts index a3d8ac3..2268d36 100644 --- a/src/main.ts +++ b/src/main.ts @@ -2,6 +2,7 @@ import { PostListener, MessagesResponder } from "./routes"; import express from "express"; import dotenv from "dotenv"; import { Logger } from "./utils"; +import ApiRoute from "./utils/ApiRoute"; dotenv.config(); const app = express(); @@ -11,8 +12,10 @@ const post = new PostListener(app); const query = new MessagesResponder(app); const port = +process.env.PORT || 8080; +ApiRoute.start(app); post.start(); query.start(); +logger.log("Loading complete."); app.listen(port, () => { logger.log(`Server started on ${Logger.emp(`http://localhost:${port}`)}`); diff --git a/src/routes/post.ts b/src/routes/post.ts index 5cf4941..2c52d57 100644 --- a/src/routes/post.ts +++ b/src/routes/post.ts @@ -1,17 +1,16 @@ import { userReviewSchema, typeJson } from "../types"; import { Logger, Responder, data } from "../utils"; import { Express, Request, Response } from "express"; +import ApiRoute from "../utils/ApiRoute"; -export class PostListener { - private server: Express; - private readonly logger = new Logger("Post Listener"); - +export class PostListener extends ApiRoute { constructor(server: Express) { - this.server = server; + // Route always trails a slash, the final result is is "/api/post". See src/utils/ApiRoute.ts + super(server, "/post"); } public async start(): Promise { - this.server.post("/post", (req: Request, res: Response) => { + this.server.post(this.routeName, (req: Request, res: Response) => { req.on("data", async (chunk) => { const sender = `${Logger.bold(Logger.emp("Client:"))} ${Logger.emp(req.headers["user-agent"])}`; @@ -65,6 +64,6 @@ export class PostListener { }); }); - this.logger.log("Loading complete."); + this.complete(); } } diff --git a/src/routes/reviews.ts b/src/routes/reviews.ts index 06f522b..cc10429 100644 --- a/src/routes/reviews.ts +++ b/src/routes/reviews.ts @@ -1,17 +1,16 @@ import { Express, Request, Response } from "express"; -import { Logger, data } from "../utils"; +import { Logger, Responder, data } from "../utils"; import { IdRequest, typeJson } from "../types"; +import ApiRoute from "../utils/ApiRoute"; -export class MessagesResponder { - private server: Express; - private readonly logger = new Logger("Query"); - +export class MessagesResponder extends ApiRoute { constructor(server: Express) { - this.server = server; + // Route always trails a slash, the final result is "/api/reviews". See src/utils/ApiRoute.ts + super(server, "/reviews"); } public async start(): Promise { - this.server.get("/reviews", (req: Request, res: Response) => { + this.server.get(this.routeName, (req: Request, res: Response) => { const receiver = req.headers["user-agent"]; const result = data.getReviews(); @@ -22,7 +21,7 @@ export class MessagesResponder { this.logger.log(`${Logger.emp(receiver)} <~ "${req.path}"`); }); - this.server.get("/reviews/:id", (req: IdRequest, res: Response) => { + this.server.get(`${this.routeName}/:id`, (req: IdRequest, res: Response) => { const receiver = req.headers["user-agent"]; const result = data.getReviewById(req.params.id); @@ -33,6 +32,6 @@ export class MessagesResponder { this.logger.log(`${Logger.emp(receiver)} <~ "${req.path}"`); }); - this.logger.log("Loading complete."); + this.complete(); } } diff --git a/src/utils/ApiRoute.ts b/src/utils/ApiRoute.ts new file mode 100644 index 0000000..323e493 --- /dev/null +++ b/src/utils/ApiRoute.ts @@ -0,0 +1,38 @@ +import { Express, Request, Response } from "express"; +import { Logger } from "./logger"; +import { typeJson } from "../types"; +import { Responder } from "./responder"; + +export default class ApiRoute { + public readonly server: Express; + public readonly routeName: string; + public readonly logger = new Logger("API"); + + constructor(server: Express, route: string) { + // API Routes are a list of routes, the beginning route should be first + const mainRoute = `/api${route}`; + + this.server = server; + this.routeName = mainRoute; + } + + // this.complete() should be called when the route is finished initalizing. + // This makes it easy to see what routes + public complete(): void { + this.logger.log("Loaded", Logger.emp(this.routeName)); + } + + public static async start(server: Express): Promise { + server.post("/api", (req: Request, res: Response) => { + res.writeHead(400, typeJson); + res.write(Responder.success("ok")); + res.end(); + }); + + server.get("/api", (req: Request, res: Response) => { + res.writeHead(400, typeJson); + res.write(Responder.success("ok")); + res.end(); + }) + } +}