Compare commits
No commits in common. "550d862e0926b47c2b08a99e2a5efa35581d3961" and "9843459d22d6ea5592fdafacc609b4b4735f2072" have entirely different histories.
550d862e09
...
9843459d22
|
@ -1,6 +1,6 @@
|
||||||
import { Express, Response } from "express";
|
import { Express, Request, Response } from "express";
|
||||||
import { Logger, Responder, data } from "../utils";
|
import { Logger, Responder, data } from "../utils";
|
||||||
import { IdRequest, ReviewRequest, typeJson } from "../types";
|
import { IdRequest, typeJson } from "../types";
|
||||||
import ApiRoute from "../utils/ApiRoute";
|
import ApiRoute from "../utils/ApiRoute";
|
||||||
|
|
||||||
export class MessagesResponder extends ApiRoute {
|
export class MessagesResponder extends ApiRoute {
|
||||||
|
@ -10,34 +10,9 @@ export class MessagesResponder extends ApiRoute {
|
||||||
}
|
}
|
||||||
|
|
||||||
public async start(): Promise<void> {
|
public async start(): Promise<void> {
|
||||||
this.server.get(this.routeName, (req: ReviewRequest, res: Response) => {
|
this.server.get(this.routeName, (req: Request, res: Response) => {
|
||||||
// This is a mouthful. :sigh:
|
|
||||||
// If the request parameter "max" is present and it isn't a number
|
|
||||||
if ((req.query.max && !+req.query.max) || +req.query.max < 1) {
|
|
||||||
res.writeHead(400, typeJson);
|
|
||||||
res.write(
|
|
||||||
Responder.requestError(
|
|
||||||
"max parameter must be a positive non-zero number or undefined",
|
|
||||||
),
|
|
||||||
);
|
|
||||||
res.end();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Same check as the above one, but for skip
|
|
||||||
if ((req.query.skip && !+req.query.skip) || +req.query.skip < 1) {
|
|
||||||
res.writeHead(400, typeJson);
|
|
||||||
res.write(
|
|
||||||
Responder.requestError(
|
|
||||||
"skip parameter must be a number or undefined",
|
|
||||||
),
|
|
||||||
);
|
|
||||||
res.end();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const receiver = req.headers["user-agent"];
|
const receiver = req.headers["user-agent"];
|
||||||
const result = data.getReviews(+req.query.max, +req.query.skip);
|
const result = data.getReviews();
|
||||||
|
|
||||||
res.writeHead(200, typeJson);
|
res.writeHead(200, typeJson);
|
||||||
res.write(JSON.stringify(result));
|
res.write(JSON.stringify(result));
|
||||||
|
@ -46,40 +21,35 @@ export class MessagesResponder extends ApiRoute {
|
||||||
this.logger.log(`${Logger.emp(receiver)} <~ "${req.path}"`);
|
this.logger.log(`${Logger.emp(receiver)} <~ "${req.path}"`);
|
||||||
});
|
});
|
||||||
|
|
||||||
this.server.get(
|
this.server.get(`${this.routeName}/:id`, (req: IdRequest, res: Response) => {
|
||||||
`${this.routeName}/:id`,
|
// "req.params.id" is the review ID that was receieved
|
||||||
(req: IdRequest, res: Response) => {
|
// "result" is the review that is identified by that ID, if any
|
||||||
// "req.params.id" is the review ID that was receieved
|
|
||||||
// "result" is the review that is identified by that ID, if any
|
|
||||||
|
|
||||||
const receiver = req.headers["user-agent"];
|
const receiver = req.headers["user-agent"];
|
||||||
const result = data.getReviewById(req.params.id);
|
const result = data.getReviewById(req.params.id);
|
||||||
let err = false;
|
let err = false;
|
||||||
|
|
||||||
if (req.params.id.length === 6) {
|
if (req.params.id.length === 6) {
|
||||||
if (Object.keys(result).length) {
|
if (Object.keys(result).length) {
|
||||||
res.writeHead(200, typeJson);
|
res.writeHead(200, typeJson);
|
||||||
res.write(JSON.stringify(result));
|
res.write(JSON.stringify(result));
|
||||||
res.end();
|
res.end();
|
||||||
} else {
|
|
||||||
res.writeHead(404, typeJson);
|
|
||||||
res.write(Responder.notFoundError("review not found"));
|
|
||||||
res.end();
|
|
||||||
err = true;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
res.writeHead(400, typeJson);
|
res.writeHead(404, typeJson);
|
||||||
res.write(Responder.requestError("review id must be 6 characters"));
|
res.write(Responder.notFoundError("review not found"));
|
||||||
res.end();
|
res.end();
|
||||||
err = true;
|
err = true;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
res.writeHead(400, typeJson);
|
||||||
|
res.write(Responder.requestError("review id must be 6 characters"));
|
||||||
|
res.end();
|
||||||
|
err = true;
|
||||||
|
}
|
||||||
|
|
||||||
// If an error was returned to the client, mark their user agent red in the logs
|
// If an error was returned to the client, mark their user agent red in the logs
|
||||||
this.logger.log(
|
this.logger.log(`${err ? Logger.err(receiver) : Logger.emp(receiver)} <~ "${req.path}"`);
|
||||||
`${err ? Logger.err(receiver) : Logger.emp(receiver)} <~ "${req.path}"`,
|
});
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
this.complete();
|
this.complete();
|
||||||
}
|
}
|
||||||
|
|
12
src/types.ts
12
src/types.ts
|
@ -11,10 +11,7 @@ const rating = number()
|
||||||
)
|
)
|
||||||
.required();
|
.required();
|
||||||
|
|
||||||
export const typeJson = {
|
export const typeJson = { "Access-Control-Allow-Origin": "*", "Content-Type": "application/json" };
|
||||||
"Access-Control-Allow-Origin": "*",
|
|
||||||
"Content-Type": "application/json",
|
|
||||||
};
|
|
||||||
|
|
||||||
export const userReviewSchema = object({
|
export const userReviewSchema = object({
|
||||||
username: string().min(2).max(30).required(),
|
username: string().min(2).max(30).required(),
|
||||||
|
@ -37,10 +34,3 @@ export interface IdRequest extends Request {
|
||||||
id: string;
|
id: string;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ReviewRequest extends Request {
|
|
||||||
query: {
|
|
||||||
max: string;
|
|
||||||
skip: string;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
|
@ -33,6 +33,6 @@ export default class ApiRoute {
|
||||||
res.writeHead(400, typeJson);
|
res.writeHead(400, typeJson);
|
||||||
res.write(Responder.success("ok"));
|
res.write(Responder.success("ok"));
|
||||||
res.end();
|
res.end();
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,6 @@ import {
|
||||||
UserSideReview,
|
UserSideReview,
|
||||||
} from "../types";
|
} from "../types";
|
||||||
import { toServerReview, checkFile, stripId } from "./functions";
|
import { toServerReview, checkFile, stripId } from "./functions";
|
||||||
import { Logger } from "./logger";
|
|
||||||
|
|
||||||
export class ReviewData {
|
export class ReviewData {
|
||||||
public data: ServerSideReview[];
|
public data: ServerSideReview[];
|
||||||
|
@ -32,22 +31,11 @@ export class ReviewData {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public getReviews(max?: number, skip?: number): ServerSideReview[] {
|
public getReviews(): ServerSideReview[] {
|
||||||
let final: ServerSideReview[] = [];
|
let final: ServerSideReview[] = [];
|
||||||
// If "max" isn't provided, is Infinity, or is greater than the amount of reviews
|
|
||||||
const sendAllReviews = !max || max === Infinity || max > this.data.length;
|
|
||||||
const useList = skip ? this.data.slice(skip, this.data.length) : this.data;
|
|
||||||
|
|
||||||
if (sendAllReviews) {
|
for (const review of this.data) {
|
||||||
for (const review of useList) {
|
final.push(review);
|
||||||
final.push(review);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (const review of useList) {
|
|
||||||
while (final.length !== max) {
|
|
||||||
final.push(review);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return final;
|
return final;
|
||||||
|
|
|
@ -47,8 +47,8 @@ export class Responder {
|
||||||
return JSON.stringify({
|
return JSON.stringify({
|
||||||
error: {
|
error: {
|
||||||
type: "notFoundError",
|
type: "notFoundError",
|
||||||
message: errorMessage,
|
message: errorMessage
|
||||||
},
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue