From 942d5dfc04614ea592c3767b9e9afb19027414e7 Mon Sep 17 00:00:00 2001 From: Kavi Date: Mon, 9 Sep 2024 12:24:44 -0400 Subject: [PATCH 1/4] finished refactoring api routes --- server/src/index.ts | 163 ++-------------------------- server/src/routes/auth/email.ts | 39 +++++++ server/src/routes/auth/index.ts | 10 ++ server/src/routes/index.ts | 10 ++ server/src/routes/user/create.ts | 34 ++++++ server/src/routes/user/delete.ts | 27 +++++ server/src/routes/user/getNearby.ts | 41 +++++++ server/src/routes/user/index.ts | 16 +++ server/src/routes/user/update.ts | 50 +++++++++ 9 files changed, 234 insertions(+), 156 deletions(-) create mode 100644 server/src/routes/auth/email.ts create mode 100644 server/src/routes/auth/index.ts create mode 100644 server/src/routes/index.ts create mode 100644 server/src/routes/user/create.ts create mode 100644 server/src/routes/user/delete.ts create mode 100644 server/src/routes/user/getNearby.ts create mode 100644 server/src/routes/user/index.ts create mode 100644 server/src/routes/user/update.ts diff --git a/server/src/index.ts b/server/src/index.ts index 330eb337f..4a24540b5 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -18,6 +18,7 @@ import Mailgun from "mailgun.js"; import { messagesCollection } from "./utilities/firebaseInit"; import { calculateDistanceInMeters } from "./actions/calculateDistance"; import { scheduleCron } from "./actions/deleter"; +import userAndAuthRouter from "./routes"; const { createServer } = require("http"); const { Server } = require("socket.io"); @@ -156,166 +157,16 @@ app.get("/", (req, res) => { res.send("Echologator API"); }); -app.get("/users", async (req, res) => { - let query = ""; - try { - if (req.query.lat && req.query.lon && req.query.radius) { - // Looks up all users close to a geographic location extended by a radius (in meters). - query = "?lat&lon&radius"; - - const lat = Number(req.query.lat); - const lon = Number(req.query.lon); - const radius = Number(req.query.radius); - - const userIds = await findNearbyUsers(lat, lon, radius); - res.json(userIds); - } else if (req.query.userId) { - query = "?userId"; - const userId = req.query.userId; - if (typeof userId != "string") throw Error(" [userId] is not a string."); - - const user = await getConnectedUser(userId); - if (user) { - res.json(user); - } else { - // getConnectedUserDisplayName() will return false is an error is thrown, and print it to console. - throw Error("getConnectedUser() failed."); - } - } - } catch (error) { - console.error( - `[EXP] Error returning request :\n`, - error.message - ); - res.json(`Operation failed.`); - } -}); +app.use(userAndAuthRouter); + + + + + -app.post("/users", async (req, res) => { - try { - const status = await createUser({ - uid: req.body.uid, - socketId: req.body.socketId, - displayName: req.body.displayName, - userIcon: { - foregroundImage: req.body.userIcon.foregroundImage, - backgroundImage: req.body.userIcon.backgroundImage, - }, - location: { - lat: Number(req.body.location.lat), - lon: Number(req.body.location.lon), - geohash: req.body.location.geohash, - }, - }); - if (status === false) throw new Error("Error creating user: "); - res.json("Operation was handled successfully."); - console.log("[EXP] Request returned successfully."); - } catch (error) { - console.error( - "[EXP] Error returning request :\n", - error.message - ); - res.json(`Operation failed.`); - } -}); -app.put("/users", async (req, res) => { - let query = ""; - try { - if (req.query.userId && req.query.toggleConnection) { - // Note: toggleConnection should be assigned 'true', but it at least needs to contain any value. We don't perform a check on this parameter for this reason. - query = "?userId&toggleConnection"; - const userId = req.query.userId; - if (typeof userId != "string") throw Error(" [userId] is not a string."); - - const success = await toggleUserConnectionStatus(userId); - if (!success) throw Error(" toggleUserConnectionStatus() failed."); - } else if (req.query.userId && req.query.lat && req.query.lon) { - query = "?userId&lat&lon"; - const userId = req.query.userId; - const lat = Number(req.query.lat); - const lon = Number(req.query.lon); - if (typeof userId != "string") throw Error(" [userId] is not a string."); - if (typeof lat != "number") throw Error(" [lat] is not a number."); - if (typeof lon != "number") throw Error(" [lon] is not a number."); - - const success = await updateUserLocation(userId, lat, lon); - if (!success) throw Error(" toggleUserConnectionStatus() failed."); - } else if (req.query.userId && req.query.displayName) { - query = "?userId&displayName"; - const userId = req.query.userId; - if (typeof userId != "string") throw Error(" [userId] is not a string."); - const displayName = req.query.displayName; - if (typeof displayName != "string") - throw Error(" [displayName] is not a string."); - - const success = await updateUserDisplayName(userId, displayName); - if (!success) throw Error("updateDisplayName() failed."); - } - console.log(`[EXP] Request returned successfully.`); - res.json(`Operation was handled successfully.`); - } catch (error) { - console.error( - `[EXP] Error returning request :\n`, - error.message - ); - res.json(`Operation failed.`); - } -}); -app.delete("/users", async (req, res) => { - let query = ""; - try { - query = "?userId"; - const userId = req.query.userId; - if (typeof userId != "string") throw Error(" [userId] is not a string."); - - const success = await deleteConnectedUserByUID(userId); - if (!success) throw Error(" deleteUserById() failed."); - - console.log(`[EXP] Request returned successfully.`); - res.json(`Operation was handled successfully.`); - } catch (error) { - console.error( - `[EXP] Error returning request :\n`, - error.message - ); - res.json(`Operation failed.`); - } -}); -app.post("/verify", async (req, res) => { - let query = ""; - try { - if (req.query.email) { - query = "?email"; - const email = req.query.email; - const mailgun = new Mailgun(FormData); - const mg = mailgun.client({ - username: "api", - key: process.env.MAILGUN_API_KEY || "key-yourkeyhere", - }); - const data = { - from: "Mailgun Sandbox ", - to: email, - subject: "Verify your email for echologator", - template: "app email verification", - }; - const verifyEmailResponse = await mg.messages.create( - "sandboxf8629624c26849cf8546cd0bc01ee862.mailgun.org", - data - ); - console.log(`[EXP] Request returned successfully.`); - res.json(verifyEmailResponse); - } - } catch (error) { - console.error( - `[EXP] Error returning request :\n`, - error - ); - res.json(`Operation failed.`); - } -}); // Error handling app.get("*", (req, res) => { diff --git a/server/src/routes/auth/email.ts b/server/src/routes/auth/email.ts new file mode 100644 index 000000000..e8c823e23 --- /dev/null +++ b/server/src/routes/auth/email.ts @@ -0,0 +1,39 @@ +import { Router } from "express"; +import Mailgun from "mailgun.js"; + +const authUserEmailRoute = Router(); + +authUserEmailRoute.post("/verify", async (req, res) => { + let query = ""; + try { + if (req.query.email) { + query = "?email"; + const email = req.query.email; + const mailgun = new Mailgun(FormData); + const mg = mailgun.client({ + username: "api", + key: process.env.MAILGUN_API_KEY || "key-yourkeyhere", + }); + const data = { + from: "Mailgun Sandbox ", + to: email, + subject: "Verify your email for echologator", + template: "app email verification", + }; + const verifyEmailResponse = await mg.messages.create( + "sandboxf8629624c26849cf8546cd0bc01ee862.mailgun.org", + data + ); + console.log(`[EXP] Request returned successfully.`); + res.json(verifyEmailResponse); + } + } catch (error) { + console.error( + `[EXP] Error returning request :\n`, + error + ); + res.json(`Operation failed.`); + } +}); + +export default authUserEmailRoute; \ No newline at end of file diff --git a/server/src/routes/auth/index.ts b/server/src/routes/auth/index.ts new file mode 100644 index 000000000..2c300cf6e --- /dev/null +++ b/server/src/routes/auth/index.ts @@ -0,0 +1,10 @@ +import { Router } from "express"; +import authUserEmailRoute from "./email"; + +const authRouter = Router(); + + +authRouter.use(authUserEmailRoute); + + +export default authRouter; \ No newline at end of file diff --git a/server/src/routes/index.ts b/server/src/routes/index.ts new file mode 100644 index 000000000..c8e10f432 --- /dev/null +++ b/server/src/routes/index.ts @@ -0,0 +1,10 @@ +import { Router } from "express"; +import authRouter from "./auth"; +import userRouter from "./user"; + +const userAndAuthRouter = Router(); + +userAndAuthRouter.use(authRouter); +userAndAuthRouter.use(userRouter); + +export default userAndAuthRouter; \ No newline at end of file diff --git a/server/src/routes/user/create.ts b/server/src/routes/user/create.ts new file mode 100644 index 000000000..56a2e05a1 --- /dev/null +++ b/server/src/routes/user/create.ts @@ -0,0 +1,34 @@ +import { Router } from "express"; +import { createUser } from "../../actions/createConnectedUser"; + +const createUserRoute = Router(); + +createUserRoute.post("/users", async (req, res) => { + try { + const status = await createUser({ + uid: req.body.uid, + socketId: req.body.socketId, + displayName: req.body.displayName, + userIcon: { + foregroundImage: req.body.userIcon.foregroundImage, + backgroundImage: req.body.userIcon.backgroundImage, + }, + location: { + lat: Number(req.body.location.lat), + lon: Number(req.body.location.lon), + geohash: req.body.location.geohash, + }, + }); + if (status === false) throw new Error("Error creating user: "); + res.json("Operation was handled successfully."); + console.log("[EXP] Request returned successfully."); + } catch (error) { + console.error( + "[EXP] Error returning request :\n", + error.message + ); + res.json(`Operation failed.`); + } +}); + +export default createUserRoute; \ No newline at end of file diff --git a/server/src/routes/user/delete.ts b/server/src/routes/user/delete.ts new file mode 100644 index 000000000..b87d49edd --- /dev/null +++ b/server/src/routes/user/delete.ts @@ -0,0 +1,27 @@ +import { Router } from "express"; +import { deleteConnectedUserByUID } from "../../actions/deleteConnectedUser"; + +const deleteUserRoute = Router(); + +deleteUserRoute.post("/users", async (req, res) => { + let query = ""; + try { + query = "?userId"; + const userId = req.query.userId; + if (typeof userId != "string") throw Error(" [userId] is not a string."); + + const success = await deleteConnectedUserByUID(userId); + if (!success) throw Error(" deleteUserById() failed."); + + console.log(`[EXP] Request returned successfully.`); + res.json(`Operation was handled successfully.`); + } catch (error) { + console.error( + `[EXP] Error returning request :\n`, + error.message + ); + res.json(`Operation failed.`); + } +}); + +export default deleteUserRoute; diff --git a/server/src/routes/user/getNearby.ts b/server/src/routes/user/getNearby.ts new file mode 100644 index 000000000..d2a4af3e4 --- /dev/null +++ b/server/src/routes/user/getNearby.ts @@ -0,0 +1,41 @@ +import { Router } from "express"; +import { findNearbyUsers, getConnectedUser } from "../../actions/getConnectedUsers"; + +const getNearbyUserRoute = Router(); + +getNearbyUserRoute.get("/users", async (req, res) => { + let query = ""; + try { + if (req.query.lat && req.query.lon && req.query.radius) { + // Looks up all users close to a geographic location extended by a radius (in meters). + query = "?lat&lon&radius"; + + const lat = Number(req.query.lat); + const lon = Number(req.query.lon); + const radius = Number(req.query.radius); + + const userIds = await findNearbyUsers(lat, lon, radius); + res.json(userIds); + } else if (req.query.userId) { + query = "?userId"; + const userId = req.query.userId; + if (typeof userId != "string") throw Error(" [userId] is not a string."); + + const user = await getConnectedUser(userId); + if (user) { + res.json(user); + } else { + // getConnectedUserDisplayName() will return false is an error is thrown, and print it to console. + throw Error("getConnectedUser() failed."); + } + } + } catch (error) { + console.error( + `[EXP] Error returning request :\n`, + error.message + ); + res.json(`Operation failed.`); + } +}); + +export default getNearbyUserRoute; diff --git a/server/src/routes/user/index.ts b/server/src/routes/user/index.ts new file mode 100644 index 000000000..bb38cf81c --- /dev/null +++ b/server/src/routes/user/index.ts @@ -0,0 +1,16 @@ +import { Router } from "express"; +import createUserRoute from "./create"; +import deleteUserRoute from "./delete"; +import getNearbyUserRoute from "./getNearby"; +import updateUserRoute from "./update"; + +const userRouter = Router(); + + +userRouter.use(createUserRoute); +userRouter.use(deleteUserRoute); +userRouter.use(getNearbyUserRoute); +userRouter.use(updateUserRoute); + + +export default userRouter; diff --git a/server/src/routes/user/update.ts b/server/src/routes/user/update.ts new file mode 100644 index 000000000..6d068a465 --- /dev/null +++ b/server/src/routes/user/update.ts @@ -0,0 +1,50 @@ +import { Router } from "express"; +import { toggleUserConnectionStatus, updateUserDisplayName, updateUserLocation } from "../../actions/updateConnectedUser"; + +const updateUserRoute = Router(); + +updateUserRoute.put("/users", async (req, res) => { + let query = ""; + try { + if (req.query.userId && req.query.toggleConnection) { + // Note: toggleConnection should be assigned 'true', but it at least needs to contain any value. We don't perform a check on this parameter for this reason. + query = "?userId&toggleConnection"; + const userId = req.query.userId; + if (typeof userId != "string") throw Error(" [userId] is not a string."); + + const success = await toggleUserConnectionStatus(userId); + if (!success) throw Error(" toggleUserConnectionStatus() failed."); + } else if (req.query.userId && req.query.lat && req.query.lon) { + query = "?userId&lat&lon"; + const userId = req.query.userId; + const lat = Number(req.query.lat); + const lon = Number(req.query.lon); + if (typeof userId != "string") throw Error(" [userId] is not a string."); + if (typeof lat != "number") throw Error(" [lat] is not a number."); + if (typeof lon != "number") throw Error(" [lon] is not a number."); + + const success = await updateUserLocation(userId, lat, lon); + if (!success) throw Error(" toggleUserConnectionStatus() failed."); + } else if (req.query.userId && req.query.displayName) { + query = "?userId&displayName"; + const userId = req.query.userId; + if (typeof userId != "string") throw Error(" [userId] is not a string."); + const displayName = req.query.displayName; + if (typeof displayName != "string") + throw Error(" [displayName] is not a string."); + + const success = await updateUserDisplayName(userId, displayName); + if (!success) throw Error("updateDisplayName() failed."); + } + console.log(`[EXP] Request returned successfully.`); + res.json(`Operation was handled successfully.`); + } catch (error) { + console.error( + `[EXP] Error returning request :\n`, + error.message + ); + res.json(`Operation failed.`); + } + }); + +export default updateUserRoute; \ No newline at end of file From 6483a564248502aa75f8556fb640cab739c33818 Mon Sep 17 00:00:00 2001 From: Kavi Date: Mon, 9 Sep 2024 13:01:57 -0400 Subject: [PATCH 2/4] fixed a problem --- server/src/routes/auth/email.ts | 6 +++--- server/src/routes/auth/index.ts | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/server/src/routes/auth/email.ts b/server/src/routes/auth/email.ts index e8c823e23..f1dadcde1 100644 --- a/server/src/routes/auth/email.ts +++ b/server/src/routes/auth/email.ts @@ -1,9 +1,9 @@ import { Router } from "express"; import Mailgun from "mailgun.js"; -const authUserEmailRoute = Router(); +const authEmailRoute = Router(); -authUserEmailRoute.post("/verify", async (req, res) => { +authEmailRoute.post("/verify", async (req, res) => { let query = ""; try { if (req.query.email) { @@ -36,4 +36,4 @@ authUserEmailRoute.post("/verify", async (req, res) => { } }); -export default authUserEmailRoute; \ No newline at end of file +export default authEmailRoute; \ No newline at end of file diff --git a/server/src/routes/auth/index.ts b/server/src/routes/auth/index.ts index 2c300cf6e..533e6225e 100644 --- a/server/src/routes/auth/index.ts +++ b/server/src/routes/auth/index.ts @@ -1,10 +1,10 @@ import { Router } from "express"; -import authUserEmailRoute from "./email"; +import authEmailRoute from "./email"; const authRouter = Router(); -authRouter.use(authUserEmailRoute); +authRouter.use(authEmailRoute); export default authRouter; \ No newline at end of file From f8223946b3cf7c89f492a32742d3cd3335269c1b Mon Sep 17 00:00:00 2001 From: Kavi Date: Mon, 9 Sep 2024 13:26:08 -0400 Subject: [PATCH 3/4] fixed problems --- server/src/index.ts | 34 +++---------------- server/src/routes/error/error.ts | 27 +++++++++++++++ server/src/routes/index.ts | 10 +++--- server/src/routes/user/index.ts | 4 +-- .../routes/user/{getNearby.ts => nearby.ts} | 6 ++-- 5 files changed, 42 insertions(+), 39 deletions(-) create mode 100644 server/src/routes/error/error.ts rename server/src/routes/user/{getNearby.ts => nearby.ts} (90%) diff --git a/server/src/index.ts b/server/src/index.ts index f625995b0..adf3b3e23 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -18,7 +18,7 @@ import Mailgun from "mailgun.js"; import { messagesCollection } from "./utilities/firebaseInit"; import { calculateDistanceInMeters } from "./actions/calculateDistance"; import { scheduleCron } from "./actions/deleter"; -import userAndAuthRouter from "./routes"; +import mainRouter from "./routes"; const { createServer } = require("http"); const { Server } = require("socket.io"); @@ -157,44 +157,18 @@ app.get("/", (req, res) => { res.send("Echologator API"); }); -app.use(userAndAuthRouter); +app.use(mainRouter); - - - - - - - -// Error handling -app.get("*", (req, res) => { - res.json("404: Path could not be found! COULD NOT {GET}"); - res.status(404); -}); - -app.post("*", (req, res) => { - res.json("404: Path could not be found! COULD NOT {POST}"); - res.status(404); -}); - -app.put("*", (req, res) => { - res.json("404: Path could not be found! COULD NOT {PUT}"); - res.status(404); -}); - -app.delete("*", (req, res) => { - res.json("404: Path could not be found! COULD NOT {DELETE}"); - res.status(404); -}); - app.listen(express_port, () => { return console.log( `[EXP] Listening for requests at http://localhost:${express_port}.` ); }); + + //Remove the comments if you want to use the deleter !!!!!! //scheduleCron(); // Begin searching and collecting Garbage (old messages) diff --git a/server/src/routes/error/error.ts b/server/src/routes/error/error.ts new file mode 100644 index 000000000..2f717bcd6 --- /dev/null +++ b/server/src/routes/error/error.ts @@ -0,0 +1,27 @@ +import { Router } from "express"; + +const errorRouter = Router(); + + +// Error handling +errorRouter.get("*", (req, res) => { + res.json("404: Path could not be found! COULD NOT {GET}"); + res.status(404); +}); + +errorRouter.post("*", (req, res) => { + res.json("404: Path could not be found! COULD NOT {POST}"); + res.status(404); +}); + +errorRouter.put("*", (req, res) => { + res.json("404: Path could not be found! COULD NOT {PUT}"); + res.status(404); +}); + +errorRouter.delete("*", (req, res) => { +res.json("404: Path could not be found! COULD NOT {DELETE}"); + res.status(404); +}); + +export default errorRouter; \ No newline at end of file diff --git a/server/src/routes/index.ts b/server/src/routes/index.ts index c8e10f432..55ab93ea0 100644 --- a/server/src/routes/index.ts +++ b/server/src/routes/index.ts @@ -1,10 +1,12 @@ import { Router } from "express"; import authRouter from "./auth"; import userRouter from "./user"; +import errorRouter from "./error/error"; -const userAndAuthRouter = Router(); +const mainRouter = Router(); -userAndAuthRouter.use(authRouter); -userAndAuthRouter.use(userRouter); +mainRouter.use(authRouter); +mainRouter.use(userRouter); +mainRouter.use(errorRouter); -export default userAndAuthRouter; \ No newline at end of file +export default mainRouter; \ No newline at end of file diff --git a/server/src/routes/user/index.ts b/server/src/routes/user/index.ts index bb38cf81c..05b389703 100644 --- a/server/src/routes/user/index.ts +++ b/server/src/routes/user/index.ts @@ -1,15 +1,15 @@ import { Router } from "express"; import createUserRoute from "./create"; import deleteUserRoute from "./delete"; -import getNearbyUserRoute from "./getNearby"; import updateUserRoute from "./update"; +import nearbyUserRoute from "./getNearby"; const userRouter = Router(); userRouter.use(createUserRoute); userRouter.use(deleteUserRoute); -userRouter.use(getNearbyUserRoute); +userRouter.use(nearbyUserRoute); userRouter.use(updateUserRoute); diff --git a/server/src/routes/user/getNearby.ts b/server/src/routes/user/nearby.ts similarity index 90% rename from server/src/routes/user/getNearby.ts rename to server/src/routes/user/nearby.ts index d2a4af3e4..43c9763f0 100644 --- a/server/src/routes/user/getNearby.ts +++ b/server/src/routes/user/nearby.ts @@ -1,9 +1,9 @@ import { Router } from "express"; import { findNearbyUsers, getConnectedUser } from "../../actions/getConnectedUsers"; -const getNearbyUserRoute = Router(); +const nearbyUserRoute = Router(); -getNearbyUserRoute.get("/users", async (req, res) => { +nearbyUserRoute.get("/users", async (req, res) => { let query = ""; try { if (req.query.lat && req.query.lon && req.query.radius) { @@ -38,4 +38,4 @@ getNearbyUserRoute.get("/users", async (req, res) => { } }); -export default getNearbyUserRoute; +export default nearbyUserRoute; From 9d3afbb5b8363990c0e69f915d727759427bdb66 Mon Sep 17 00:00:00 2001 From: Kavi Date: Tue, 10 Sep 2024 12:48:54 -0400 Subject: [PATCH 4/4] Updated File Names --- server/src/index.ts | 2 +- server/src/routes/auth/{index.ts => authRouteHandler.ts} | 0 server/src/routes/{index.ts => mainRouteHandler.ts} | 4 ++-- server/src/routes/user/{index.ts => userRouteHandler.ts} | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename server/src/routes/auth/{index.ts => authRouteHandler.ts} (100%) rename server/src/routes/{index.ts => mainRouteHandler.ts} (68%) rename server/src/routes/user/{index.ts => userRouteHandler.ts} (88%) diff --git a/server/src/index.ts b/server/src/index.ts index adf3b3e23..a0ccbb98e 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -18,7 +18,7 @@ import Mailgun from "mailgun.js"; import { messagesCollection } from "./utilities/firebaseInit"; import { calculateDistanceInMeters } from "./actions/calculateDistance"; import { scheduleCron } from "./actions/deleter"; -import mainRouter from "./routes"; +import mainRouter from "./routes/mainRouteHandler"; const { createServer } = require("http"); const { Server } = require("socket.io"); diff --git a/server/src/routes/auth/index.ts b/server/src/routes/auth/authRouteHandler.ts similarity index 100% rename from server/src/routes/auth/index.ts rename to server/src/routes/auth/authRouteHandler.ts diff --git a/server/src/routes/index.ts b/server/src/routes/mainRouteHandler.ts similarity index 68% rename from server/src/routes/index.ts rename to server/src/routes/mainRouteHandler.ts index 55ab93ea0..35aacc16e 100644 --- a/server/src/routes/index.ts +++ b/server/src/routes/mainRouteHandler.ts @@ -1,6 +1,6 @@ import { Router } from "express"; -import authRouter from "./auth"; -import userRouter from "./user"; +import authRouter from "./auth/authRouteHandler"; +import userRouter from "./user/userRouteHandler"; import errorRouter from "./error/error"; const mainRouter = Router(); diff --git a/server/src/routes/user/index.ts b/server/src/routes/user/userRouteHandler.ts similarity index 88% rename from server/src/routes/user/index.ts rename to server/src/routes/user/userRouteHandler.ts index 05b389703..dea0b91e0 100644 --- a/server/src/routes/user/index.ts +++ b/server/src/routes/user/userRouteHandler.ts @@ -2,7 +2,7 @@ import { Router } from "express"; import createUserRoute from "./create"; import deleteUserRoute from "./delete"; import updateUserRoute from "./update"; -import nearbyUserRoute from "./getNearby"; +import nearbyUserRoute from "./nearby"; const userRouter = Router();