From e3545760e4db42a0528c49396aa0b757d10356f5 Mon Sep 17 00:00:00 2001 From: Zion Mateo Date: Thu, 2 Jan 2025 13:58:23 -0800 Subject: [PATCH 01/12] added GET /comments/:id --- server/routes/comments.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 server/routes/comments.ts diff --git a/server/routes/comments.ts b/server/routes/comments.ts new file mode 100644 index 0000000..6a2ea49 --- /dev/null +++ b/server/routes/comments.ts @@ -0,0 +1,17 @@ +import express from "express"; + +import { keysToCamel } from "../common/utils"; +import {db} from "../db/db-pgp"; + +const commentsRouter = express.Router(); +commentsRouter.use(express.json()); + +commentsRouter.get("/:id", async (req, res) => { + try { + const {id} = req.params; + const data = await db.query("SELECT * FROM comments WHERE id = $1", [id]); + res.status(200).json(keysToCamel(data)); + } catch (err) { + res.status(500).send(err.message); + } +}); From 7fcdcbd86f1eeeb1b3a8d6928b8c370fbf068b5c Mon Sep 17 00:00:00 2001 From: Zion Mateo Date: Thu, 2 Jan 2025 18:13:37 -0800 Subject: [PATCH 02/12] added DELETE for users/:id, changed firebaseUid delete to /users/:firebaseUid --- server/routes/users.ts | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/server/routes/users.ts b/server/routes/users.ts index c8c3499..b054142 100644 --- a/server/routes/users.ts +++ b/server/routes/users.ts @@ -34,11 +34,16 @@ usersRouter.get("/:firebaseUid", async (req, res) => { }); // Delete a user by ID, both in Firebase and NPO DB -usersRouter.delete("/:firebaseUid", async (req, res) => { +usersRouter.delete("/users/:firebaseUid", async (req, res) => { try { const { firebaseUid } = req.params; - await admin.auth().deleteUser(firebaseUid); + if (firebaseUid) { + await admin.auth().deleteUser(firebaseUid); + } else { + throw new Error("firebaseUid is undefined"); + } + const user = await db.query("DELETE FROM users WHERE firebase_uid = $1", [ firebaseUid, ]); @@ -49,6 +54,19 @@ usersRouter.delete("/:firebaseUid", async (req, res) => { } }); +// Delete a user by their account ID (not based on Firebase Uid) +usersRouter.delete("/users/:id", async (req, res) => { + try { + const { id } = req.params; + + await db.query("DELETE FROM users WHERE id = $1", [id]); + + res.status(200).send(`ID ${id} deleted from the users table`); + } catch (err) { + res.status(400).send(err.message); + } +}); + // Create user usersRouter.post("/create", async (req, res) => { try { From eccd1dda4e4189f24c79d5bfbd38de554513efad Mon Sep 17 00:00:00 2001 From: margoglvz Date: Thu, 2 Jan 2025 23:02:01 -0800 Subject: [PATCH 03/12] added GET /comments/invoice/:id --- server/routes/comments.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/server/routes/comments.ts b/server/routes/comments.ts index 6a2ea49..49e9c06 100644 --- a/server/routes/comments.ts +++ b/server/routes/comments.ts @@ -15,3 +15,16 @@ commentsRouter.get("/:id", async (req, res) => { res.status(500).send(err.message); } }); + +// GET /comments/invoice/:id +// Returns all comments that much up that invoice ID +commentsRouter.get("/invoice/:id", async (req, res) => { + try { + const {id} = req.params; + const data = await db.query("SELECT * FROM comments WHERE invoice_id = $1", [id]); + res.status(200).json(keysToCamel(data)); + } catch (err) { + res.status(404).send(err.message); + } +}); + From 4bb21633ee1eaba38bb0c2cfeb726012a4aefacf Mon Sep 17 00:00:00 2001 From: margoglvz Date: Thu, 2 Jan 2025 23:02:40 -0800 Subject: [PATCH 04/12] added GET /comments/booking/:id --- server/routes/comments.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/server/routes/comments.ts b/server/routes/comments.ts index 49e9c06..a4e9181 100644 --- a/server/routes/comments.ts +++ b/server/routes/comments.ts @@ -28,3 +28,14 @@ commentsRouter.get("/invoice/:id", async (req, res) => { } }); +// GET /comments/booking/:id +// Returns all comments that much up that invoice ID +commentsRouter.get("/booking/:id", async (req, res) => { + try { + const {id} = req.params; + const data = await db.query("SELECT * FROM comments WHERE booking_id = $1", [id]); + res.status(200).json(keysToCamel(data)); + } catch (err) { + res.status(500).send(err.message); + } +}); From 42af5a2c06088f23634b70348a418a20942804ca Mon Sep 17 00:00:00 2001 From: margoglvz Date: Thu, 2 Jan 2025 23:13:35 -0800 Subject: [PATCH 05/12] changed error --- server/routes/comments.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/routes/comments.ts b/server/routes/comments.ts index a4e9181..4cc9b25 100644 --- a/server/routes/comments.ts +++ b/server/routes/comments.ts @@ -24,7 +24,7 @@ commentsRouter.get("/invoice/:id", async (req, res) => { const data = await db.query("SELECT * FROM comments WHERE invoice_id = $1", [id]); res.status(200).json(keysToCamel(data)); } catch (err) { - res.status(404).send(err.message); + res.status(500).send(err.message); } }); From e85daccba071fc1e95f77592ff56a228c6e1fc59 Mon Sep 17 00:00:00 2001 From: Nathan Pietrantonio Date: Thu, 9 Jan 2025 12:09:48 -0800 Subject: [PATCH 06/12] chore: comment unused code Commented out boilerplate endpoints for clarity --- server/routes/users.ts | 165 +++++++++++++++++++++-------------------- 1 file changed, 84 insertions(+), 81 deletions(-) diff --git a/server/routes/users.ts b/server/routes/users.ts index b054142..efac3d5 100644 --- a/server/routes/users.ts +++ b/server/routes/users.ts @@ -8,51 +8,54 @@ import { verifyRole } from "../src/middleware"; export const usersRouter = Router(); // Get all users -usersRouter.get("/", async (req, res) => { - try { - const users = await db.query(`SELECT * FROM users ORDER BY id ASC`); +// usersRouter.get("/", async (req, res) => { +// try { +// const users = await db.query(`SELECT * FROM users ORDER BY id ASC`); - res.status(200).json(keysToCamel(users)); - } catch (err) { - res.status(400).send(err.message); - } -}); +// res.status(200).json(keysToCamel(users)); +// } catch (err) { +// res.status(400).send(err.message); +// } +// }); // Get a user by ID -usersRouter.get("/:firebaseUid", async (req, res) => { - try { - const { firebaseUid } = req.params; +// usersRouter.get("/:firebaseUid", async (req, res) => { +// try { +// const { firebaseUid } = req.params; - const user = await db.query("SELECT * FROM users WHERE firebase_uid = $1", [ - firebaseUid, - ]); +// const user = await db.query("SELECT * FROM users WHERE firebase_uid = $1", [ +// firebaseUid, +// ]); - res.status(200).json(keysToCamel(user)); - } catch (err) { - res.status(400).send(err.message); - } -}); +// res.status(200).json(keysToCamel(user)); +// } catch (err) { +// res.status(400).send(err.message); +// } +// }); // Delete a user by ID, both in Firebase and NPO DB -usersRouter.delete("/users/:firebaseUid", async (req, res) => { - try { - const { firebaseUid } = req.params; - if (firebaseUid) { - await admin.auth().deleteUser(firebaseUid); - } else { - throw new Error("firebaseUid is undefined"); - } +// IGNORE THIS FOR NOW + +// usersRouter.delete("/users/:firebaseUid", async (req, res) => { +// try { +// const { firebaseUid } = req.params; + +// if (firebaseUid) { +// await admin.auth().deleteUser(firebaseUid); +// } else { +// throw new Error("firebaseUid is undefined"); +// } - const user = await db.query("DELETE FROM users WHERE firebase_uid = $1", [ - firebaseUid, - ]); +// const user = await db.query("DELETE FROM users WHERE firebase_uid = $1", [ +// firebaseUid, +// ]); - res.status(200).json(keysToCamel(user)); - } catch (err) { - res.status(400).send(err.message); - } -}); +// res.status(200).json(keysToCamel(user)); +// } catch (err) { +// res.status(400).send(err.message); +// } +// }); // Delete a user by their account ID (not based on Firebase Uid) usersRouter.delete("/users/:id", async (req, res) => { @@ -68,60 +71,60 @@ usersRouter.delete("/users/:id", async (req, res) => { }); // Create user -usersRouter.post("/create", async (req, res) => { - try { - const { email, firebaseUid } = req.body; +// usersRouter.post("/create", async (req, res) => { +// try { +// const { email, firebaseUid } = req.body; - const user = await db.query( - "INSERT INTO users (email, firebase_uid) VALUES ($1, $2) RETURNING *", - [email, firebaseUid] - ); +// const user = await db.query( +// "INSERT INTO users (email, firebase_uid) VALUES ($1, $2) RETURNING *", +// [email, firebaseUid] +// ); - res.status(200).json(keysToCamel(user)); - } catch (err) { - res.status(500).send(err.message); - } -}); +// res.status(200).json(keysToCamel(user)); +// } catch (err) { +// res.status(500).send(err.message); +// } +// }); // Update a user by ID -usersRouter.put("/update", async (req, res) => { - try { - const { email, firebaseUid } = req.body; +// usersRouter.put("/update", async (req, res) => { +// try { +// const { email, firebaseUid } = req.body; - const user = await db.query( - "UPDATE users SET email = $1 WHERE firebase_uid = $2 RETURNING *", - [email, firebaseUid] - ); +// const user = await db.query( +// "UPDATE users SET email = $1 WHERE firebase_uid = $2 RETURNING *", +// [email, firebaseUid] +// ); - res.status(200).json(keysToCamel(user)); - } catch (err) { - res.status(400).send(err.message); - } -}); +// res.status(200).json(keysToCamel(user)); +// } catch (err) { +// res.status(400).send(err.message); +// } +// }); // Get all users (as admin) -usersRouter.get("/admin/all", verifyRole("admin"), async (req, res) => { - try { - const users = await db.query(`SELECT * FROM users`); +// usersRouter.get("/admin/all", verifyRole("admin"), async (req, res) => { +// try { +// const users = await db.query(`SELECT * FROM users`); - res.status(200).json(keysToCamel(users)); - } catch (err) { - res.status(400).send(err.message); - } -}); +// res.status(200).json(keysToCamel(users)); +// } catch (err) { +// res.status(400).send(err.message); +// } +// }); // Update a user's role -usersRouter.put("/update/set-role", verifyRole("admin"), async (req, res) => { - try { - const { role, firebaseUid } = req.body; - - const user = await db.query( - "UPDATE users SET role = $1 WHERE firebase_uid = $2 RETURNING *", - [role, firebaseUid] - ); - - res.status(200).json(keysToCamel(user)); - } catch (err) { - res.status(400).send(err.message); - } -}); +// usersRouter.put("/update/set-role", verifyRole("admin"), async (req, res) => { +// try { +// const { role, firebaseUid } = req.body; + +// const user = await db.query( +// "UPDATE users SET role = $1 WHERE firebase_uid = $2 RETURNING *", +// [role, firebaseUid] +// ); + +// res.status(200).json(keysToCamel(user)); +// } catch (err) { +// res.status(400).send(err.message); +// } +// }); From 3b5b90f8b99dbac010ba07500883fab289e5022f Mon Sep 17 00:00:00 2001 From: margoglvz Date: Sun, 12 Jan 2025 20:00:31 -0800 Subject: [PATCH 07/12] Fix comments router --- server/routes/comments.ts | 2 ++ server/src/app.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/server/routes/comments.ts b/server/routes/comments.ts index 4cc9b25..2eea199 100644 --- a/server/routes/comments.ts +++ b/server/routes/comments.ts @@ -39,3 +39,5 @@ commentsRouter.get("/booking/:id", async (req, res) => { res.status(500).send(err.message); } }); + +export { commentsRouter }; \ No newline at end of file diff --git a/server/src/app.ts b/server/src/app.ts index baf7542..f9e4cd7 100644 --- a/server/src/app.ts +++ b/server/src/app.ts @@ -6,6 +6,7 @@ import schedule from "node-schedule"; // TODO: Keep only if scheduling cronjobs import { sampleRouter } from "../routes/sample"; // TODO: delete sample router import { usersRouter } from "../routes/users"; +import { commentsRouter } from '../routes/comments'; import { verifyToken } from "./middleware"; dotenv.config(); @@ -38,6 +39,7 @@ if (process.env.NODE_ENV === "production") { app.use("/", sampleRouter); // TODO: delete sample endpoint app.use("/users", usersRouter); +app.use('/comments', commentsRouter); app.listen(SERVER_PORT, () => { console.info(`Server listening on ${SERVER_PORT}`); From de28015ef289455abef76b3ce5e5989ae9bb2c94 Mon Sep 17 00:00:00 2001 From: Zion Mateo Date: Sun, 12 Jan 2025 23:56:29 -0800 Subject: [PATCH 08/12] delete fixed, foreign key constraint on user delete, so must delete associated comments first --- server/routes/users.ts | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/server/routes/users.ts b/server/routes/users.ts index efac3d5..267e6b4 100644 --- a/server/routes/users.ts +++ b/server/routes/users.ts @@ -8,15 +8,15 @@ import { verifyRole } from "../src/middleware"; export const usersRouter = Router(); // Get all users -// usersRouter.get("/", async (req, res) => { -// try { -// const users = await db.query(`SELECT * FROM users ORDER BY id ASC`); +usersRouter.get("/", async (req, res) => { + try { + const users = await db.query(`SELECT * FROM users ORDER BY id ASC`); -// res.status(200).json(keysToCamel(users)); -// } catch (err) { -// res.status(400).send(err.message); -// } -// }); + res.status(200).json(keysToCamel(users)); + } catch (err) { + res.status(400).send(err.message); + } +}); // Get a user by ID // usersRouter.get("/:firebaseUid", async (req, res) => { @@ -58,15 +58,22 @@ export const usersRouter = Router(); // }); // Delete a user by their account ID (not based on Firebase Uid) -usersRouter.delete("/users/:id", async (req, res) => { +usersRouter.delete("/:id", async (req, res) => { try { const { id } = req.params; - + + // first delete all associated comments + await db.query("DELETE FROM comments WHERE user_id = $1", [id]); // theres a foreign key constraint, comments requires a user_id to exist, so must delete all comments associated first + // then delete the user await db.query("DELETE FROM users WHERE id = $1", [id]); - res.status(200).send(`ID ${id} deleted from the users table`); + res.status(200).json({ result: "success" }); } catch (err) { - res.status(400).send(err.message); + console.error('Delete user error:', err); + res.status(400).json({ + result: "error", + message: err.message + }); } }); From e38fc56c0b99f2babee72a1b24082c132068e9de Mon Sep 17 00:00:00 2001 From: Zion Mateo Date: Sun, 12 Jan 2025 23:58:24 -0800 Subject: [PATCH 09/12] fixed formatting --- server/routes/users.ts | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/server/routes/users.ts b/server/routes/users.ts index 267e6b4..1072dbb 100644 --- a/server/routes/users.ts +++ b/server/routes/users.ts @@ -46,7 +46,7 @@ usersRouter.get("/", async (req, res) => { // } else { // throw new Error("firebaseUid is undefined"); // } - + // const user = await db.query("DELETE FROM users WHERE firebase_uid = $1", [ // firebaseUid, // ]); @@ -61,7 +61,7 @@ usersRouter.get("/", async (req, res) => { usersRouter.delete("/:id", async (req, res) => { try { const { id } = req.params; - + // first delete all associated comments await db.query("DELETE FROM comments WHERE user_id = $1", [id]); // theres a foreign key constraint, comments requires a user_id to exist, so must delete all comments associated first // then delete the user @@ -69,11 +69,7 @@ usersRouter.delete("/:id", async (req, res) => { res.status(200).json({ result: "success" }); } catch (err) { - console.error('Delete user error:', err); - res.status(400).json({ - result: "error", - message: err.message - }); + res.status(400).json({ result: "error" }); } }); From afb8254760b45909adf0eda1075eb0c992f145f3 Mon Sep 17 00:00:00 2001 From: jessieh9 <104229166+jessieh9@users.noreply.github.com> Date: Tue, 14 Jan 2025 14:16:17 -0800 Subject: [PATCH 10/12] comments router remove comments and add spacing --- server/routes/{comments.ts => comments.js} | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) rename server/routes/{comments.ts => comments.js} (84%) diff --git a/server/routes/comments.ts b/server/routes/comments.js similarity index 84% rename from server/routes/comments.ts rename to server/routes/comments.js index 2eea199..d51e6fe 100644 --- a/server/routes/comments.ts +++ b/server/routes/comments.js @@ -10,34 +10,33 @@ commentsRouter.get("/:id", async (req, res) => { try { const {id} = req.params; const data = await db.query("SELECT * FROM comments WHERE id = $1", [id]); + res.status(200).json(keysToCamel(data)); } catch (err) { res.status(500).send(err.message); } }); -// GET /comments/invoice/:id -// Returns all comments that much up that invoice ID commentsRouter.get("/invoice/:id", async (req, res) => { try { const {id} = req.params; const data = await db.query("SELECT * FROM comments WHERE invoice_id = $1", [id]); + res.status(200).json(keysToCamel(data)); } catch (err) { res.status(500).send(err.message); } }); -// GET /comments/booking/:id -// Returns all comments that much up that invoice ID commentsRouter.get("/booking/:id", async (req, res) => { try { const {id} = req.params; const data = await db.query("SELECT * FROM comments WHERE booking_id = $1", [id]); + res.status(200).json(keysToCamel(data)); } catch (err) { res.status(500).send(err.message); } }); -export { commentsRouter }; \ No newline at end of file +export { commentsRouter }; From 0fe5013ca63e903204f933796827688b8c07adb8 Mon Sep 17 00:00:00 2001 From: jessieh9 <104229166+jessieh9@users.noreply.github.com> Date: Tue, 14 Jan 2025 14:19:36 -0800 Subject: [PATCH 11/12] changed to js app and users route --- server/routes/{users.ts => users.js} | 0 server/src/{app.ts => app.js} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename server/routes/{users.ts => users.js} (100%) rename server/src/{app.ts => app.js} (100%) diff --git a/server/routes/users.ts b/server/routes/users.js similarity index 100% rename from server/routes/users.ts rename to server/routes/users.js diff --git a/server/src/app.ts b/server/src/app.js similarity index 100% rename from server/src/app.ts rename to server/src/app.js From b443305a69116fe493fc6e6985ee3d10fcef67a7 Mon Sep 17 00:00:00 2001 From: Nathan Pietrantonio Date: Tue, 14 Jan 2025 14:30:44 -0800 Subject: [PATCH 12/12] Switch app back to ts --- server/src/{app.js => app.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename server/src/{app.js => app.ts} (100%) diff --git a/server/src/app.js b/server/src/app.ts similarity index 100% rename from server/src/app.js rename to server/src/app.ts