diff --git a/com/Unit/Create.lua b/com/Unit/Create.lua new file mode 100644 index 0000000..0ba7140 --- /dev/null +++ b/com/Unit/Create.lua @@ -0,0 +1,77 @@ +-- File com/Unit/Create.lua +-- +-- Created at 2025-05-10 18:23 +-- +-- Updated at - +-- Description: +--- Creates a record in the unit.db database without +--- requiring additional permissions. Requires username, +--- password (hashing occurs at the server level), and email fields. + +local log = require("internal.log") +local db = require("internal.database.sqlite").connect("db/unit.db", {log = true}) +local session = require("internal.session") +local crypt = require("internal.crypt.bcrypt") +local sha256 = require("internal.crypt.sha256") + +local common = require("com/Unit/_common") + +-- Preparing for first db query +local function close_db() + if db then + log.debug("Closing DB connection") + db:close() + db = nil + end +end + +local params = session.request.params.get() + +local ok, mp = common.CheckMissingElement({"username", "password", "email"}, params) +if not ok then + close_db() + session.response.send_error(-32602, "Missing params", mp) +end + +local hashPass = crypt.generate(params.password, crypt.DefaultCost) +local unitID = string.sub(sha256.hash(session.__seed), 1, 16) + +-- First db query: check if username or email already exists +local existing, err = db:query("SELECT 1 FROM units WHERE email = ? OR username = ? LIMIT 1", { + params.email, + params.username +}) + +if err ~= nil then + log.error("Email check failed: "..tostring(err)) + return session.response.send_error() +end + +if existing and #existing > 0 then + return session.response.send_error(-32101, "Unit already exists") +end + +-- Second db query: insert new unit +local ctx, err = db:exec( + "INSERT INTO units (user_id, username, email, password) VALUES (?, ?, ?, ?)", + { + unitID, + params.username, + params.email, + hashPass, + } +) +if err ~= nil then + log.error("Insert failed: "..tostring(err)) + return session.response.send_error() +end + +local res, err = ctx:wait() +if err ~= nil then + log.error("Insert confirmation failed: "..tostring(err)) + return session.response.send_error() +end + +session.response.send({message = "Unit created successfully", unit_id = unitID}) + +close_db() \ No newline at end of file diff --git a/com/Unit/Delete.lua b/com/Unit/Delete.lua new file mode 100644 index 0000000..e69de29 diff --git a/com/Unit/Get.lua b/com/Unit/Get.lua new file mode 100644 index 0000000..e69de29