diff --git a/backend/src/controllers/mods.js b/backend/src/controllers/mods.js index 17cfe66..f397183 100644 --- a/backend/src/controllers/mods.js +++ b/backend/src/controllers/mods.js @@ -29,7 +29,7 @@ async function createMod(req, res) { async function modifyMod(req, res) { try { // Authorize - authorizeModModification(req); + await authorizeModModification(req); // Query const mod_data = req.body; const query_result = await mod_service.modifyMod(mod_data); diff --git a/backend/src/database/index.js b/backend/src/database/index.js index 1399795..b6ca879 100644 --- a/backend/src/database/index.js +++ b/backend/src/database/index.js @@ -53,7 +53,7 @@ async function initDatabase() { author TINYTEXT NOT NULL, description TINYTEXT NOT NULL, - FOREIGN KEY (author) REFERENCES Users(username) + FOREIGN KEY (author) REFERENCES Users(username) ON DELETE CASCADE );`); // Mods complementary infos @@ -66,7 +66,7 @@ async function initDatabase() { creation_date TINYTEXT NOT NULL, downloads_count INT NOT NULL, - FOREIGN KEY (mod) REFERENCES Mods(name) + FOREIGN KEY (mod) REFERENCES Mods(name) ON DELETE CASCADE );`); // Mods tags @@ -74,7 +74,7 @@ async function initDatabase() { mod TINYTEXT NOT NULL, tag TINYTEXT NOT NULL, - FOREIGN KEY (mod) REFERENCES Mods(name) + FOREIGN KEY (mod) REFERENCES Mods(name) ON DELETE CASCADE );`); // Mods versions @@ -89,7 +89,7 @@ async function initDatabase() { environment TINYTEXT NOT NULL, url TINYTEXT NOT NULL, - FOREIGN KEY (mod) REFERENCES Mods(name) + FOREIGN KEY (mod) REFERENCES Mods(name) ON DELETE CASCADE );`); // User favorites (mods) @@ -97,8 +97,8 @@ async function initDatabase() { username TINYTEXT NOT NULL, mod TINYTEXT NOT NULL, - FOREIGN KEY (username) REFERENCES Users(username), - FOREIGN KEY (mod) REFERENCES Mods(name) + FOREIGN KEY (username) REFERENCES Users(username) ON DELETE CASCADE, + FOREIGN KEY (mod) REFERENCES Mods(name) ON DELETE CASCADE );`); } diff --git a/backend/src/database/mysql.js b/backend/src/database/mysql.js index df96f30..20b67f4 100644 --- a/backend/src/database/mysql.js +++ b/backend/src/database/mysql.js @@ -1,3 +1,5 @@ +//! Not implemented + class MySQLDatabase { constructor(config) { const mysql = require("mysql2/promise"); diff --git a/backend/src/database/sqlite.js b/backend/src/database/sqlite.js index b81e219..b299c4d 100644 --- a/backend/src/database/sqlite.js +++ b/backend/src/database/sqlite.js @@ -25,6 +25,7 @@ class SQLiteDatabase { } } + // Runs with a result (ex: SELECT) async query(sql, params = []) { try { if (params.length > 0) { @@ -38,15 +39,17 @@ class SQLiteDatabase { } } + // One time queries (ex: CREATE TABLE) async exec(sql) { try { return this.db.exec(sql); } catch (err) { console.error("Error executing statement:", err)} - + throw err; } - async prepare(sql, params = []) { + // Queries with no results (ex: INSERT) + async run(sql, params = []) { try { if (params.length > 0) { return this.db.prepare(sql).run(params); @@ -55,13 +58,35 @@ class SQLiteDatabase { } } catch (err) { console.error("Error executing prepared statement:", err)} + throw err; } + // Prepare a query for run or for transaction + async prepare(sql) { + try { + return this.db.prepare(sql); + } catch (err) { + console.error("Error preparing statement:", err)} + throw err; + } + + // Run a prepared transaction + async transaction(prepared_sql, items) { + try { + this.db.transaction((items) => { + for (const item of items) prepared_sql.run(item); + }) + } catch (err) { + console.error("Error executing prepared statement:", err)} + throw err; + } + async exists(table, attribute, value) { try { return this.db.prepare(`SELECT COUNT(*) FROM ${table} WHERE ${attribute} = ?`).get(value)['COUNT(*)'] > 0; } catch (err) { console.error("Error checking item existence"); + throw err; } } diff --git a/backend/src/middleware/auth.js b/backend/src/middleware/auth.js index d43e385..c9c4cc2 100644 --- a/backend/src/middleware/auth.js +++ b/backend/src/middleware/auth.js @@ -15,7 +15,7 @@ async function authenticateToken(req) { try { req.token_infos = await verifyToken(token); - console.debug("Authorizing token from", req.token_infos); + // console.debug("Authorizing token from", req.token_infos); } catch (err) { throw new AppError(403, "Forbidden: Error verifying the authorization token"); } diff --git a/backend/src/models/mod.js b/backend/src/models/mod.js index 6bfd051..e5a8905 100644 --- a/backend/src/models/mod.js +++ b/backend/src/models/mod.js @@ -58,12 +58,12 @@ async function createMod(name, display_name, author, description, mod_infos) { const { full_description, license, links, creation_date, tags } = mod_infos; // Mods table - await db.prepare("INSERT INTO Mods (name, display_name, author, description) \ + await db.run("INSERT INTO Mods (name, display_name, author, description) \ VALUES (?, ?, ?, ?)", [name, display_name, author, description]); // ModInfos table - await db.prepare(`INSERT INTO ModInfos (mod, full_description, license, links, creation_date, downloads_count) + await db.run(`INSERT INTO ModInfos (mod, full_description, license, links, creation_date, downloads_count) VALUES (?, ?, ?, ?, ?, ?)`, [name, full_description, license.type, links.toString(), creation_date, 0]); @@ -75,7 +75,7 @@ async function createMod(name, display_name, author, description, mod_infos) { // License if (license.type == "custom") { - await db.prepare(`UPDATE ModInfos SET custom_license = ? + await db.run(`UPDATE ModInfos SET custom_license = ? WHERE mod = ?`, [license.content, name]); } @@ -90,7 +90,7 @@ async function createMod(name, display_name, author, description, mod_infos) { async function addVersion(mod, version_number, channel, changelog, release_date, game_version, platform, environment, url) { - await db.prepare(`INSERT INTO ModVersions (mod, version_number, channel, changelog, release_date, game_version, environment, platform, url) + await db.run(`INSERT INTO ModVersions (mod, version_number, channel, changelog, release_date, game_version, environment, platform, url) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);`, [mod, version_number, channel, changelog, release_date, game_version, environment, platform, url]); return; @@ -130,12 +130,12 @@ async function updateMod(name, display_name, author, description) { // --- Delete --- async function deleteMod(name) { - await db.prepare("DELETE FROM Mods WHERE name = ?", [name]); + await db.run("DELETE FROM Mods WHERE name = ?", [name]); return; } async function deleteVersion(name, version_number, game_version, platform, environment) { - await db.prepare(`DELETE FROM ModVersions WHERE mod = ? + await db.run(`DELETE FROM ModVersions WHERE mod = ? AND version_number = ? AND game_version = ? AND platform = ? @@ -159,12 +159,12 @@ async function deleteTags(mod, tags) { // --- Utils --- async function updateModAttribute(name, attribute, value) { - await db.prepare(`UPDATE Mods SET ${attribute} = ? WHERE name = ?`, [value, name]); + await db.run(`UPDATE Mods SET ${attribute} = ? WHERE name = ?`, [value, name]); return; } async function updateModInfosAttribute(name, attribute, value) { - await db.prepare(`UPDATE ModInfos SET ${attribute} = ? WHERE name = ?`, [value, name]); + await db.run(`UPDATE ModInfos SET ${attribute} = ? WHERE name = ?`, [value, name]); return; } diff --git a/backend/src/models/user.js b/backend/src/models/user.js index fc66eda..0683ffd 100644 --- a/backend/src/models/user.js +++ b/backend/src/models/user.js @@ -35,7 +35,7 @@ async function exists(name) { async function createUser( username, email, password, displayName, profilePicture, settings ) { // Create user - await db.prepare(`INSERT INTO Users (username, email, password, display_name, role ) + await db.run(`INSERT INTO Users (username, email, password, display_name, role ) VALUES (?, ?, ?, ?, ? )`, [username, email, password, displayName, "user"]); @@ -86,11 +86,11 @@ async function updateUser(username, display_name, email, profile_picture, settin } async function updateUserPassword(username, password) { - await db.prepare(`UPDATE Users SET password = ? WHERE username = ?`, [password, username]); + await db.run(`UPDATE Users SET password = ? WHERE username = ?`, [password, username]); } async function updateUserAttribute(username, attribute, value) { - await db.prepare(`UPDATE Users SET ${attribute} = ? WHERE username = ?`, [value, username]); + await db.run(`UPDATE Users SET ${attribute} = ? WHERE username = ?`, [value, username]); return; } @@ -98,7 +98,7 @@ async function updateUserAttribute(username, attribute, value) { // --- Delete --- async function deleteUser(username) { - await db.prepare("DELETE FROM Users WHERE username = ?", [username]); + await db.run("DELETE FROM Users WHERE username = ?", [username]); return; }