From 5b9d3a2244a341f78731878bdde02b7b2659ce67 Mon Sep 17 00:00:00 2001 From: pro100taiyr Date: Sun, 14 Apr 2019 01:52:17 +0200 Subject: [PATCH 1/4] Implement 5/6 endpoints --- src/routes/events.ts | 311 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 310 insertions(+), 1 deletion(-) diff --git a/src/routes/events.ts b/src/routes/events.ts index 0c2a5c1..37ae15e 100644 --- a/src/routes/events.ts +++ b/src/routes/events.ts @@ -1,5 +1,314 @@ import * as db from '../tools/db'; -import { Application } from "express"; +import { Application, Request, Response } from "express"; export const register = (app: Application) => { + /* /events endpoint */ + + // Get method (get all events (filter by category, location, time)) + app.get('/api/v1/events', (req: Request, res: Response) => { + const filter_by = req.body.filter_by; + if (filter_by === 'category') { + + } + else if (filter_by === 'location') { + + } + else if (filter_by === 'time') { + + } + else { + const sql = `SELECT * FROM Event`; + + db.connection.query(sql, (error, results, fields) => { + if (error) { + return res.sendStatus(400); + } + return res.send({ + "events": results + }); + }); + } + }); + + // Post method (create new event) + app.post('/api/v1/events', (req: Request, res: Response) => { + const title = req.body.title; + const max_capacity = req.body.max_capacity; + const content = req.body.content; + const ugid = req.body.ugid; + const lid = req.body.lid; + const evcat_id = req.body.evcat_id; + + if (!title || !ugid || !lid || !evcat_id) { + return res.sendStatus(400); + } + + const sql = `INSERT INTO Event (title, public, max_capacity, content, + usergroup_id, location_id, evcat_id) VALUES(?, ?, ?, ?, ?, ?, ?)`; + db.connection.query(sql, [title, 1, max_capacity, content, ugid, lid, evcat_id], + (error, results, fields) => { + + if (error) { + return res.sendStatus(500); + } + return res.sendStatus(201); + }); + }); + + /* /events/:evid */ + + // Get method (can be single, recurring single or recurring (?) event) + // get specific event + app.get('/api/v1/events/:evid', (req: Request, res: Response) => { + const evid = req.params.evid; + if (!evid) { + return res.sendStatus(400); + } + + const sql = ` + SELECT * FROM OneTimeEvent + WHERE event_id = ?; + + SELECT * FROM RecurringEvent + INNER JOIN RecurringSingleEvent ON + RecurringSingleEvent.recurringevent_id = RecurringEvent.recurringevent_id + WHERE RecurringEvent.event_id = ?`; + + db.connection.query(sql, [evid, evid], (error, results, fields) => { + if (error) { + return res.sendStatus(500); + } + + return res.send({ + "OneTimeEvent": results[0], + "RecurringEvent": results[1] + }); + }); + }); + + // Put method (update existing event) + app.put('/api/v1/events/:evid', (req: Request, res: Response) => { + const evid = req.params.evid; + const title = req.body.title; + const max_capacity = req.body.max_capacity; + const content = req.body.content; + const ugid = req.body.ugid; + const lid = req.body.lid; + const evcat_id = req.body.evcat_id; + if (!evid || !title || !max_capacity || !content + || !ugid || !lid || !evcat_id) { + return res.sendStatus(400); + } + + const sql = ` + UPDATE Event + SET title = ?, max_capacity = ?, content = ?, + usergroup_id = ?, usergroup_id = ?, evcat_id = ? + WHERE event_id = ?`; + + db.connection.query(sql, [title, max_capacity, content, + ugid, lid, evcat_id, evid], (error, results, fields) => { + + if (error) { + return res.sendStatus(500); + } + + return res.sendStatus(200); + }); + }); + + // Delete Method (remove existing event) + app.delete('/api/v1/events/:evid', (req: Request, res: Response) => { + const evid = req.params.evid; + if (!evid) { + return res.sendStatus(400); + } + + const sql = `DELETE FROM Event + WHERE event_id = ?`; + + db.connection.query(sql, [evid], (error, results, fields) => { + if (error) { + return res.sendStatus(500); + } + return res.sendStatus(200); + }); + }); + + /* /events/:evid/invited */ + + // Get method (get users that are invited to the event) + app.get('/api/v1/events/:evid/invited', (req: Request, res: Response) => { + const evid = req.params.evid; + if (!evid) { + return res.sendStatus(400); + } + + const sql = `SELECT * FROM User + INNER JOIN Invite ON + Invite.user_id = User.user_id + INNER JOIN EventInvite ON + EventInvite.invite_id = Invite.invite_id + WHERE EventInvite.event_id = ?`; + + db.connection.query(sql, [evid], (error, results, fields) => { + if (error) { + return res.sendStatus(500); + } + return res.send({ + "invited": results + }); + }); + }); + + // Post method (invite user to event) + app.post('/api/v1/events/:evid/invited', (req: Request, res: Response) => { + const evid = req.params.evid; + const uid = req.body.uid; + const message = req.body.message || "You have been invited to an event"; + if (!evid || !uid) { + return res.sendStatus(400); + } + + // create new Invite + const sql = ` + INSERT INTO Invite (user_id, message) + VALUES(?, ?); + + INSERT INTO EventInvite(invite_id, event_id) + SELECT Invite.invite_id, ? FROM Invite + WHERE Invite.user_id = ?; `; + + db.connection.query(sql, [uid, message, evid, uid], (error, results, fields) => { + if (error) { + return res.sendStatus(500); + } + return res.sendStatus(201); + }); + }); + + /* /events/:evid/confirmed */ + + // Get method (get users that are attending event) + app.get('/api/v1/events/:evid/confirmed', (req: Request, res: Response) => { + const evid = req.params.evid; + if (!evid) { + return res.sendStatus(400); + } + + const sql = ` + (SELECT * FROM User + INNER JOIN SingularAttendance ON + SingularAttendance.user_id = User.user_id + WHERE SingularAttendance.event_id = ?) + UNION ALL + (SELECT * FROM User + INNER JOIN RecurringAttendance ON + RecurringAttendance.user_id = User.user_id + WHERE RecurringAttendance.event_id = ?)`; + + db.connection.query(sql, [evid, evid], (error, results, fields) => { + if (error) { + return res.sendStatus(500); + } + return res.send({ + users: results + }); + }); + }); + + /* /events/:evid/requested */ + + // Get method (get users that requested to join event) + app.get('/api/v1/events/:evid/requested', (req: Request, res: Response) => { + const evid = req.params.evid; + if (!evid) { + return res.sendStatus(400); + } + + const sql = `SELECT * FROM User + INNER JOIN Request ON + Request.user_id = User.user_id + INNER JOIN EventRequest ON + EventRequest.request_id = Request.request_id + WHERE EventRequest.event_id = ?`; + + db.connection.query(sql, [evid], (error, results, fields) => { + if (error) { + return res.sendStatus(500); + } + return res.send({ + "requested": results + }); + }); + }); + + // Post method (request to join event) + app.post('/api/v1/events/:evid/requested', (req: Request, res: Response) => { + const evid = req.params.evid; + const uid = req.body.uid; + const message = req.body.message || "You have requested to join the event"; + if (!evid || !uid) { + return res.sendStatus(400); + } + + // create new Request + const sql = ` + INSERT INTO Request (user_id, message) + VALUES(?, ?); + + INSERT INTO EventRequest(request_id, event_id) + SELECT Request.request_id, ? FROM Request + WHERE Request.user_id = ?; `; + + db.connection.query(sql, [uid, message, evid, uid], (error, results, fields) => { + if (error) { + return res.sendStatus(500); + } + return res.sendStatus(201); + }); + }); + + /* /events/:evid/organizing */ + + // Get method (get event organizers) + app.get('/api/v1/events/:evid/organizing', (req: Request, res: Response) => { + const evid = req.params.evid; + if (!evid) { + return res.sendStatus(400); + } + + const sql = ` + SELECT * FROM User + INNER JOIN Organizer ON + Organizer.user_id = User.user_id + WHERE Organizer.event_id = ?`; + + db.connection.query(sql, [evid], (error, results, fields) => { + if (error) { + return res.sendStatus(500); + } + return res.send({ + "organizers": results + }); + }); + }); + + // Post method (add event organizer) + app.post('/api/v1/events/:evid/organizing', (req: Request, res: Response) => { + const evid = req.params.evid; + const uid = req.body.uid; + if (!evid || !uid) { + return res.sendStatus(400); + } + + const sql = `INSERT INTO Organizer (user_id, event_id) + VALUES(?, ?)`; + db.connection.query(sql, [uid, evid], (error, results, fields) => { + if (error) { + return res.sendStatus(500); + } + return res.sendStatus(201); + }); + }); }; \ No newline at end of file From 6da00ace39863acfb8eaec451dd893daa0c97bff Mon Sep 17 00:00:00 2001 From: Steven Abreu Date: Mon, 15 Apr 2019 13:16:26 -0400 Subject: [PATCH 2/4] fix code style --- src/routes/events.ts | 88 ++++++++++++++++++++++---------------------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/src/routes/events.ts b/src/routes/events.ts index 37ae15e..5e8a3d1 100644 --- a/src/routes/events.ts +++ b/src/routes/events.ts @@ -1,37 +1,37 @@ -import * as db from '../tools/db'; import { Application, Request, Response } from "express"; +import * as db from "../tools/db"; export const register = (app: Application) => { /* /events endpoint */ // Get method (get all events (filter by category, location, time)) - app.get('/api/v1/events', (req: Request, res: Response) => { + app.get("/api/v1/events", (req: Request, res: Response) => { const filter_by = req.body.filter_by; - if (filter_by === 'category') { - - } - else if (filter_by === 'location') { - - } - else if (filter_by === 'time') { - - } - else { + if (filter_by === "category") { + // todo + const todo = true; + } else if (filter_by === "location") { + // todo + const todo = true; + } else if (filter_by === "time") { + // todo + const todo = true; + } else { const sql = `SELECT * FROM Event`; - + db.connection.query(sql, (error, results, fields) => { if (error) { return res.sendStatus(400); } return res.send({ - "events": results + events: results, }); }); } }); // Post method (create new event) - app.post('/api/v1/events', (req: Request, res: Response) => { + app.post("/api/v1/events", (req: Request, res: Response) => { const title = req.body.title; const max_capacity = req.body.max_capacity; const content = req.body.content; @@ -59,7 +59,7 @@ export const register = (app: Application) => { // Get method (can be single, recurring single or recurring (?) event) // get specific event - app.get('/api/v1/events/:evid', (req: Request, res: Response) => { + app.get("/api/v1/events/:evid", (req: Request, res: Response) => { const evid = req.params.evid; if (!evid) { return res.sendStatus(400); @@ -68,7 +68,7 @@ export const register = (app: Application) => { const sql = ` SELECT * FROM OneTimeEvent WHERE event_id = ?; - + SELECT * FROM RecurringEvent INNER JOIN RecurringSingleEvent ON RecurringSingleEvent.recurringevent_id = RecurringEvent.recurringevent_id @@ -80,14 +80,14 @@ export const register = (app: Application) => { } return res.send({ - "OneTimeEvent": results[0], - "RecurringEvent": results[1] + OneTimeEvent: results[0], + RecurringEvent: results[1], }); }); }); // Put method (update existing event) - app.put('/api/v1/events/:evid', (req: Request, res: Response) => { + app.put("/api/v1/events/:evid", (req: Request, res: Response) => { const evid = req.params.evid; const title = req.body.title; const max_capacity = req.body.max_capacity; @@ -95,17 +95,17 @@ export const register = (app: Application) => { const ugid = req.body.ugid; const lid = req.body.lid; const evcat_id = req.body.evcat_id; - if (!evid || !title || !max_capacity || !content + if (!evid || !title || !max_capacity || !content || !ugid || !lid || !evcat_id) { return res.sendStatus(400); } - + const sql = ` UPDATE Event SET title = ?, max_capacity = ?, content = ?, usergroup_id = ?, usergroup_id = ?, evcat_id = ? WHERE event_id = ?`; - + db.connection.query(sql, [title, max_capacity, content, ugid, lid, evcat_id, evid], (error, results, fields) => { @@ -118,7 +118,7 @@ export const register = (app: Application) => { }); // Delete Method (remove existing event) - app.delete('/api/v1/events/:evid', (req: Request, res: Response) => { + app.delete("/api/v1/events/:evid", (req: Request, res: Response) => { const evid = req.params.evid; if (!evid) { return res.sendStatus(400); @@ -126,7 +126,7 @@ export const register = (app: Application) => { const sql = `DELETE FROM Event WHERE event_id = ?`; - + db.connection.query(sql, [evid], (error, results, fields) => { if (error) { return res.sendStatus(500); @@ -136,15 +136,15 @@ export const register = (app: Application) => { }); /* /events/:evid/invited */ - + // Get method (get users that are invited to the event) - app.get('/api/v1/events/:evid/invited', (req: Request, res: Response) => { + app.get("/api/v1/events/:evid/invited", (req: Request, res: Response) => { const evid = req.params.evid; if (!evid) { return res.sendStatus(400); } - const sql = `SELECT * FROM User + const sql = `SELECT * FROM User INNER JOIN Invite ON Invite.user_id = User.user_id INNER JOIN EventInvite ON @@ -156,13 +156,13 @@ export const register = (app: Application) => { return res.sendStatus(500); } return res.send({ - "invited": results + invited: results, }); }); }); // Post method (invite user to event) - app.post('/api/v1/events/:evid/invited', (req: Request, res: Response) => { + app.post("/api/v1/events/:evid/invited", (req: Request, res: Response) => { const evid = req.params.evid; const uid = req.body.uid; const message = req.body.message || "You have been invited to an event"; @@ -174,7 +174,7 @@ export const register = (app: Application) => { const sql = ` INSERT INTO Invite (user_id, message) VALUES(?, ?); - + INSERT INTO EventInvite(invite_id, event_id) SELECT Invite.invite_id, ? FROM Invite WHERE Invite.user_id = ?; `; @@ -190,7 +190,7 @@ export const register = (app: Application) => { /* /events/:evid/confirmed */ // Get method (get users that are attending event) - app.get('/api/v1/events/:evid/confirmed', (req: Request, res: Response) => { + app.get("/api/v1/events/:evid/confirmed", (req: Request, res: Response) => { const evid = req.params.evid; if (!evid) { return res.sendStatus(400); @@ -206,13 +206,13 @@ export const register = (app: Application) => { INNER JOIN RecurringAttendance ON RecurringAttendance.user_id = User.user_id WHERE RecurringAttendance.event_id = ?)`; - + db.connection.query(sql, [evid, evid], (error, results, fields) => { if (error) { return res.sendStatus(500); } return res.send({ - users: results + users: results, }); }); }); @@ -220,13 +220,13 @@ export const register = (app: Application) => { /* /events/:evid/requested */ // Get method (get users that requested to join event) - app.get('/api/v1/events/:evid/requested', (req: Request, res: Response) => { + app.get("/api/v1/events/:evid/requested", (req: Request, res: Response) => { const evid = req.params.evid; if (!evid) { return res.sendStatus(400); } - const sql = `SELECT * FROM User + const sql = `SELECT * FROM User INNER JOIN Request ON Request.user_id = User.user_id INNER JOIN EventRequest ON @@ -238,13 +238,13 @@ export const register = (app: Application) => { return res.sendStatus(500); } return res.send({ - "requested": results + requested: results, }); }); }); // Post method (request to join event) - app.post('/api/v1/events/:evid/requested', (req: Request, res: Response) => { + app.post("/api/v1/events/:evid/requested", (req: Request, res: Response) => { const evid = req.params.evid; const uid = req.body.uid; const message = req.body.message || "You have requested to join the event"; @@ -256,7 +256,7 @@ export const register = (app: Application) => { const sql = ` INSERT INTO Request (user_id, message) VALUES(?, ?); - + INSERT INTO EventRequest(request_id, event_id) SELECT Request.request_id, ? FROM Request WHERE Request.user_id = ?; `; @@ -272,7 +272,7 @@ export const register = (app: Application) => { /* /events/:evid/organizing */ // Get method (get event organizers) - app.get('/api/v1/events/:evid/organizing', (req: Request, res: Response) => { + app.get("/api/v1/events/:evid/organizing", (req: Request, res: Response) => { const evid = req.params.evid; if (!evid) { return res.sendStatus(400); @@ -283,19 +283,19 @@ export const register = (app: Application) => { INNER JOIN Organizer ON Organizer.user_id = User.user_id WHERE Organizer.event_id = ?`; - + db.connection.query(sql, [evid], (error, results, fields) => { if (error) { return res.sendStatus(500); } return res.send({ - "organizers": results + organizers: results, }); }); }); // Post method (add event organizer) - app.post('/api/v1/events/:evid/organizing', (req: Request, res: Response) => { + app.post("/api/v1/events/:evid/organizing", (req: Request, res: Response) => { const evid = req.params.evid; const uid = req.body.uid; if (!evid || !uid) { @@ -311,4 +311,4 @@ export const register = (app: Application) => { return res.sendStatus(201); }); }); -}; \ No newline at end of file +}; From ce484ef6536960a4dd6d793bd18d8081101ecc7e Mon Sep 17 00:00:00 2001 From: pro100taiyr Date: Thu, 18 Apr 2019 18:18:18 +0200 Subject: [PATCH 3/4] Fetch and pull files from develop --- .eslintrc.js | 3 + .travis.yml | 12 + ci.sh | 9 + package-lock.json | 8 +- src/routes/chats.ts | 5 +- src/routes/events.ts | 5 +- src/routes/index.ts | 6 +- src/routes/metadata.ts | 36 ++- src/routes/products.ts | 100 ++++++- src/routes/usergroups.ts | 283 +++++++++++------- src/routes/users.ts | 619 ++++++++++++++++++++------------------- src/server.ts | 26 +- src/tools/db.ts | 20 +- tslint.json | 8 +- 14 files changed, 680 insertions(+), 460 deletions(-) create mode 100644 .eslintrc.js create mode 100644 .travis.yml create mode 100755 ci.sh diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..755caef --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,3 @@ +module.exports = { + "extends": "standard" + }; \ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..62728a7 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,12 @@ +language: node_js +node_js: + - "stable" +cache: + yarn: true + directories: + - "node_modules" +before_install: + - curl -o- -L https://yarnpkg.com/install.sh | bash -s + - export PATH="$HOME/.yarn/bin:$PATH" +script: + - "./ci.sh" diff --git a/ci.sh b/ci.sh new file mode 100755 index 0000000..c05a4b0 --- /dev/null +++ b/ci.sh @@ -0,0 +1,9 @@ +#/usr/bin/env/sh +set -e + +echo "INFO: Installing dependencies" +yarn install +echo "SUCCESS: Installing dependencies" +echo "INFO: Linting" +npx tslint --project . +echo "SUCCESS: Linting" diff --git a/package-lock.json b/package-lock.json index e53c718..7524ecb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1988,9 +1988,9 @@ "dev": true }, "js-yaml": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.0.tgz", - "integrity": "sha512-pZZoSxcCYco+DIKBTimr67J6Hy+EYGZDY/HCWC+iAEA9h1ByhMXAIVUXMcMFpOCxQ/xjXmPI2MkDL5HRm5eFrQ==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -2167,7 +2167,7 @@ "mysql": { "version": "2.16.0", "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.16.0.tgz", - "integrity": "sha1-sjsiq13kT8LV0yvU9a9mU/xF4ro=", + "integrity": "sha512-dPbN2LHonQp7D5ja5DJXNbCLe/HRdu+f3v61aguzNRQIrmZLOeRoymBYyeThrR6ug+FqzDL95Gc9maqZUJS+Gw==", "requires": { "bignumber.js": "4.1.0", "readable-stream": "2.3.6", diff --git a/src/routes/chats.ts b/src/routes/chats.ts index 0c2a5c1..17e6711 100644 --- a/src/routes/chats.ts +++ b/src/routes/chats.ts @@ -1,5 +1,6 @@ -import * as db from '../tools/db'; import { Application } from "express"; +import * as db from "../tools/db"; export const register = (app: Application) => { -}; \ No newline at end of file + const todo = true; +}; diff --git a/src/routes/events.ts b/src/routes/events.ts index 0c2a5c1..17e6711 100644 --- a/src/routes/events.ts +++ b/src/routes/events.ts @@ -1,5 +1,6 @@ -import * as db from '../tools/db'; import { Application } from "express"; +import * as db from "../tools/db"; export const register = (app: Application) => { -}; \ No newline at end of file + const todo = true; +}; diff --git a/src/routes/index.ts b/src/routes/index.ts index c63bef1..d2b5539 100644 --- a/src/routes/index.ts +++ b/src/routes/index.ts @@ -2,8 +2,8 @@ import { Application, Request, Response } from "express"; export const register = (app: Application) => { - app.get('/', (req: Request, res: Response) => { - res.send('Hello Jacobs.') + app.get("/", (req: Request, res: Response) => { + res.send("Hello Jacobs."); }); -}; \ No newline at end of file +}; diff --git a/src/routes/metadata.ts b/src/routes/metadata.ts index ed1d18c..7f97032 100644 --- a/src/routes/metadata.ts +++ b/src/routes/metadata.ts @@ -1,7 +1,37 @@ -import * as db from '../tools/db'; -import { Application } from "express"; +import { Application, Request, Response } from "express"; +import * as db from "../tools/db"; // for location, categories, etc export const register = (app: Application) => { -}; \ No newline at end of file + + // GET ProductCategories + app.get("/api/v1/prodcats", (req: Request, res: Response) => { + db.connection.query("SELECT * from ProductCategory;", (error, results) => { + if (error) { + return res.sendStatus(200); + } + return res.send(results); + }); + }); + + // GET EventCategories + app.get("/api/v1/evcats", (req: Request, res: Response) => { + db.connection.query("SELECT * from EventCategory;", (error, results) => { + if (error) { + return res.sendStatus(200); + } + return res.send(results); + }); + }); + + // GET Locations + app.get("/api/v1/locations", (req: Request, res: Response) => { + db.connection.query("SELECT * from Location;", (error, results) => { + if (error) { + return res.sendStatus(200); + } + return res.send(results); + }); + }); +}; diff --git a/src/routes/products.ts b/src/routes/products.ts index 0c2a5c1..edc0386 100644 --- a/src/routes/products.ts +++ b/src/routes/products.ts @@ -1,5 +1,99 @@ -import * as db from '../tools/db'; -import { Application } from "express"; +import {Application, Request, Response} from "express"; +import * as db from "../tools/db"; export const register = (app: Application) => { -}; \ No newline at end of file + + app.get("/api/v1/products", (request: Request, response: Response) => { + db.connection.query(`SELECT * FROM Product;`, (err, res) => { + if (err) { + return response.sendStatus(500); + } else { + return response.send({ + products : res, + }); + } + }); + }); + + app.post("/api/v1/products", (request: Request, response: Response) => { + // Need: Title, price + if (!request.query.title || !request.query.price || !request.params.evcat_id || !request.params.user_id) { + return response.sendStatus(400); + } else { + const now = new Date().toISOString().slice(0, 19).replace("T", " "); + db.connection.query(`INSERT INTO Product + (evcat_id, seller_id, title, price, published, active, sold, quantity) values ('?', '?', '?', 1, 0, ?);`, + [request.params.evcat_id, request.params.user_id, request.query.title, + request.query.price, now, request.query.quantity], + (err, res) => { + if (err) { + return response.sendStatus(500); + } else { + return response.sendStatus(201); + } + }); + } + }); + + app.get("/api/v1/products/:product_id", (request: Request, response: Response) => { + db.connection.query(`SELECT * FROM Product WHERE product_id = ?`, [request.params.product_id], (err, res) => { + if (err) { + return response.sendStatus(500); + } else { + return response.send({ + product : res, + }); + } + }); + }); + + app.put("/api/v1/products/:product_id", (request: Request, response: Response) => { + db.connection.query(`UPDATE Product SET ? WHERE product_id = ?`, + [request.body, request.params.product_id], (err, res) => { + if (err) { + return response.sendStatus(500); + } else { + return response.sendStatus(200); + } + }); + }); + + app.delete("/api/v1/products/:product_id", (request: Request, response: Response) => { + db.connection.query(`DELETE FROM Product WHERE product_id = ?`, [request.params.product_id], (err, res) => { + if (err) { + return response.sendStatus(500); + } else { + return response.sendStatus(200); + } + }); + }); + + app.get("/api/v1/products/:product_id/chats", (request: Request, response: Response) => { + db.connection.query(`SELECT * FROM Chat WHERE product_id = ?`, [request.params.product_id], (err, res) => { + if (err) { + return response.sendStatus(500); + } else { + return response.send({ + chat : res, + }); + } + }); + }); + + app.post("/api/v1/products/:product_id/chats", (request: Request, response: Response) => { + // Need: product_id, buyer_id, seller_id + if (!request.params.product_id || !request.params.user_id || !request.params.seller_id) { + return response.sendStatus(400); + } else { + db.connection.query(`INSERT INTO Chat (product_id, buyer_id, seller_id) values + ('?','?','?')` , [request.params.product_id, request.params.user_id, request.params.seller_id], + (err, res) => { + if (err) { + return response.sendStatus(500); + } else { + return response.sendStatus(201); + } + }); + } + }); +}; diff --git a/src/routes/usergroups.ts b/src/routes/usergroups.ts index e03e806..505ba4a 100644 --- a/src/routes/usergroups.ts +++ b/src/routes/usergroups.ts @@ -1,89 +1,101 @@ -import * as db from '../tools/db'; -import { Application, Request, Response } from 'express'; +import { Application, Request, Response } from "express"; +import * as db from "../tools/db"; export const register = (app: Application) => { /* /usergroup endpoint */ - - // Get method - app.get('/api/v1/usergroup', (req: Request, res: Response) => { - db.connection.query('SELECT * FROM UserGroup', (error, results, fields) => { + + // Get method (get list of all usergroups) + app.get("/api/v1/usergroup", (req: Request, res: Response) => { + db.connection.query("SELECT * FROM UserGroup", (error, results, fields) => { if (error) { return res.sendStatus(500); - } - return res.send(results); + } + return res.send({ + usergroups: results, + }); }); }); - // Post method - app.post('/api/v1/usergroup', (req: Request, res: Response) => { - let title = req.query.title; - let descrip = req.query.descrip; - // it is not required to have a max capacity, because - // by default is NULL - let max_capacity = req.query.max_capacity; + // Post method (create new usergroup) + app.post("/api/v1/usergroup", (req: Request, res: Response) => { + const title = req.body.title; + const descrip = req.body.descrip; + const max_capacity = req.body.max_capacity; if (!title || !descrip || !max_capacity) { return res.sendStatus(400); } - let sql = `INSERT INTO UserGroup (title, max_capacity, descrip) VALUES(?, ?, ?)`; - db.connection.query(sql, [title, max_capacity,descrip], (error, results, fields) => { + const sql = `INSERT INTO UserGroup (title, max_capacity, descrip) VALUES(?, ?, ?)`; + db.connection.query(sql, [title, max_capacity, descrip], (error, results, fields) => { if (error) { return res.sendStatus(500); } - return res.sendStatus(200); + return res.sendStatus(201); }); }); /* /usergroup/:ugid */ // Get method (Get specific UserGroup) - app.get('/api/v1/usergroup/:ugid', (req: Request, res: Response) => { - let ugid = req.params.ugid; + app.get("/api/v1/usergroup/:ugid", (req: Request, res: Response) => { + const ugid = req.params.ugid; if (!ugid) { return res.sendStatus(400); } - let sql = `SELECT * FROM UserGroup WHERE usergroup_id = ?`; + const sql = `SELECT * FROM UserGroup WHERE usergroup_id = ?`; db.connection.query(sql, [ugid], (error, results, fields) => { if (error) { return res.sendStatus(500); } - return res.send(results); + return res.send({ + usergroup: results, + }); }); }); // PUT Method (Update Existing UserGroup) - app.put('/api/v1/usergroup/:ugid', (req: Request, res: Response) => { - let ugid = req.params.ugid; - let title = req.query.title; - let max_capacity = req.query.max_capacity; - let descrip = req.query.descrip; + app.put("/api/v1/usergroup/:ugid", (req: Request, res: Response) => { + // restrict PUT (only admin or own user) + if (req.body.key !== "5736ac861c2e50e0a2223dab84502a7e08bd904d") { + return res.sendStatus(401).send("You shall not pass"); + } + + const ugid = req.params.ugid; + const title = req.body.title; + const max_capacity = req.body.max_capacity; + const descrip = req.body.descrip; if (!ugid || !title || !descrip || !max_capacity) { return res.sendStatus(400); } - let sql = `UPDATE UserGroup + const sql = `UPDATE UserGroup SET title = ?, max_capacity = ?, descrip = ? - WHERE usergroup_id = '${ugid}' `; - - db.connection.query(sql, [title, max_capacity, descrip], (error, results, fields) => { + WHERE usergroup_id = ? `; + + db.connection.query(sql, [title, max_capacity, descrip, ugid], (error, results, fields) => { if (error) { return res.sendStatus(500); } return res.sendStatus(200); }); }); - + // Delete Method (Remove user group) - app.delete('/api/v1/usergroup/:ugid', (req: Request, res: Response) => { - let ugid = req.params.ugid; + app.delete("/api/v1/usergroup/:ugid", (req: Request, res: Response) => { + // restrict DELETE (only admin or own user) + if (req.body.key !== "5736ac861c2e50e0a2223dab84502a7e08bd904d") { + return res.sendStatus(401).send("You shall not pass"); + } + + const ugid = req.params.ugid; if (!ugid) { return res.sendStatus(400); } - - let sql = `DELETE FROM UserGroup WHERE usergroup_id = ?`; + + const sql = `DELETE FROM UserGroup WHERE usergroup_id = ?`; db.connection.query(sql, [ugid], (error, results, fields) => { if (error) { return res.sendStatus(500); @@ -95,108 +107,124 @@ export const register = (app: Application) => { /* /usergroup/:ugid/members */ // Get method (get all members of usergroup) - app.get('/api/v1/usergroup/:ugid/members', (req: Request, res: Response) => { - let ugid = req.params.ugid; + app.get("/api/v1/usergroup/:ugid/members", (req: Request, res: Response) => { + const ugid = req.params.ugid; if (!ugid) { return res.sendStatus(400); } - let sql = `SELECT user_id FROM UserGroupMembership - WHERE usergroup_id = ?`; + // const sql = `SELECT user_id FROM UserGroupMembership + // WHERE usergroup_id = ?`; + const sql = ` + SELECT * FROM User + INNER JOIN UserGroupMembership ON + UserGroupMembership.user_id = User.user_id + WHERE UserGroupMembership.usergroup_id = ?`; + db.connection.query(sql, [ugid], (error, results, fields) => { if (error) { return res.sendStatus(500); } - return res.send(results); + return res.send({ + members: results, + }); }); }); // Post method (add new member to the usergroup) - app.post('/api/v1/usergroup/:ugid/members', (req: Request, res: Response) => { - let ugid = req.params.ugid; - let user_id = req.query.user_id; + app.post("/api/v1/usergroup/:ugid/members", (req: Request, res: Response) => { + const ugid = req.params.ugid; + const user_id = req.body.user_id; if (!ugid || !user_id) { return res.sendStatus(400); } - let sql = `INSERT INTO UserGroupMembership VALUES(?, ?)`; + const sql = `INSERT INTO UserGroupMembership VALUES(?, ?)`; db.connection.query(sql, [user_id, ugid], (error, results, fields) => { if (error) { return res.sendStatus(500); } - return res.sendStatus(200); + return res.sendStatus(201); }); }); // Delete Method (remove member from an usergroup) - app.delete('/api/v1/usergroup/:ugid/members/:uid', (req: Request, res: Response) => { - let ugid = req.params.ugid; - let user_id = req.params.uid; + app.delete("/api/v1/usergroup/:ugid/members/:uid", (req: Request, res: Response) => { + const ugid = req.params.ugid; + const uid = req.params.uid; - if (!ugid || !user_id) { + if (!ugid || !uid) { return res.sendStatus(400); } - let sql = `DELETE FROM UserGroupMembership + const sql = `DELETE FROM UserGroupMembership WHERE user_id = ? AND usergroup_id = ?`; - db.connection.query(sql, [user_id, ugid], (error, results, fields) => { + db.connection.query(sql, [uid, ugid], (error, results, fields) => { if (error) { return res.sendStatus(500); - } + } return res.sendStatus(200); }); }); /* /usergroup/:ugid/owners */ - + // Get method (get all owners of an usergroup) - app.get('/api/v1/usergroup/:ugid/owners', (req: Request, res: Response) => { - let ugid = req.params.ugid; + app.get("/api/v1/usergroup/:ugid/owners", (req: Request, res: Response) => { + const ugid = req.params.ugid; if (!ugid) { return res.sendStatus(400); } - let sql = `SELECT user_id FROM UserGroupOwner - WHERE usergroup_id = ?`; + // const sql = `SELECT user_id FROM UserGroupOwner + // WHERE usergroup_id = ?`; + const sql = ` + SELECT * FROM User + INNER JOIN UserGroupOwner ON + UserGroupOwner.user_id = User.user_id + WHERE UserGroupOwner.usergroup_id = ?`; + db.connection.query(sql, [ugid], (error, results, fields) => { if (error) { return res.sendStatus(500); } - return res.send(results); + return res.send({ + owners: results, + }); }); }); // Post method (add new owner to the usergroup) - app.post('/api/v1/usergroup/:ugid/owners', (req: Request, res: Response) => { - let ugid = req.params.ugid; - let user_id = req.query.user_id; + app.post("/api/v1/usergroup/:ugid/owners", (req: Request, res: Response) => { + const ugid = req.params.ugid; + const user_id = req.body.user_id; if (!ugid || !user_id) { return res.sendStatus(400); } - let sql = `INSERT INTO UserGroupOwner VALUES(?, ?)`; + const sql = `INSERT INTO UserGroupOwner VALUES(?, ?)`; db.connection.query(sql, [user_id, ugid], (error, results, fields) => { if (error) { return res.sendStatus(500); } - return res.sendStatus(200); + return res.sendStatus(201); }); }); // Delete Method (remove owner from an usergroup) - app.delete('/api/v1/usergroup/:ugid/owners/:uid', (req: Request, res: Response) => { - let ugid = req.params.ugid; - let user_id = req.params.uid; + app.delete("/api/v1/usergroup/:ugid/owners/:uid", (req: Request, res: Response) => { + const ugid = req.params.ugid; + const uid = req.params.uid; - if (!ugid || !user_id) { + if (!ugid || !uid) { return res.sendStatus(400); } - let sql = `DELETE FROM UserGroupOwner + const sql = `DELETE FROM UserGroupOwner WHERE user_id = ? AND usergroup_id = ?`; - db.connection.query(sql, [user_id, ugid], (error, results, fields) => { + db.connection.query(sql, [uid, ugid], (error, results, fields) => { if (error) { return res.sendStatus(500); - } + } return res.sendStatus(200); }); }); @@ -204,61 +232,77 @@ export const register = (app: Application) => { /* /usergroup/:ugid/invited */ // Get method (get all invited users of an usergroup) - app.get('/api/v1/usergroup/:ugid/invited', (req: Request, res: Response) => { - let ugid = req.params.ugid; + app.get("/api/v1/usergroup/:ugid/invited", (req: Request, res: Response) => { + const ugid = req.params.ugid; if (!ugid) { return res.sendStatus(400); } - let sql = `SELECT Invite.user_id FROM Invite + /*const sql = `SELECT Invite.user_id FROM Invite INNER JOIN UserGroupInvite ON Invite.invite_id = UserGroupInvite.invite_id + WHERE UserGroupInvite.usergroup_id = ?`; */ + + const sql = ` + SELECT * FROM User + INNER JOIN Invite ON + Invite.user_id = User.user_id + INNER JOIN UserGroupInvite ON + Invite.invite_id = UserGroupInvite.invite_id WHERE UserGroupInvite.usergroup_id = ?`; - + db.connection.query(sql, [ugid], (error, results, fields) => { if (error) { return res.sendStatus(500); } - return res.send(results); + return res.send({ + invited: results, + }); }); }); // Post method (invite new user to an usergroup) - app.post('/api/v1/usergroup/:ugid/invited', (req: Request, res: Response) => { - let ugid = req.params.ugid; - // let invite_id = req.query.invite_id; - let user_id = req.query.user_id; + app.post("/api/v1/usergroup/:ugid/invited", (req: Request, res: Response) => { + const ugid = req.params.ugid; + const message = req.body.message || "You have been invited to an usergroup"; + const uid = req.body.uid; - if (!ugid || !user_id) { + if (!ugid || !uid) { return res.sendStatus(400); } - let sql = `INSERT INTO UserGroupInvite (invite_id, usergroup_id) - SELECT Invite.invite_id, ? FROM Invite WHERE user_id = ?`; + const sql = ` + INSERT INTO Invite (user_id, message) + VALUES(?, ?); + + INSERT INTO UserGroupInvite (invite_id, usergroup_id) + SELECT Invite.invite_id, ? + FROM Invite + WHERE Invite.user_id = ?; `; - db.connection.query(sql, [ugid, user_id], (error, results, fields) => { + db.connection.query(sql, [uid, message, ugid, uid], (error, results, fields) => { if (error) { return res.sendStatus(500); } - return res.sendStatus(200); + return res.sendStatus(201); }); }); // Delete Method (remove invitation of user to usergroup) - app.delete('/api/v1/usergroup/:ugid/invited/:uid', (req: Request, res: Response) => { - let ugid = req.params.ugid; - let invite_id = req.params.uid; + app.delete("/api/v1/usergroup/:ugid/invited/:uid", (req: Request, res: Response) => { + const ugid = req.params.ugid; + const inviteid = req.params.uid; - if (!ugid || !invite_id) { + if (!ugid || !inviteid) { return res.sendStatus(400); } - let sql = `DELETE FROM UserGroupInvite + const sql = `DELETE FROM UserGroupInvite WHERE invite_id = ? AND usergroup_id = ?`; - db.connection.query(sql, [invite_id, ugid], (error, results, fields) => { + db.connection.query(sql, [inviteid, ugid], (error, results, fields) => { if (error) { return res.sendStatus(500); - } + } return res.sendStatus(200); }); }); @@ -266,58 +310,75 @@ export const register = (app: Application) => { /* /usergroup/:ugid/requested */ // Get method (get all requested users of usergroup) - app.get('/api/v1/usergroup/:ugid/requested', (req: Request, res: Response) => { - let ugid = req.params.ugid; + app.get("/api/v1/usergroup/:ugid/requested", (req: Request, res: Response) => { + const ugid = req.params.ugid; if (!ugid) { return res.sendStatus(400); } - let sql = `SELECT Request.user_id FROM Request - INNER JOIN GroupRequest ON GroupRequest.request_id = Request.request_id + const sql = ` + SELECT * FROM User + INNER JOIN Request ON + Request.user_id = User.user_id + INNER JOIN GroupRequest ON + GroupRequest.request_id = Request.request_id WHERE GroupRequest.usergroup_id = ?`; db.connection.query(sql, [ugid], (error, results, fields) => { if (error) { return res.sendStatus(500); } - return res.send(results); + return res.send({ + requested: results, + }); }); }); // Post method (add a new request to join an usergroup) - app.post('/api/v1/usergroup/:ugid/requested', (req: Request, res: Response) => { - let ugid = req.params.ugid; - let request_id = req.query.request_id; + app.post("/api/v1/usergroup/:ugid/requested", (req: Request, res: Response) => { + const ugid = req.params.ugid; + const message = req.body.message || "You have requested to join an usergroup"; + const uid = req.body.uid; - if (!ugid || !request_id) { + if (!ugid || !uid) { return res.sendStatus(400); } - let sql = `INSERT INTO GroupRequest VALUES(?, ?)`; - db.connection.query(sql, [request_id, ugid], (error, results, fields) => { + // const sql = `INSERT INTO GroupRequest VALUES(?, ?)`; + + const sql = ` + INSERT INTO Request (user_id, message) + VALUES(?, ?); + + INSERT INTO GroupRequest (request_id, usergroup_id) + SELECT Request.request_id, ? + FROM Request + WHERE Request.user_id = ?;`; + + db.connection.query(sql, [uid, message, ugid, uid], (error, results, fields) => { if (error) { return res.sendStatus(500); } - return res.sendStatus(200); + return res.sendStatus(201); }); }); // Delete method (remove request to join an usergroup) - app.delete('/api/v1/usergroup/:ugid/requested/:uid', (req: Request, res: Response) => { - let ugid = req.params.ugid; - let request_id = req.params.uid; + app.delete("/api/v1/usergroup/:ugid/requested/:uid", (req: Request, res: Response) => { + const ugid = req.params.ugid; + const requestid = req.params.uid; - if (!ugid || !request_id) { + if (!ugid || !requestid) { return res.sendStatus(400); } - let sql = `DELETE FROM GroupRequest + const sql = `DELETE FROM GroupRequest WHERE request_id = ? AND usergroup_id = ? `; - db.connection.query(sql, [request_id, ugid], (error, results, fields) => { + db.connection.query(sql, [requestid, ugid], (error, results, fields) => { if (error) { return res.sendStatus(500); } return res.sendStatus(200); }); }); -}; \ No newline at end of file +}; diff --git a/src/routes/users.ts b/src/routes/users.ts index b1dee94..6660ac9 100644 --- a/src/routes/users.ts +++ b/src/routes/users.ts @@ -1,22 +1,15 @@ -import * as db from '../tools/db'; -import { Application, Response, Request, NextFunction } from "express"; -// import * as queryParser from "query-parser" +import { Application, Request, Response } from "express"; +import * as db from "../tools/db"; export const register = (app: Application) => { - // use JSON from parser middleware - /*app.use(queryParser.json()); - // use Query String Parser middleware - app.use(queryParser.urlencoded({ - extended: false - })); */ - - //Global variable - let states = ["accepted", "rejected", "interested"]; + // Global variable + const states = ["accepted", "rejected", "interested"]; function isEmpty(obj: any) { - for(var key in obj) { - if(obj.hasOwnProperty(key)) + for (const key in obj) { + if (obj.hasOwnProperty(key)) { return false; + } } return true; } @@ -24,70 +17,74 @@ export const register = (app: Application) => { /* /users endpoint */ // Get method (get list of all users) - app.get('/api/v1/users', (req: Request, res: Response) => { - db.connection.query('SELECT * FROM User', (error, results, fields) => { + app.get("/api/v1/users", (req: Request, res: Response) => { + db.connection.query("SELECT * FROM User", (error, results, fields) => { if (error) { return res.sendStatus(500); - } - return res.send(results); + } + return res.send({ + users: results, + }); }); }); // Post method (create a new user) - app.post('/api/v1/users', (req: Request, res: Response) => { + app.post("/api/v1/users", (req: Request, res: Response) => { // Need: firstname, lastname, email - let firstname = req.query.first_name; - let lastname = req.query.last_name; - let email = req.query.email; - + const firstname = req.body.first_name; + const lastname = req.body.last_name; + const email = req.body.email; + if (!firstname || !lastname || !email) { return res.sendStatus(400); } - let now = new Date().toISOString().slice(0, 19).replace('T', ' '); - let sql = `INSERT INTO User (first_name, last_name, email, activated, joined) - VALUES (?, ?, ?, ?, ?);` - - let data = [firstname, lastname, email, 1, now]; + const now = new Date().toISOString().slice(0, 19).replace("T", " "); + const sql = `INSERT INTO User (first_name, last_name, email, activated, joined) + VALUES (?, ?, ?, ?, ?);`; + + const data = [firstname, lastname, email, 1, now]; db.connection.query(sql, data, (error, results, fields) => { if (error) { return res.sendStatus(500); } - return res.sendStatus(200); + return res.sendStatus(201); }); }); /* /users/:uid endpoint */ // Get method (get specific user) - app.get('/api/v1/users/:uid', (req: Request, res: Response) => { - let uid = req.params.uid; + app.get("/api/v1/users/:uid", (req: Request, res: Response) => { + const uid = req.params.uid; if (!uid) { return res.sendStatus(400); } - let sql = `SELECT * FROM User WHERE user_id = ?`; + const sql = `SELECT * FROM User WHERE user_id = ?`; db.connection.query(sql, [uid], (error, results, fields) => { if (error) { return res.sendStatus(500); } - return res.send(results); + return res.send({ + user: results[0], + }); }); }); // Put method (update user profile) - app.put('/api/v1/users/:uid', (req: Request, res: Response, next: NextFunction) => { + app.put("/api/v1/users/:uid", (req: Request, res: Response) => { // middleware - // restrict PUT (only admin or own user), don't allow DELETE - if (req.query.key != '5736ac861c2e50e0a2223dab84502a7e08bd904d'){ - return res.sendStatus(401).send('You shall not pass'); + // restrict PUT (only admin or own user), don't allow delete + if (req.body.key !== "5736ac861c2e50e0a2223dab84502a7e08bd904d") { + return res.sendStatus(401).send("You shall not pass"); } - let uid = req.params.uid; + const uid = req.params.uid; // at least one parameter is required, at most 3 - let first_name = req.query.first_name; - let last_name = req.query.last_name; - let email = req.query.email; + const first_name = req.body.first_name; + const last_name = req.body.last_name; + const email = req.body.email; if (!uid || (!first_name && !last_name && !email)) { return res.sendStatus(400); @@ -96,16 +93,16 @@ export const register = (app: Application) => { // no matter how many parameters are passed in the range [1..3] // we are ready to handle them :) let sql = `UPDATE User SET `; - let data = []; + const data = []; - let counter = 0 + let counter = 0; if (first_name) { sql += `first_name = ? `; data.push(first_name); counter++; } if (last_name) { - if (counter != 0) { + if (counter !== 0) { sql += `, `; } sql += `last_name = ? `; @@ -113,7 +110,7 @@ export const register = (app: Application) => { counter++; } if (email) { - if (counter != 0) { + if (counter !== 0) { sql += `, `; } sql += `email = ?`; @@ -134,115 +131,114 @@ export const register = (app: Application) => { /* /users/:uid/usergroups endpoint */ // Get method (get all of user's usergroups (filter by member, owner, invited, requested)) - app.get('/api/v1/users/:uid/usergroups', (req: Request, res: Response) => { - let uid = req.params.uid; + app.get("/api/v1/users/:uid/usergroups", (req: Request, res: Response) => { + const uid = req.params.uid; // filter by parameters - let filter_by = req.query.filter_by; + const filter_by = req.body.filter_by; if (!uid) { return res.sendStatus(400); } - if (filter_by === 'member') { - let sql = `SELECT * FROM UserGroup - INNER JOIN UserGroupMembership ON + if (filter_by === "member") { + const sql = `SELECT * FROM UserGroup + INNER JOIN UserGroupMembership ON UserGroupMembership.usergroup_id = UserGroup.usergroup_id WHERE UserGroupMembership.user_id = ?`; - + db.connection.query(sql, [uid], (error, results, fields) => { if (error) { return res.sendStatus(500); } - // include links to each usergroup for (let i = 0; i < Object.keys(results).length; i++) { - results[i]["usergroup_link"] = "http://localhost:3000/api/v1/usergroup/" - + results[i]["usergroup_id"]; + results[i].usergroup_link = "http://localhost:3000/api/v1/usergroup/" + + results[i].usergroup_id; } - return res.send(results); + return res.send({ + member: results, + }); }); - } - else if (filter_by === 'owner') { - let sql = `SELECT * FROM UserGroup - INNER JOIN UserGroupOwner ON + } else if (filter_by === "owner") { + const sql = `SELECT * FROM UserGroup + INNER JOIN UserGroupOwner ON UserGroupOwner.usergroup_id = UserGroup.usergroup_id WHERE UserGroupOwner.user_id = ?`; - db.connection.query(sql, [uid], (error, results, fields) => { if (error) { return res.sendStatus(500); } - // include links to each usergroup for (let i = 0; i < Object.keys(results).length; i++) { - results[i]["usergroup_link"] = "http://localhost:3000/api/v1/usergroup/" - + results[i]["usergroup_id"]; + results[i].usergroup_link = "http://localhost:3000/api/v1/usergroup/" + + results[i].usergroup_id; } - return res.send(results); + return res.send({ + owner: results, + }); }); - } - else if (filter_by === 'invited') { - let sql = `SELECT * FROM UserGroup - INNER JOIN UserGroupInvite ON + } else if (filter_by === "invited") { + const sql = `SELECT * FROM UserGroup + INNER JOIN UserGroupInvite ON UserGroupInvite.usergroup_id = UserGroup.usergroup_id INNER JOIN Invite ON Invite.invite_id = UserGroupInvite.invite_id WHERE Invite.user_id = ?`; - - db.connection.query(sql, [uid],(error, results, fields) => { + + db.connection.query(sql, [uid], (error, results, fields) => { if (error) { return res.sendStatus(500); } - // include links to each usergroup for (let i = 0; i < Object.keys(results).length; i++) { - results[i]["usergroup_link"] = "http://localhost:3000/api/v1/usergroup/" - + results[i]["usergroup_id"]; + results[i].usergroup_link = "http://localhost:3000/api/v1/usergroup/" + + results[i].usergroup_id; } - return res.send(results); + return res.send({ + invited: results, + }); }); - } - else if (filter_by === 'requested') { - let sql = `SELECT * FROM UserGroup - INNER JOIN GroupRequest ON + } else if (filter_by === "requested") { + const sql = `SELECT * FROM UserGroup + INNER JOIN GroupRequest ON GroupRequest.usergroup_id = UserGroup.usergroup_id INNER JOIN Request ON Request.request_id = GroupRequest.request_id WHERE Request.user_id = ?`; - + db.connection.query(sql, [uid], (error, results, fields) => { if (error) { return res.sendStatus(500); } - // include links to each usergroup for (let i = 0; i < Object.keys(results).length; i++) { - results[i]["usergroup_link"] = "http://localhost:3000/api/v1/usergroup/" - + results[i]["usergroup_id"]; + results[i].usergroup_link = "http://localhost:3000/api/v1/usergroup/" + + results[i].usergroup_id; } - return res.send(results); + return res.send({ + requested: results, + }); }); - } - else { - let sql = ` - SELECT * FROM UserGroup - INNER JOIN UserGroupOwner ON + } else { + const sql = ` + SELECT * FROM UserGroup + INNER JOIN UserGroupOwner ON UserGroupOwner.usergroup_id = UserGroup.usergroup_id WHERE UserGroupOwner.user_id = ?; - SELECT * FROM UserGroup - INNER JOIN UserGroupMembership ON + SELECT * FROM UserGroup + INNER JOIN UserGroupMembership ON UserGroupMembership.usergroup_id = UserGroup.usergroup_id WHERE UserGroupMembership.user_id = ?; - SELECT * FROM UserGroup - INNER JOIN UserGroupInvite ON + SELECT * FROM UserGroup + INNER JOIN UserGroupInvite ON UserGroupInvite.usergroup_id = UserGroup.usergroup_id INNER JOIN Invite ON Invite.invite_id = UserGroupInvite.invite_id WHERE Invite.user_id = ?; - SELECT * FROM UserGroup - INNER JOIN GroupRequest ON + SELECT * FROM UserGroup + INNER JOIN GroupRequest ON GroupRequest.usergroup_id = UserGroup.usergroup_id INNER JOIN Request ON Request.request_id = GroupRequest.request_id @@ -254,60 +250,71 @@ export const register = (app: Application) => { } // include links to each usergroup for (let i = 0; i < Object.keys(results).length; i++) { - results[i]["usergroup_link"] = "http://localhost:3000/api/v1/usergroup/" - + results[i]["usergroup_id"]; - } - return res.send(results); + results[i].usergroup_link = "http://localhost:3000/api/v1/usergroup/" + + results[i].usergroup_id; + } + return res.send({ + invited: results[2], + member: results[1], + owner: results[0], + requested: results[3], + }); }); } }); /* /users/:uid/usergroups/:ugid */ - + // Get method (get user's specific usergroup) - app.get('/api/v1/users/:uid/usergroups/:ugid', (req: Request, res: Response) => { - let uid = req.params.uid; - let ugid = req.params.ugid; + app.get("/api/v1/users/:uid/usergroups/:ugid", (req: Request, res: Response) => { + const uid = req.params.uid; + const ugid = req.params.ugid; if (!uid || !ugid) { return res.sendStatus(400); } - let sql = `SELECT * FROM UserGroup - INNER JOIN UserGroupMembership ON + const sql = `SELECT * FROM UserGroup + INNER JOIN UserGroupMembership ON UserGroupMembership.usergroup_id = UserGroup.usergroup_id WHERE UserGroupMembership.user_id = ? AND UserGroupMembership.usergroup_id = ?`; - + db.connection.query(sql, [uid, ugid], (error, results, fields) => { if (error) { return res.sendStatus(500); } - return res.send(results); + // provide a link for a usergroup + results[0].usergroup_link = "http://localhost:3000/api/v1/usergroup/" + + `${ugid}`; + + return res.send({ + usergroup: results, + }); }); }); // Put method (update user's status for usergroup (Invited, Requested, member)) - app.put('/api/v1/users/:uid/usergroups/:ugid', (req: Request, res: Response) => { - let uid = req.params.uid; - let ugid = req.params.ugid; - let status = req.query.status; - let value = req.query.value; + app.put("/api/v1/users/:uid/usergroups/:ugid", (req: Request, res: Response) => { + const uid = req.params.uid; + const ugid = req.params.ugid; + const status = req.body.status; + const value = req.body.value; if (!uid || !ugid || !status || !value) { return res.sendStatus(400); } - if (status === 'requested') { - switch(value) { - case '1': { - // if admin accepted request - let sql = ` + if (status === "requested") { + switch (value) { + case "1": { + // if admin accepted request + const sql = ` INSERT INTO UserGroupMembership VALUES(?, ?); - UPDATE Request - INNER JOIN GroupRequest ON + UPDATE Request + INNER JOIN GroupRequest ON GroupRequest.request_id = Request.request_id - SET Request.decision = ? - WHERE Request.user_id = ? AND GroupRequest.usergroup_id = ?`; - + SET Request.decision = ? + WHERE Request.user_id = ? AND GroupRequest.usergroup_id = ?`; + db.connection.query(sql, [uid, ugid, states[value], uid, ugid], (error, results, fields) => { if (error) { return res.sendStatus(500); @@ -316,9 +323,9 @@ export const register = (app: Application) => { }); break; } - case '2': { + case "2": { // if admin declined request - let sql = ` + const sql = ` SET FOREIGN_KEY_CHECKS = 0; DELETE EventRequest, Request @@ -326,7 +333,7 @@ export const register = (app: Application) => { INNER JOIN Request ON Request.request_id = EventRequest.request_id WHERE Request.user_id = ? AND EventRequest.event_id = ?; - + SET FOREIGN_KEY_CHECKS = 1;`; db.connection.query(sql, [uid, ugid], (error, results, fields) => { @@ -342,20 +349,19 @@ export const register = (app: Application) => { break; } } - } - else if (status === 'invited') { - switch(value) { - case '1': { - // if user accepted invitation - let sql = ` + } else if (status === "invited") { + switch (value) { + case "1": { + // if user accepted invitation + const sql = ` INSERT INTO UserGroupMembership VALUES(?, ?); - UPDATE Invite - INNER JOIN UserGroupInvite ON + UPDATE Invite + INNER JOIN UserGroupInvite ON UserGroupInvite.invite_id = Invite.invite_id - SET Invite.decision = ? - WHERE Invite.user_id = ? AND UserGroupInvite.usergroup_id = ?`; - + SET Invite.decision = ? + WHERE Invite.user_id = ? AND UserGroupInvite.usergroup_id = ?`; + db.connection.query(sql, [uid, ugid, states[value], uid, ugid], (error, results, fields) => { if (error) { return res.sendStatus(500); @@ -364,17 +370,17 @@ export const register = (app: Application) => { }); break; } - case '2': { + case "2": { // if user rejected invitation - let sql = ` + const sql = ` SET FOREIGN_KEY_CHECKS = 0; - DELETE EventInvite, Invite + DELETE EventInvite, Invite FROM EventInvite INNER JOIN Invite ON Invite.invite_id = EventInvite.invite_id WHERE Invite.user_id = ? AND EventInvite.event_id = ?; - + SET FOREIGN_KEY_CHECKS = 1;`; db.connection.query(sql, [uid, ugid], (error, results, fields) => { @@ -390,25 +396,24 @@ export const register = (app: Application) => { break; } } - } - else { + } else { return res.sendStatus(400); } }); - // Delete method (delete user's usergroup) - app.delete('/api/v1/users/:uid/usergroups/:ugid', (req: Request, res: Response, next: NextFunction) => { - if (req.query.key != '5736ac861c2e50e0a2223dab84502a7e08bd904d'){ - return res.sendStatus(401).send('You shall not pass'); + // delete method (delete user's usergroup) + app.delete("/api/v1/users/:uid/usergroups/:ugid", (req: Request, res: Response) => { + if (req.body.key !== "5736ac861c2e50e0a2223dab84502a7e08bd904d") { + return res.sendStatus(401).send("You shall not pass"); } - - let uid = req.params.uid; - let ugid = req.params.ugid; + + const uid = req.params.uid; + const ugid = req.params.ugid; if (!uid || !ugid) { return res.sendStatus(400); } - let sql = `DELETE FROM UserGroupMembership + const sql = `DELETE FROM UserGroupMembership WHERE user_id = ? AND usergroup_id = ?`; db.connection.query(sql, [uid, ugid], (error, results, fields) => { @@ -422,16 +427,15 @@ export const register = (app: Application) => { /* /users/:uid/events endpoint */ // Get method (get all of the user's events (filter by confirmed, requested, invited, organizing)) - app.get('/api/v1/users/:uid/events', (req: Request, res: Response) => { - let uid = req.params.uid; - let filter_by = req.query.filter_by; + app.get("/api/v1/users/:uid/events", (req: Request, res: Response) => { + const uid = req.params.uid; + const filter_by = req.body.filter_by; if (!uid) { return res.sendStatus(400); } - // search both in SingularAttendance and Recurring Attendance - if (filter_by === 'confirmed') { - let sql = `(SELECT * FROM Event + if (filter_by === "confirmed") { + const sql = `(SELECT * FROM Event INNER JOIN SingularAttendance ON SingularAttendance.event_id = Event.event_id WHERE SingularAttendance.user_id = ?) @@ -440,80 +444,84 @@ export const register = (app: Application) => { INNER JOIN RecurringAttendance ON RecurringAttendance.event_id = Event.event_id WHERE RecurringAttendance.user_id = ?)`; - + db.connection.query(sql, [uid, uid], (error, results, fields) => { if (error) { return res.sendStatus(500); } - - // include links to each usergroup + + // include links to each event for (let i = 0; i < Object.keys(results).length; i++) { - results[i]["event_link"] = "http://localhost:3000/api/v1/events/" - + results[i]["event_id"]; + results[i].event_link = "http://localhost:3000/api/v1/events/" + + results[i].event_id; } - return res.send(results); + return res.send({ + confirmed: results, + }); }); - } - else if (filter_by === 'requested') { - let sql = `SELECT * FROM Event - INNER JOIN EventRequest ON + } else if (filter_by === "requested") { + const sql = `SELECT * FROM Event + INNER JOIN EventRequest ON EventRequest.event_id = Event.event_id INNER JOIN Request ON - Request.request_id = EventRequest.request_id + Request.request_id = EventRequest.request_id WHERE Request.user_id = ?`; db.connection.query(sql, [uid], (error, results, fields) => { if (error) { return res.sendStatus(500); } - // include links to each usergroup + // include links to each event for (let i = 0; i < Object.keys(results).length; i++) { - results[i]["event_link"] = "http://localhost:3000/api/v1/events/" - + results[i]["event_id"]; + results[i].event_link = "http://localhost:3000/api/v1/events/" + + results[i].event_id; } - return res.send(results); + return res.send({ + requested: results, + }); }); - } - else if (filter_by === 'invited') { - let sql = `SELECT * FROM Event - INNER JOIN EventInvite ON + } else if (filter_by === "invited") { + const sql = `SELECT * FROM Event + INNER JOIN EventInvite ON EventInvite.event_id = Event.event_id INNER JOIN Invite ON - Invite.invite_id = EventInvite.invite_id + Invite.invite_id = EventInvite.invite_id WHERE Invite.user_id = ?`; db.connection.query(sql, [uid], (error, results, fields) => { if (error) { return res.sendStatus(500); } - // include links to each usergroup + // include links to each event for (let i = 0; i < Object.keys(results).length; i++) { - results[i]["event_link"] = "http://localhost:3000/api/v1/events/" - + results[i]["event_id"]; + results[i].event_link = "http://localhost:3000/api/v1/events/" + + results[i].event_id; } - return res.send(results); + return res.send({ + invited: results, + }); }); - } - else if (filter_by === 'organizing') { - let sql = `SELECT * FROM Event + } else if (filter_by === "organizing") { + const sql = `SELECT * FROM Event INNER JOIN Organizer ON Organizer.event_id = Event.event_id WHERE Organizer.user_id = ?`; - + db.connection.query(sql, [uid], (error, results, fields) => { if (error) { return res.sendStatus(500); } - // include links to each usergroup + // include links to each event for (let i = 0; i < Object.keys(results).length; i++) { - results[i]["event_link"] = "http://localhost:3000/api/v1/events/" - + results[i]["event_id"]; + results[i].event_link = "http://localhost:3000/api/v1/events/" + + results[i].event_id; } - return res.send(results); + return res.send({ + organizing: results, + }); }); - } - else { - let sql = ` + } else { + const sql = ` SELECT * FROM Event INNER JOIN Organizer ON Organizer.event_id = Event.event_id @@ -529,30 +537,35 @@ export const register = (app: Application) => { RecurringAttendance.event_id = Event.event_id WHERE RecurringAttendance.user_id = ?); - SELECT * FROM Event - INNER JOIN EventInvite ON + SELECT * FROM Event + INNER JOIN EventInvite ON EventInvite.event_id = Event.event_id INNER JOIN Invite ON - Invite.invite_id = EventInvite.invite_id + Invite.invite_id = EventInvite.invite_id WHERE Invite.user_id = ?; - SELECT * FROM Event - INNER JOIN EventRequest ON + SELECT * FROM Event + INNER JOIN EventRequest ON EventRequest.event_id = Event.event_id INNER JOIN Request ON - Request.request_id = EventRequest.request_id + Request.request_id = EventRequest.request_id WHERE Request.user_id = ? `; - + db.connection.query(sql, [uid, uid, uid, uid, uid], (error, results, fields) => { if (error) { return res.sendStatus(500); } - // include links to each usergroup + // include links to each event for (let i = 0; i < Object.keys(results).length; i++) { - results[i]["event_link"] = "http://localhost:3000/api/v1/events/" - + results[i]["event_id"]; - } - return res.send(results); + results[i].event_link = "http://localhost:3000/api/v1/events/" + + results[i].event_id; + } + return res.send({ + confirmed: results[1], + invited: results[2], + organizing: results[0], + requested: results[3], + }); }); } }); @@ -560,17 +573,17 @@ export const register = (app: Application) => { /* /users/:uid/events/:eid endpoint */ // Get method (get specific event (can be single or recurring single)) - app.get('/api/v1/users/:uid/events/:eid', (req: Request, res: Response) => { - let uid = req.params.uid; - let eid = req.params.eid; + app.get("/api/v1/users/:uid/events/:eid", (req: Request, res: Response) => { + const uid = req.params.uid; + const eid = req.params.eid; if (!uid || !eid) { return res.sendStatus(400); } - let sql = ` (SELECT * FROM Event + const sql = ` (SELECT * FROM Event INNER JOIN SingularAttendance ON SingularAttendance.event_id = Event.event_id - WHERE + WHERE SingularAttendance.user_id = ? AND SingularAttendance.event_id = ?) UNION ALL (SELECT * FROM Event @@ -595,68 +608,72 @@ export const register = (app: Application) => { if (error) { return res.sendStatus(500); } - return res.send(results); + return res.send({ + attend_OneTimeEvent: results[1][0], + attend_RecurringEvent: results[2][0], + event: results[0][0], + }); }); }); // PUT Method (update user's status at event (Confirmed, Invited)) - app.put('/api/v1/users/:uid/events/:eid', (req: Request, res: Response) => { - let uid = req.params.uid; - let eid = req.params.eid; - let status = req.query.status; - let value = req.query.value; - + app.put("/api/v1/users/:uid/events/:eid", (req: Request, res: Response) => { + const uid = req.params.uid; + const eid = req.params.eid; + const status = req.body.status; + const value = req.body.value; + if (!uid || !eid || !status || !value) { return res.sendStatus(400); } - if (status === 'requested') { - switch(value) { - case '1': { - // if admin accepted request - let sql_check_1 = `SELECT * FROM OneTimeEvent + if (status === "requested") { + switch (value) { + case "1": { + // if admin accepted request + const sqlcheck1 = `SELECT * FROM OneTimeEvent WHERE event_id = ?`; - db.connection.query(sql_check_1, [eid], (error, results, fields) => { + db.connection.query(sqlcheck1, [eid], (error, results, _) => { if (error) { return res.sendStatus(500); } - + if (!isEmpty(results)) { - let sql = ` + const sql = ` INSERT INTO SingularAttendance VALUES(?, ?); - UPDATE Request - INNER JOIN EventRequest ON + UPDATE Request + INNER JOIN EventRequest ON EventRequest.request_id = Request.request_id - SET Request.decision = ? + SET Request.decision = ? WHERE Request.user_id = ? AND EventRequest.event_id = ?`; - db.connection.query(sql, [uid, eid, 1, uid, eid], (error, results, fields) => { - if (error) { + db.connection.query(sql, [uid, eid, 1, uid, eid], (error2, _2, _3) => { + if (error2) { return res.sendStatus(500); } return res.sendStatus(200); }); } }); - - let sql_check_2 = `SELECT * FROM RecurringEvent + + const sqlcheck2 = `SELECT * FROM RecurringEvent WHERE event_id = ?`; - db.connection.query(sql_check_2, [eid], (error, results, fields) => { + db.connection.query(sqlcheck2, [eid], (error, results, _) => { if (error) { return res.sendStatus(500); } - + if (!isEmpty(results)) { - let sql = ` + const sql = ` INSERT INTO RecurringAttendance VALUES(?, ?); - UPDATE Request - INNER JOIN EventRequest ON + UPDATE Request + INNER JOIN EventRequest ON EventRequest.request_id = Request.request_id - SET Request.decision = ? + SET Request.decision = ? WHERE Request.user_id = ? AND EventRequest.event_id = ?`; - - db.connection.query(sql, [uid, eid, 1, uid, eid], (error, results, fields) => { - if (error) { + + db.connection.query(sql, [uid, eid, 1, uid, eid], (error2, _2, _3) => { + if (error2) { return res.sendStatus(500); } return res.sendStatus(200); @@ -665,17 +682,17 @@ export const register = (app: Application) => { }); break; } - case '2': { + case "2": { // if admin declined request - let sql = ` + const sql = ` SET FOREIGN_KEY_CHECKS = 0; - DELETE EventRequest, Request + delete EventRequest, Request FROM EventRequest INNER JOIN Request ON Request.request_id = EventRequest.request_id WHERE Request.user_id = ? AND EventRequest.event_id = ?; - + SET FOREIGN_KEY_CHECKS = 1;`; db.connection.query(sql, [uid, eid], (error, results, fields) => { @@ -691,54 +708,53 @@ export const register = (app: Application) => { break; } } - } - else if (status === 'invited') { - switch(value) { - case '1': { - // if admin accepted request - let sql_check_1 = `SELECT * FROM OneTimeEvent + } else if (status === "invited") { + switch (value) { + case "1": { + // if admin accepted request + const sqlcheck1 = `SELECT * FROM OneTimeEvent WHERE event_id = ?`; - db.connection.query(sql_check_1, [eid], (error, results, fields) => { + db.connection.query(sqlcheck1, [eid], (error, results, _) => { if (error) { return res.sendStatus(500); } - + if (!isEmpty(results)) { - let sql = ` + const sql = ` INSERT INTO SingularAttendance VALUES(?, ?); - UPDATE Invite - INNER JOIN UserGroupInvite ON + UPDATE Invite + INNER JOIN UserGroupInvite ON UserGroupInvite.invite_id = Invite.invite_id - SET Invite.decision = ? + SET Invite.decision = ? WHERE Invite.user_id = ? AND UserGroupInvite.usergroup_id = ?`; - db.connection.query(sql, [uid, eid, states[value], uid, eid], (error, results, fields) => { - if (error) { + db.connection.query(sql, [uid, eid, states[value], uid, eid], (error2, _2, _3) => { + if (error2) { return res.sendStatus(500); } return res.sendStatus(200); }); } }); - - let sql_check_2 = `SELECT * FROM RecurringEvent + + const sqlcheck2 = `SELECT * FROM RecurringEvent WHERE event_id = ?`; - db.connection.query(sql_check_2, [eid], (error, results, fields) => { + db.connection.query(sqlcheck2, [eid], (error, results, _) => { if (error) { return res.sendStatus(500); } - + if (!isEmpty(results)) { - let sql = ` + const sql = ` INSERT INTO RecurringAttendance VALUES(?, ?); - UPDATE Invite - INNER JOIN UserGroupInvite ON + UPDATE Invite + INNER JOIN UserGroupInvite ON UserGroupInvite.invite_id = Invite.invite_id - SET Invite.decision = ? + SET Invite.decision = ? WHERE Invite.user_id = ? AND UserGroupInvite.usergroup_id = ?`; - - db.connection.query(sql, [uid, eid, states[value], uid, eid], (error, results, fields) => { - if (error) { + + db.connection.query(sql, [uid, eid, states[value], uid, eid], (error2, _2, _3) => { + if (error2) { return res.sendStatus(500); } return res.sendStatus(200); @@ -747,17 +763,17 @@ export const register = (app: Application) => { }); break; } - case '2': { + case "2": { // if user rejected invitation - let sql = ` + const sql = ` SET FOREIGN_KEY_CHECKS = 0; - DELETE EventInvite, Invite + delete EventInvite, Invite FROM EventInvite INNER JOIN Invite ON Invite.invite_id = EventInvite.invite_id WHERE Invite.user_id = ? AND EventInvite.event_id = ?; - + SET FOREIGN_KEY_CHECKS = 1;`; db.connection.query(sql, [uid, eid], (error, results, fields) => { @@ -773,17 +789,16 @@ export const register = (app: Application) => { break; } } - } - else { + } else { return res.sendStatus(400); - } + } }); - // Delete method (remove event from user's events (delete event for user, for everyone if organizer)) - app.delete('/api/v1/users/:uid/events/:eid', (req: Request, res: Response) => { - let uid = req.params.uid; - let eid = req.params.eid; - + // delete method (remove event from user's events (delete event for user, for everyone if organizer)) + app.delete("/api/v1/users/:uid/events/:eid", (req: Request, res: Response) => { + const uid = req.params.uid; + const eid = req.params.eid; + if (!uid || !eid) { return res.sendStatus(400); } @@ -791,17 +806,17 @@ export const register = (app: Application) => { // disable the foreign key check // re-enable foreign key check. // SET FOREIGN_KEY_CHECKS - let sql = ` + const sql = ` DELETE FROM SingularAttendance WHERE SingularAttendance.user_id = ? AND SingularAttendance.event_id = ?; - DELETE FROM RecurringAttendance + DELETE FROM RecurringAttendance WHERE RecurringAttendance.user_id = ? AND RecurringAttendance.event_id = ?; DELETE FROM Organizer WHERE Organizer.user_id = ? AND Organizer.event_id = ?;`; - db.connection.query(sql, [uid, eid, uid, eid, uid, eid, uid, eid, uid, eid], + db.connection.query(sql, [uid, eid, uid, eid, uid, eid, uid, eid, uid, eid], (error, results, fields) => { if (error) { return res.sendStatus(500); @@ -813,52 +828,38 @@ export const register = (app: Application) => { /* /users//products endpoint */ // Get method (get all products by the user (as seller)) - app.get('/api/v1/users/:uid/products', (req: Request, res: Response) => { - let uid = req.params.uid; + app.get("/api/v1/users/:uid/products", (req: Request, res: Response) => { + const uid = req.params.uid; if (!uid) { return res.sendStatus(400); } - let sql = `SELECT * FROM Product WHERE seller_id = ?`; + const sql = `SELECT * FROM Product WHERE seller_id = ?`; db.connection.query(sql, [uid], (error, results, fields) => { if (error) { return res.sendStatus(500); } - return res.send(results); + return res.send({ + products: results, + }); }); }); /* /users//chats endpoint */ - app.get('/api/v1/users/:uid/chats', (req: Request, res: Response) => { - let uid = req.params.uid; + app.get("/api/v1/users/:uid/chats", (req: Request, res: Response) => { + const uid = req.params.uid; if (!uid) { return res.sendStatus(400); } - let sql = `SELECT * FROM Chat WHERE buyer_id = ? OR seller_id = ?`; + const sql = `SELECT * FROM Chat WHERE buyer_id = ? OR seller_id = ?`; db.connection.query(sql, [uid, uid], (error, results, fields) => { if (error) { return res.sendStatus(500); } - return res.send(results); + return res.send({ + chats: results, + }); }); }); }; - -/* - SET FOREIGN_KEY_CHECKS = 0; - - DELETE EventInvite, Invite - FROM EventInvite - INNER JOIN Invite ON - Invite.invite_id = EventInvite.invite_id - WHERE Invite.user_id = ? AND EventInvite.event_id = ? - DELETE EventRequest, Request - FROM EventRequest - INNER JOIN Request ON - Request.request_id = EventRequest.request_id - WHERE Request.user_id = ? AND EventRequest.event_id = ? - - SET FOREIGN_KEY_CHECKS = 1; - -*/ \ No newline at end of file diff --git a/src/server.ts b/src/server.ts index 3058cee..97f905d 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,14 +1,22 @@ -import express from 'express'; -import * as chats from './routes/chats'; -import * as events from './routes/events'; -import * as index from './routes/index'; -import * as metadata from './routes/metadata'; -import * as products from './routes/products'; -import * as usergroups from './routes/usergroups'; -import * as users from './routes/users'; +import * as bodyParser from "body-parser"; +import express from "express"; +import * as chats from "./routes/chats"; +import * as events from "./routes/events"; +import * as index from "./routes/index"; +import * as metadata from "./routes/metadata"; +import * as products from "./routes/products"; +import * as usergroups from "./routes/usergroups"; +import * as users from "./routes/users"; const app = express(); +// use JSON from parser middleware +app.use(bodyParser.json()); +// use Query String Parser middleware +app.use(bodyParser.urlencoded({ + extended: true, +})); + chats.register(app); events.register(app); index.register(app); @@ -18,5 +26,5 @@ usergroups.register(app); users.register(app); app.listen(3000, () => { - console.log('App listening on port 3000.') + console.log("App listening on port 3000."); }); diff --git a/src/tools/db.ts b/src/tools/db.ts index 6ec7c84..f012070 100644 --- a/src/tools/db.ts +++ b/src/tools/db.ts @@ -1,14 +1,16 @@ -import mysql from 'mysql'; +import mysql from "mysql"; export const connection = mysql.createConnection({ - host: 'localhost', - user: 'root', - password: 'root', - database: 'JacobsApp', + database: "JacobsApp", + host: "localhost", + multipleStatements: true, + password: "root", port: 3306, - multipleStatements: true + user: "root", }); -connection.connect(function(err) { - if (err) console.log(err); -}); \ No newline at end of file +connection.connect((err) => { + if (err) { + console.log(err); + } +}); diff --git a/tslint.json b/tslint.json index 5c48738..0a27bf7 100644 --- a/tslint.json +++ b/tslint.json @@ -5,9 +5,7 @@ ], "jsRules": {}, "rules": { - "interface-name": [false], - "no-console": [false], - "quotemark": [true, "single"] - }, + "no-console": false + }, "rulesDirectory": [] -} +} \ No newline at end of file From 61b6fef125df2c1b1ec1a2a070664ae2dd0c378f Mon Sep 17 00:00:00 2001 From: pro100taiyr Date: Fri, 19 Apr 2019 15:33:14 +0200 Subject: [PATCH 4/4] Add filtering by category, time and location --- src/routes/events.ts | 369 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 365 insertions(+), 4 deletions(-) diff --git a/src/routes/events.ts b/src/routes/events.ts index 17e6711..c1108f9 100644 --- a/src/routes/events.ts +++ b/src/routes/events.ts @@ -1,6 +1,367 @@ -import { Application } from "express"; -import * as db from "../tools/db"; +import * as db from '../tools/db'; +import { Application, Request, Response } from "express"; export const register = (app: Application) => { - const todo = true; -}; + /* /events endpoint */ + + // Get method (get all events (filter by category, location, time)) + app.get('/api/v1/events', (req: Request, res: Response) => { + const filter_by = req.body.filter_by; + const value_filter = req.body.value_filter; // for category and location + // for time + const start_time = req.body.start_time; + const end_time = req.body.end_time; + + if (filter_by === 'category') { + const sql = ` + SELECT * FROM Event + INNER JOIN EventCategory ON + EventCategory.evcat_id = Event.evcat_id + WHERE EventCategory.title = ?`; + + db.connection.query(sql, [value_filter], (error, results, fields) => { + if (error) { + return res.sendStatus(500); + } + return res.send({ + "events": results + }); + }); + } + else if (filter_by === 'location') { + const sql = ` + SELECT * FROM Event + INNER JOIN Location ON + Location.location_id = Event.location_id + WHERE Location.title = ?`; + + db.connection.query(sql, [value_filter], (error, results, fields) => { + if (error) { + return res.sendStatus(500); + } + return res.send({ + "events": results + }); + }); + } + else if (filter_by === 'time') { + const sql = ` + SELECT * FROM Event + INNER JOIN OneTimeEvent ON + OneTimeEvent.event_id = Event.event_id + WHERE OneTimeEvent.start_time >= ? AND OneTimeEvent.end_time <= ?; + + SELECT * FROM Event + INNER JOIN RecurringEvent ON + RecurringEvent.event_id = Event.event_id + INNER JOIN RecurringSingleEvent ON + RecurringSingleEvent.recurringevent_id = RecurringEvent.recurringevent_id + WHERE RecurringSingleEvent.start_time >= ? AND RecurringSingleEvent.end_time <= ?;`; + + db.connection.query(sql, [start_time, end_time, start_time, end_time], + (error, results, fields) => { + if (error) { + return res.sendStatus(500); + } + + return res.send({ + "events": results[0].concat(results[1]) + }); + }); + } + else { + const sql = `SELECT * FROM Event`; + + db.connection.query(sql, (error, results, fields) => { + if (error) { + return res.sendStatus(500); + } + return res.send({ + "events": results + }); + }); + } + }); + + // Post method (create new event) + app.post('/api/v1/events', (req: Request, res: Response) => { + const title = req.body.title; + const max_capacity = req.body.max_capacity; + const content = req.body.content; + const ugid = req.body.ugid; + const lid = req.body.lid; + const evcat_id = req.body.evcat_id; + + if (!title || !ugid || !lid || !evcat_id) { + return res.sendStatus(400); + } + + const sql = `INSERT INTO Event (title, public, max_capacity, content, + usergroup_id, location_id, evcat_id) VALUES(?, ?, ?, ?, ?, ?, ?)`; + db.connection.query(sql, [title, 1, max_capacity, content, ugid, lid, evcat_id], + (error, results, fields) => { + + if (error) { + return res.sendStatus(500); + } + return res.sendStatus(201); + }); + }); + + /* /events/:evid */ + + // Get method (can be single, recurring single or recurring (?) event) + // get specific event + app.get('/api/v1/events/:evid', (req: Request, res: Response) => { + const evid = req.params.evid; + if (!evid) { + return res.sendStatus(400); + } + + const sql = ` + SELECT * FROM OneTimeEvent + WHERE event_id = ?; + + SELECT * FROM RecurringEvent + INNER JOIN RecurringSingleEvent ON + RecurringSingleEvent.recurringevent_id = RecurringEvent.recurringevent_id + WHERE RecurringEvent.event_id = ?`; + + db.connection.query(sql, [evid, evid], (error, results, fields) => { + if (error) { + return res.sendStatus(500); + } + + return res.send({ + "OneTimeEvent": results[0], + "RecurringEvent": results[1] + }); + }); + }); + + // Put method (update existing event) + app.put('/api/v1/events/:evid', (req: Request, res: Response) => { + const evid = req.params.evid; + const title = req.body.title; + const max_capacity = req.body.max_capacity; + const content = req.body.content; + const ugid = req.body.ugid; + const lid = req.body.lid; + const evcat_id = req.body.evcat_id; + if (!evid || !title || !max_capacity || !content + || !ugid || !lid || !evcat_id) { + return res.sendStatus(400); + } + + const sql = ` + UPDATE Event + SET title = ?, max_capacity = ?, content = ?, + usergroup_id = ?, usergroup_id = ?, evcat_id = ? + WHERE event_id = ?`; + + db.connection.query(sql, [title, max_capacity, content, + ugid, lid, evcat_id, evid], (error, results, fields) => { + + if (error) { + return res.sendStatus(500); + } + + return res.sendStatus(200); + }); + }); + + // Delete Method (remove existing event) + app.delete('/api/v1/events/:evid', (req: Request, res: Response) => { + const evid = req.params.evid; + if (!evid) { + return res.sendStatus(400); + } + + const sql = `DELETE FROM Event + WHERE event_id = ?`; + + db.connection.query(sql, [evid], (error, results, fields) => { + if (error) { + return res.sendStatus(500); + } + return res.sendStatus(200); + }); + }); + + /* /events/:evid/invited */ + + // Get method (get users that are invited to the event) + app.get('/api/v1/events/:evid/invited', (req: Request, res: Response) => { + const evid = req.params.evid; + if (!evid) { + return res.sendStatus(400); + } + + const sql = `SELECT * FROM User + INNER JOIN Invite ON + Invite.user_id = User.user_id + INNER JOIN EventInvite ON + EventInvite.invite_id = Invite.invite_id + WHERE EventInvite.event_id = ?`; + + db.connection.query(sql, [evid], (error, results, fields) => { + if (error) { + return res.sendStatus(500); + } + return res.send({ + "invited": results + }); + }); + }); + + // Post method (invite user to event) + app.post('/api/v1/events/:evid/invited', (req: Request, res: Response) => { + const evid = req.params.evid; + const uid = req.body.uid; + const message = req.body.message || "You have been invited to an event"; + if (!evid || !uid) { + return res.sendStatus(400); + } + + // create new Invite + const sql = ` + INSERT INTO Invite (user_id, message) + VALUES(?, ?); + + INSERT INTO EventInvite(invite_id, event_id) + SELECT Invite.invite_id, ? FROM Invite + WHERE Invite.user_id = ?; `; + + db.connection.query(sql, [uid, message, evid, uid], (error, results, fields) => { + if (error) { + return res.sendStatus(500); + } + return res.sendStatus(201); + }); + }); + + /* /events/:evid/confirmed */ + + // Get method (get users that are attending event) + app.get('/api/v1/events/:evid/confirmed', (req: Request, res: Response) => { + const evid = req.params.evid; + if (!evid) { + return res.sendStatus(400); + } + + const sql = ` + (SELECT * FROM User + INNER JOIN SingularAttendance ON + SingularAttendance.user_id = User.user_id + WHERE SingularAttendance.event_id = ?) + UNION ALL + (SELECT * FROM User + INNER JOIN RecurringAttendance ON + RecurringAttendance.user_id = User.user_id + WHERE RecurringAttendance.event_id = ?)`; + + db.connection.query(sql, [evid, evid], (error, results, fields) => { + if (error) { + return res.sendStatus(500); + } + return res.send({ + users: results + }); + }); + }); + + /* /events/:evid/requested */ + + // Get method (get users that requested to join event) + app.get('/api/v1/events/:evid/requested', (req: Request, res: Response) => { + const evid = req.params.evid; + if (!evid) { + return res.sendStatus(400); + } + + const sql = `SELECT * FROM User + INNER JOIN Request ON + Request.user_id = User.user_id + INNER JOIN EventRequest ON + EventRequest.request_id = Request.request_id + WHERE EventRequest.event_id = ?`; + + db.connection.query(sql, [evid], (error, results, fields) => { + if (error) { + return res.sendStatus(500); + } + return res.send({ + "requested": results + }); + }); + }); + + // Post method (request to join event) + app.post('/api/v1/events/:evid/requested', (req: Request, res: Response) => { + const evid = req.params.evid; + const uid = req.body.uid; + const message = req.body.message || "You have requested to join the event"; + if (!evid || !uid) { + return res.sendStatus(400); + } + + // create new Request + const sql = ` + INSERT INTO Request (user_id, message) + VALUES(?, ?); + + INSERT INTO EventRequest(request_id, event_id) + SELECT Request.request_id, ? FROM Request + WHERE Request.user_id = ?; `; + + db.connection.query(sql, [uid, message, evid, uid], (error, results, fields) => { + if (error) { + return res.sendStatus(500); + } + return res.sendStatus(201); + }); + }); + + /* /events/:evid/organizing */ + + // Get method (get event organizers) + app.get('/api/v1/events/:evid/organizing', (req: Request, res: Response) => { + const evid = req.params.evid; + if (!evid) { + return res.sendStatus(400); + } + + const sql = ` + SELECT * FROM User + INNER JOIN Organizer ON + Organizer.user_id = User.user_id + WHERE Organizer.event_id = ?`; + + db.connection.query(sql, [evid], (error, results, fields) => { + if (error) { + return res.sendStatus(500); + } + return res.send({ + "organizers": results + }); + }); + }); + + // Post method (add event organizer) + app.post('/api/v1/events/:evid/organizing', (req: Request, res: Response) => { + const evid = req.params.evid; + const uid = req.body.uid; + if (!evid || !uid) { + return res.sendStatus(400); + } + + const sql = `INSERT INTO Organizer (user_id, event_id) + VALUES(?, ?)`; + db.connection.query(sql, [uid, evid], (error, results, fields) => { + if (error) { + return res.sendStatus(500); + } + return res.sendStatus(201); + }); + }); +}; \ No newline at end of file