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/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/events.ts b/src/routes/events.ts index 17e6711..ea4ca3a 100644 --- a/src/routes/events.ts +++ b/src/routes/events.ts @@ -1,6 +1,360 @@ -import { Application } from "express"; +import { Application, Request, Response } from "express"; import * as db from "../tools/db"; 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 diff --git a/src/routes/products.ts b/src/routes/products.ts index 17e6711..edc0386 100644 --- a/src/routes/products.ts +++ b/src/routes/products.ts @@ -1,6 +1,99 @@ -import { Application } from "express"; +import {Application, Request, Response} from "express"; import * as db from "../tools/db"; export const register = (app: Application) => { - const todo = true; + + 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/users.ts b/src/routes/users.ts index db265d6..6660ac9 100644 --- a/src/routes/users.ts +++ b/src/routes/users.ts @@ -1,4 +1,4 @@ -import { Application } from "express"; +import { Application, Request, Response } from "express"; import * as db from "../tools/db"; export const register = (app: Application) => {