learn-request-queue/src/requests.ts

108 lines
3.1 KiB
TypeScript

import pg from "pg";
import db from "./db";
// getRequests
const getRequestsQuery = {
name: "getRequests",
text: "SELECT * FROM requests_vw LIMIT $1"
}
export async function getRequests(count: number) {
var query = Object.assign(getRequestsQuery, { values: [count] });
return db.query(query)
.then((result: pg.QueryResult) => result.rows);
};
// getAllRequests
const getAllRequestsQuery = {
name: "getAllRequests",
text: "SELECT * FROM requests_all_vw LIMIT $1"
}
export async function getAllRequests(count: number) {
var query = Object.assign(getAllRequestsQuery, { values: [count] });
return db.query(query)
.then((result: pg.QueryResult) => result.rows);
};
// addRequest
const validUrlRegexes = [
/^https:\/\/www\.youtube\.com\/watch\?v=[a-zA-Z0-9_-]{11}$/
];
const checkRequestExistsQuery = {
name: "checkRequestExists",
text: "SELECT * FROM requests WHERE url = $1"
}
const addRequestQuery = {
name: "addRequest",
text: "INSERT INTO requests (url,requester) VALUES ($1,$2)"
}
export async function addRequest(url: string, requester: string): Promise<[number,string]> {
var validUrl = false;
for (var regex of validUrlRegexes) {
if (regex.test(url)) {
validUrl = true;
break;
}
}
if (!validUrl) return [400, "Invalid song URL."];
var query = Object.assign(checkRequestExistsQuery, { values: [url] });
var result = await db.query(query);
if (result.rowCount > 0) {
return [200,`Song already requested by ${result.rows[0].requester}. State: ${result.rows[0].state}`]
}
var query = Object.assign(addRequestQuery, { values: [url,requester] });
return db.query(query)
.then(() => [201,"Song request added."] as [number,string]);
};
// updateRequestState
const checkValidStateQuery = {
name: "checkValidState",
text: "SELECT * FROM states WHERE state = $1"
}
const updateRequestStateQuery = {
name: "updateRequestState",
text: "UPDATE requests SET state = $2 WHERE url = $1"
}
export async function updateRequestState(url: string, state: string): Promise<[number,string]> {
var query = Object.assign(checkValidStateQuery, { values: [state] });
var result = await db.query(query);
if (result.rowCount < 1) {
return [400,"Invalid state"]
}
var query = Object.assign(updateRequestStateQuery, { values: [url,state] });
return db.query(query)
.then(() => [200,"Song request state updated."] as [number,string]);
};
// updateRequestScore
const updateRequestScoreQuery = {
name: "updateRequestScore",
text: "UPDATE requests SET score = score + $2 WHERE url = $1"
}
export async function updateRequestScore(url: string, scoreDiff: number): Promise<[number,string]> {
var query = Object.assign(updateRequestScoreQuery, { values: [url,scoreDiff] });
return db.query(query)
.then(() => [200,"Song request score updated."] as [number,string]);
};
// deleteRequest
const deleteRequestQuery = {
name: "deleteRequest",
text: "DELETE FROM requests WHERE url = $1"
}
export async function deleteRequest(url: string): Promise<[number,string]> {
var query = Object.assign(deleteRequestQuery, { values: [url] });
return db.query(query)
.then(() => [200,"Song request deleted."] as [number,string]);
};