Add pagination
Note: Requests API endpoints /getRequests and /getRequestsAll have breaking changes (the response schema changed entirely). Fixes #26
This commit is contained in:
parent
c634e763f3
commit
84a22ccffd
6 changed files with 139 additions and 53 deletions
43
src/app.ts
43
src/app.ts
|
@ -42,31 +42,47 @@ app.use(session({
|
|||
|
||||
// API
|
||||
app.get("/api/getRequests", async (request, response) => {
|
||||
if (!request.session) {
|
||||
throw new Error ("Missing request.session")
|
||||
}
|
||||
var requestCount = ( request.query.count ? parseInt(request.query.count as string, 10) : 5 );
|
||||
if (!request.session) throw new Error ("Missing request.session");
|
||||
await validateApiToken(request.session);
|
||||
var requestCount = ( request.query.count ? parseInt(request.query.count as string, 10) : 5 );
|
||||
var requestOffset = ( request.query.offset ? parseInt(request.query.offset as string, 10) : 0 );
|
||||
var requestsTotal = await requests.getRequestsTotal();
|
||||
if (request.session.user) {
|
||||
requests.getRequestsVoted(requestCount,request.session.user.id).then((val: Array<any>) => response.send(val))
|
||||
requests.getRequestsVoted(requestCount,requestOffset,request.session.user.id)
|
||||
.then((val: Array<any>) => response.send({
|
||||
total: requestsTotal,
|
||||
requests: val
|
||||
}))
|
||||
.catch((e: any) => errorHandler(request,response,e));
|
||||
} else {
|
||||
requests.getRequests(requestCount).then((val: Array<any>) => response.send(val))
|
||||
requests.getRequests(requestCount,requestOffset)
|
||||
.then((val: Array<any>) => response.send({
|
||||
total: requestsTotal,
|
||||
requests: val
|
||||
}))
|
||||
.catch((e: any) => errorHandler(request,response,e));
|
||||
}
|
||||
});
|
||||
|
||||
app.get("/api/getAllRequests", async (request, response) => {
|
||||
if (!request.session) {
|
||||
throw new Error ("Missing request.session")
|
||||
}
|
||||
var requestCount = ( request.query.count ? parseInt(request.query.count as string, 10) : 5 );
|
||||
if (!request.session) throw new Error ("Missing request.session");
|
||||
await validateApiToken(request.session);
|
||||
var requestCount = ( request.query.count ? parseInt(request.query.count as string, 10) : 5 );
|
||||
var requestOffset = ( request.query.offset ? parseInt(request.query.offset as string, 10) : 0 );
|
||||
var requestsTotal = await requests.getAllRequestsTotal();
|
||||
if (request.session.user) {
|
||||
requests.getAllRequestsVoted(requestCount,request.session.user.id).then((val: Array<any>) => response.send(val))
|
||||
requests.getAllRequestsVoted(requestCount,requestOffset,request.session.user.id)
|
||||
.then((val: Array<any>) => response.send({
|
||||
total: requestsTotal,
|
||||
requests: val
|
||||
}))
|
||||
.catch((e: any) => errorHandler(request,response,e));
|
||||
} else {
|
||||
requests.getAllRequests(requestCount).then((val: Array<any>) => response.send(val))
|
||||
requests.getAllRequests(requestCount,requestOffset)
|
||||
.then((val: Array<any>) => response.send({
|
||||
total: requestsTotal,
|
||||
requests: val
|
||||
}))
|
||||
.catch((e: any) => errorHandler(request,response,e));
|
||||
}
|
||||
});
|
||||
|
@ -79,7 +95,8 @@ app.post("/api/addRequest", async (request, response) => {
|
|||
response.send("Session expired; please log in again");
|
||||
return;
|
||||
}
|
||||
var banned = await db.query(Object.assign(queries.checkBan, { values: [request.session.user.id] })).then((result: pg.QueryResult) => result.rowCount > 0);
|
||||
var banned = await db.query(Object.assign(queries.checkBan, { values: [request.session.user.id] }))
|
||||
.then((result: pg.QueryResult) => result.rowCount > 0);
|
||||
if (banned) {
|
||||
response.status(401);
|
||||
response.send("You are banned; you may not add new requests.");
|
||||
|
|
|
@ -56,27 +56,38 @@ export const updateVotePoints = {
|
|||
export const getRequests = {
|
||||
name: "getRequests",
|
||||
text: "SELECT * FROM requests_vw \
|
||||
JOIN states ON requests_vw.state = states.state \
|
||||
WHERE active ORDER BY score DESC, reqTimestamp ASC LIMIT $1"
|
||||
JOIN states ON requests_vw.state = states.state WHERE active \
|
||||
ORDER BY score DESC, reqTimestamp ASC LIMIT $1 OFFSET $2"
|
||||
}
|
||||
|
||||
export const getRequestsVoted = {
|
||||
name: "getRequestsVoted",
|
||||
text: "SELECT * FROM get_requests_voted($2) \
|
||||
JOIN states ON get_requests_voted.state = states.state \
|
||||
WHERE active ORDER BY score DESC, reqTimestamp ASC LIMIT $1"
|
||||
text: "SELECT * FROM get_requests_voted($3) \
|
||||
JOIN states ON get_requests_voted.state = states.state WHERE active \
|
||||
ORDER BY score DESC, reqTimestamp ASC LIMIT $1 OFFSET $2"
|
||||
}
|
||||
|
||||
export const getRequestsTotal = {
|
||||
name: "getRequestsTotal",
|
||||
text: "SELECT COUNT(*) FROM requests_vw \
|
||||
JOIN states ON requests_vw.state = states.state WHERE active"
|
||||
}
|
||||
|
||||
export const getAllRequests = {
|
||||
name: "getAllRequests",
|
||||
text: "SELECT * FROM requests_vw \
|
||||
ORDER BY score DESC, reqTimestamp ASC LIMIT $1"
|
||||
ORDER BY score DESC, reqTimestamp ASC LIMIT $1 OFFSET $2"
|
||||
}
|
||||
|
||||
export const getAllRequestsVoted = {
|
||||
name: "getAllRequestsVoted",
|
||||
text: "SELECT * FROM get_requests_voted($2) \
|
||||
ORDER BY score DESC, reqTimestamp ASC LIMIT $1"
|
||||
text: "SELECT * FROM get_requests_voted($3) \
|
||||
ORDER BY score DESC, reqTimestamp ASC LIMIT $1 OFFSET $2"
|
||||
}
|
||||
|
||||
export const getAllRequestsTotal = {
|
||||
name: "getAllRequestsTotal",
|
||||
text: "SELECT COUNT(*) FROM requests_vw"
|
||||
}
|
||||
|
||||
export const checkRequestExists = {
|
||||
|
|
|
@ -4,30 +4,40 @@ import { log, LogLevel } from "./logging"
|
|||
import pg from "pg";
|
||||
import db from "./db";
|
||||
|
||||
export async function getRequests(count: number) {
|
||||
var query = Object.assign(queries.getRequests, { values: [count] });
|
||||
export async function getRequests(count: number, offset: number) {
|
||||
var query = Object.assign(queries.getRequests, { values: [count,offset] });
|
||||
return db.query(query)
|
||||
.then((result: pg.QueryResult) => result.rows);
|
||||
};
|
||||
|
||||
export async function getAllRequests(count: number) {
|
||||
var query = Object.assign(queries.getAllRequests, { values: [count] });
|
||||
export async function getRequestsVoted(count: number, offset: number, user: number) {
|
||||
var query = Object.assign(queries.getRequestsVoted, { values: [count,offset,user] });
|
||||
return db.query(query)
|
||||
.then((result: pg.QueryResult) => result.rows);
|
||||
};
|
||||
|
||||
export async function getRequestsVoted(count: number, user: number) {
|
||||
var query = Object.assign(queries.getRequestsVoted, { values: [count,user] });
|
||||
export async function getRequestsTotal() {
|
||||
return db.query(queries.getRequestsTotal)
|
||||
.then((result: pg.QueryResult) => result.rows[0]["count"]);
|
||||
};
|
||||
|
||||
export async function getAllRequests(count: number, offset: number) {
|
||||
var query = Object.assign(queries.getAllRequests, { values: [count,offset] });
|
||||
return db.query(query)
|
||||
.then((result: pg.QueryResult) => result.rows);
|
||||
};
|
||||
|
||||
export async function getAllRequestsVoted(count: number,user: number) {
|
||||
var query = Object.assign(queries.getAllRequestsVoted, { values: [count,user] });
|
||||
export async function getAllRequestsVoted(count: number, offset: number, user: number) {
|
||||
var query = Object.assign(queries.getAllRequestsVoted, { values: [count,offset,user] });
|
||||
return db.query(query)
|
||||
.then((result: pg.QueryResult) => result.rows);
|
||||
};
|
||||
|
||||
export async function getAllRequestsTotal() {
|
||||
return db.query(queries.getAllRequestsTotal)
|
||||
.then((result: pg.QueryResult) => result.rows[0]["count"]);
|
||||
};
|
||||
|
||||
const validUrlRegexes = [
|
||||
/^https:\/\/www\.youtube\.com\/watch\?v=[a-zA-Z0-9_-]{11}$/
|
||||
];
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue