From 491f16b8f977bfcbba8cdf97ef5a7d4e17872abb Mon Sep 17 00:00:00 2001 From: "Gu://em_" Date: Mon, 31 Mar 2025 09:42:30 +0200 Subject: [PATCH] feat: Added base for users support --- src/controllers/index.js | 7 +++-- src/controllers/users.js | 47 +++++++++++++++++++++++++++++++ src/models/user.js | 55 +++++++++++++++++++++++++++++++++++++ src/routes/index.js | 4 +++ src/routes/mods.js | 4 +-- src/routes/users.js | 33 ++++++++++++++++++++++ src/services/userService.js | 45 ++++++++++++++++++++++++++++++ src/utils/configManager.js | 0 8 files changed, 190 insertions(+), 5 deletions(-) create mode 100644 src/controllers/users.js create mode 100644 src/models/user.js create mode 100644 src/services/userService.js create mode 100644 src/utils/configManager.js diff --git a/src/controllers/index.js b/src/controllers/index.js index d63a7a4..725d1f5 100644 --- a/src/controllers/index.js +++ b/src/controllers/index.js @@ -1,10 +1,11 @@ +const handleError = require("../middleware/errors"); + async function helloWorld(req, res) { try { - const query_result = "Hello there!"; + const query_result = "Unknown development version"; res.send(query_result); } catch (error) { - console.debug("Error at HelloWorld controller"); - res.status(500).json({ error: error.message }); + handleError(error); } } diff --git a/src/controllers/users.js b/src/controllers/users.js new file mode 100644 index 0000000..61bf0d0 --- /dev/null +++ b/src/controllers/users.js @@ -0,0 +1,47 @@ +const handleError = require("../middleware/errors"); +const user_service = require("../services/userService") + +async function getAllUsers(req, res) { + try { + console.debug("Calling controller"); + const query_result = await user_service.getAllUsers(); + res.json(query_result); + } catch (error) { + console.error("ERROR: Couldn't get users: "); + handleError(error, req, res, null); + } +} + +async function getUserByName(req, res) { + try { + const query_result = await user_service.getUserByName(req.params.name); + res.json(query_result); + } catch (error) { + console.error("ERROR: Couldn't get user " + req.params.name + ": "); + handleError(error, req, res, null); + } +} + +async function createUser(req, res) { + try { + await user_service.createUser(req.body); + res.sendStatus(200); + } catch (error) { + console.error("ERROR: Couldn't create user:", error.message); + handleError(error, req, res, null); + } +} + +async function deleteUser(req, res) { + try { + await user_service.deleteUser(req.params.name); + return res.sendStatus(200); + } catch (error) { + console.error("ERROR: Couldn't delete user " + req.params.name + ":", error.message); + handleError(error, req, res, null); + } +} + + + +module.exports = { getAllUsers, getUserByName, createUser, deleteUser }; \ No newline at end of file diff --git a/src/models/user.js b/src/models/user.js new file mode 100644 index 0000000..4975f48 --- /dev/null +++ b/src/models/user.js @@ -0,0 +1,55 @@ +const { getDatabase } = require('../database/index'); +const AppError = require('../utils/appError'); +const db = getDatabase(); + +async function getAllUsers() { + return db.query("SELECT * FROM users"); +} + +async function getUserByName(name) { + try { + console.debug("Searching for", name); + const res = await db.query("SELECT * FROM users WHERE Name = ?;", [name]); + if (res && res.length > 0) { + return res[0]; + } else { + return null; + } + } catch (err) { + console.error("Error in getUserByName:", err); + throw err; + } + +} + +async function exists(name) { + return db.exists("users", "Name", name); +} + +async function createUser(user_data) { + + const { name, email, password, displayName, profilePicture, favorites, preferences } = user_data; + + await db.prepare("INSERT INTO users (Name, Email, Password, DisplayName, ProfilePicture, Favorites, Preferences) \ + VALUES (?, ?, ?, ?)", [name, email, password, displayName, profilePicture, favorites, preferences]); + return; +} + +async function deleteUser(name) { + db.prepare("DELETE FROM users WHERE Name = ?", [name]); + return; +} + +// --- WIP --- + +async function updateUser(user_data) { + console.log("WARNING: using a WIP function : updateUser (userels/users.js)"); + throw new AppError(501, "Not implemented"); + // const { name, description } = user_data; + // return db.query("INSERT INTO users (name, description) VALUES (?, ?)", [name, description]); +} + + + + +module.exports = { getAllUsers, getUserByName, createUser, deleteUser, exists } \ No newline at end of file diff --git a/src/routes/index.js b/src/routes/index.js index c3ccedc..d219546 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -8,4 +8,8 @@ router.get('/', (res, req) => { controller.helloWorld(res, req); }); +router.get('/version', (res, req) => { + controller.getVersion(res, req); +}); + module.exports = router; \ No newline at end of file diff --git a/src/routes/mods.js b/src/routes/mods.js index 4254161..1b21887 100644 --- a/src/routes/mods.js +++ b/src/routes/mods.js @@ -15,14 +15,14 @@ router.post("/", async (req, res) => { controller.createMod(req, res); }) -// +// Get mod infos router.get("/:name", async (req,res) => { const name = req.params.name; console.debug("Accessing mod " + name) controller.getModByName(req, res); }); -// +// Delete mod router.delete("/:name", async (req,res) => { const name = req.params.name; console.debug("Deleting mod " + name) diff --git a/src/routes/users.js b/src/routes/users.js index e69de29..85a4d2d 100644 --- a/src/routes/users.js +++ b/src/routes/users.js @@ -0,0 +1,33 @@ +const express = require("express"); +const controller = require("../controllers/users"); + +const router = express.Router(); + +// List users +router.get("/", async (req,res) => { + console.debug("Accessing users list"); + controller.getAllUsers(req,res); +}); + +// Create a user +router.post("/", async (req, res) => { + console.debug("Creating user ", req.body.name); + controller.createUser(req, res); +}) + +// Get user infos +router.get("/:name", async (req,res) => { + const name = req.params.name; + console.debug("Accessing user " + name) + controller.getUserByName(req, res); +}); + +// Delete user +router.delete("/:name", async (req,res) => { + const name = req.params.name; + console.debug("Deleting user " + name) + controller.deleteUser(req, res); +}); + + +module.exports = router; \ No newline at end of file diff --git a/src/services/userService.js b/src/services/userService.js new file mode 100644 index 0000000..a8eea3c --- /dev/null +++ b/src/services/userService.js @@ -0,0 +1,45 @@ +const model = require("../models/user"); +const AppError = require("../utils/appError"); +const { validateUserData } = require("../utils/validate"); +const { sanitizeUserData } = require("../utils/sanitize"); + +async function getAllUsers() { + return model.getAllUsers(); +} + +async function getUserByName(name) { + return model.getUserByName(name); +} + +async function createUser(user_data) { + + // Check body validity + await validateUserData(user_data); + + // Check authenticity + //TODO no auth provider + + // Sanitize + await sanitizeUserData(user_data); + + console.debug("Passed validity checks"); + model.createUser(user_data); + return; +} + +async function deleteUser(name) { + + // Check existence + const exists = await model.exists(name); + if (!exists) { + throw new AppError(404, "Not found: Cannot find user with this name"); + } + + // Check authenticity + //TODO no auth provider + + model.deleteUser(name); + return; +} + +module.exports = { getAllUsers, getUserByName, createUser, deleteUser }; \ No newline at end of file diff --git a/src/utils/configManager.js b/src/utils/configManager.js new file mode 100644 index 0000000..e69de29