Redesign database and implement voting
This commit is contained in:
parent
a0b65c7d5b
commit
80e9bc1bde
16 changed files with 376 additions and 41 deletions
88
src/app.ts
88
src/app.ts
|
@ -23,15 +23,31 @@ 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 );
|
||||
requests.getRequests(requestCount).then((val: Array<any>) => response.send(val))
|
||||
.catch((e: any) => errorHandler(request,response,e));
|
||||
if (request.session.user) {
|
||||
requests.getRequestsVoted(requestCount,request.session.user.id).then((val: Array<any>) => response.send(val))
|
||||
.catch((e: any) => errorHandler(request,response,e));
|
||||
} else {
|
||||
requests.getRequests(requestCount).then((val: Array<any>) => response.send(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 );
|
||||
requests.getAllRequests(requestCount).then((val: Array<any>) => response.send(val))
|
||||
.catch((e: any) => errorHandler(request,response,e));
|
||||
if (request.session.user) {
|
||||
requests.getAllRequestsVoted(requestCount,request.session.user.id).then((val: Array<any>) => response.send(val))
|
||||
.catch((e: any) => errorHandler(request,response,e));
|
||||
} else {
|
||||
requests.getAllRequests(requestCount).then((val: Array<any>) => response.send(val))
|
||||
.catch((e: any) => errorHandler(request,response,e));
|
||||
}
|
||||
});
|
||||
|
||||
app.post("/api/addRequest", async (request, response) => {
|
||||
|
@ -44,10 +60,10 @@ app.post("/api/addRequest", async (request, response) => {
|
|||
if (!request.body.url) {
|
||||
response.status(400);
|
||||
response.send("Missing url");
|
||||
return
|
||||
return;
|
||||
}
|
||||
var url = request.body.url as string;
|
||||
var requester = request.session.user.display_name;
|
||||
var requester = request.session.user.id;
|
||||
requests.addRequest(url,requester).then((val: [number,string]) => {
|
||||
response.status(val[0]);
|
||||
response.send(val[1]);
|
||||
|
@ -60,12 +76,12 @@ app.post("/api/updateRequestState", async (request, response) => {
|
|||
if (!request.body.url) {
|
||||
response.status(400);
|
||||
response.send("Missing url");
|
||||
return
|
||||
return;
|
||||
}
|
||||
if (!request.body.state) {
|
||||
response.status(400);
|
||||
response.send("Missing scoreDiff");
|
||||
return
|
||||
return;
|
||||
}
|
||||
var url = request.body.url as string;
|
||||
var state = request.body.state as string;
|
||||
|
@ -81,12 +97,12 @@ app.post("/api/updateRequestScore", async (request, response) => {
|
|||
if (!request.body.url) {
|
||||
response.status(400);
|
||||
response.send("Missing url");
|
||||
return
|
||||
return;
|
||||
}
|
||||
if (!request.body.scoreDiff) {
|
||||
response.status(400);
|
||||
response.send("Missing scoreDiff");
|
||||
return
|
||||
return;
|
||||
}
|
||||
var url = request.body.url as string;
|
||||
var scoreDiff = parseInt(request.body.scoreDiff as string, 10);
|
||||
|
@ -102,7 +118,7 @@ app.post("/api/deleteRequest", async (request, response) => {
|
|||
if (!request.body.url) {
|
||||
response.status(400);
|
||||
response.send("Missing url");
|
||||
return
|
||||
return;
|
||||
}
|
||||
var url = request.body.url as string;
|
||||
requests.deleteRequest(url).then((val: [number,string]) => {
|
||||
|
@ -112,6 +128,48 @@ app.post("/api/deleteRequest", async (request, response) => {
|
|||
.catch((e: any) => errorHandler(request,response,e));
|
||||
});
|
||||
|
||||
app.post("/api/addVote", async (request,response) => {
|
||||
response.type('text/plain');
|
||||
if (!request.session || !request.session.user) {
|
||||
response.status(401);
|
||||
response.send("Must be logged in");
|
||||
return;
|
||||
}
|
||||
if (!request.body.url) {
|
||||
response.status(400);
|
||||
response.send("Missing url");
|
||||
return;
|
||||
}
|
||||
var url = request.body.url as string;
|
||||
var user = request.session.user.id;
|
||||
requests.addVote(url,user).then((val: [number,string]) => {
|
||||
response.status(val[0]);
|
||||
response.send(val[1]);
|
||||
})
|
||||
.catch((e: any) => errorHandler(request,response,e));
|
||||
});
|
||||
|
||||
app.post("/api/deleteVote", async (request,response) => {
|
||||
response.type('text/plain');
|
||||
if (!request.session || !request.session.user) {
|
||||
response.status(401);
|
||||
response.send("Must be logged in");
|
||||
return;
|
||||
}
|
||||
if (!request.body.url) {
|
||||
response.status(400);
|
||||
response.send("Missing url");
|
||||
return;
|
||||
}
|
||||
var url = request.body.url as string;
|
||||
var user = request.session.user.id;
|
||||
requests.deleteVote(url,user).then((val: [number,string]) => {
|
||||
response.status(val[0]);
|
||||
response.send(val[1]);
|
||||
})
|
||||
.catch((e: any) => errorHandler(request,response,e));
|
||||
});
|
||||
|
||||
// Twitch callback
|
||||
app.get("/callback", async (request, response) => {
|
||||
if (request.query.error) {
|
||||
|
@ -131,6 +189,14 @@ app.get("/callback", async (request, response) => {
|
|||
if (typeof tokenResponse == 'undefined') throw new Error('tokenResponse is undefined');
|
||||
request.session.tokenpair = { access_token: tokenResponse.access_token, refresh_token: tokenResponse.refresh_token };
|
||||
request.session.user = (await twitch.apiRequest(request.session.tokenpair,"GET","/users")).data[0];
|
||||
|
||||
const updateUserQuery = {
|
||||
name: "updateUser",
|
||||
text: "INSERT INTO users (userid,displayName,imageUrl) VALUES ($1,$2,$3)\
|
||||
ON CONFLICT (userid) DO UPDATE SET displayName = $2, imageUrl = $3"
|
||||
}
|
||||
var query = Object.assign(updateUserQuery,{ values: [request.session.user.id,request.session.user.display_name,request.session.user.profile_image_url] });
|
||||
db.query(query);
|
||||
response.redirect(307, '/');
|
||||
});
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ import db from "./db";
|
|||
// getRequests
|
||||
const getRequestsQuery = {
|
||||
name: "getRequests",
|
||||
text: "SELECT * FROM requests_vw LIMIT $1"
|
||||
text: "SELECT * FROM get_requests() LIMIT $1"
|
||||
}
|
||||
|
||||
export async function getRequests(count: number) {
|
||||
|
@ -16,7 +16,7 @@ export async function getRequests(count: number) {
|
|||
// getAllRequests
|
||||
const getAllRequestsQuery = {
|
||||
name: "getAllRequests",
|
||||
text: "SELECT * FROM requests_all_vw LIMIT $1"
|
||||
text: "SELECT * FROM get_requests_all() LIMIT $1"
|
||||
}
|
||||
|
||||
export async function getAllRequests(count: number) {
|
||||
|
@ -25,6 +25,30 @@ export async function getAllRequests(count: number) {
|
|||
.then((result: pg.QueryResult) => result.rows);
|
||||
};
|
||||
|
||||
// getRequestsVoted
|
||||
const getRequestsVotedQuery = {
|
||||
name: "getRequestsVoted",
|
||||
text: "SELECT * FROM get_requests_voted($2) LIMIT $1"
|
||||
}
|
||||
|
||||
export async function getRequestsVoted(count: number, user: number) {
|
||||
var query = Object.assign(getRequestsVotedQuery, { values: [count,user] });
|
||||
return db.query(query)
|
||||
.then((result: pg.QueryResult) => result.rows);
|
||||
};
|
||||
|
||||
// getAllRequestsVoted
|
||||
const getAllRequestsVotedQuery = {
|
||||
name: "getAllRequestsVoted",
|
||||
text: "SELECT * FROM get_requests_all_voted($2) LIMIT $1"
|
||||
}
|
||||
|
||||
export async function getAllRequestsVoted(count: number,user: number) {
|
||||
var query = Object.assign(getAllRequestsVotedQuery, { values: [count,user] });
|
||||
return db.query(query)
|
||||
.then((result: pg.QueryResult) => result.rows);
|
||||
};
|
||||
|
||||
// addRequest
|
||||
const validUrlRegexes = [
|
||||
/^https:\/\/www\.youtube\.com\/watch\?v=[a-zA-Z0-9_-]{11}$/
|
||||
|
@ -37,7 +61,7 @@ const checkRequestExistsQuery = {
|
|||
|
||||
const addRequestQuery = {
|
||||
name: "addRequest",
|
||||
text: "INSERT INTO requests (url,requester) VALUES ($1,$2)"
|
||||
text: "CALL add_request($1,$2)"
|
||||
}
|
||||
|
||||
export async function addRequest(url: string, requester: string): Promise<[number,string]> {
|
||||
|
@ -105,3 +129,23 @@ export async function deleteRequest(url: string): Promise<[number,string]> {
|
|||
return db.query(query)
|
||||
.then(() => [200,"Song request deleted."] as [number,string]);
|
||||
};
|
||||
|
||||
const checkVoteExistsQuery = {
|
||||
name: "checkVoteExists",
|
||||
text: "SELECT * FROM votes WHERE requesturl = $1 AND userid = $2"
|
||||
}
|
||||
|
||||
export async function addVote(url: string, user: string): Promise<[number,string]> {
|
||||
var query = Object.assign(checkVoteExistsQuery, { values: [url,user] });
|
||||
var result = await db.query(query);
|
||||
if (result.rowCount > 0) {
|
||||
return [200,`Song already voted on`]
|
||||
}
|
||||
return db.query("CALL add_vote($1,$2)",[url,user])
|
||||
.then(() => [201,"Successfully cast vote."] as [number,string]);
|
||||
};
|
||||
|
||||
export async function deleteVote(url: string, user: string): Promise<[number,string]> {
|
||||
return db.query("CALL delete_vote($1,$2)",[url,user])
|
||||
.then(() => [201,"Successfully retracted vote."] as [number,string]);
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue