From 5783a756c3c0673a705f0c109acb5e58fa784249 Mon Sep 17 00:00:00 2001 From: Alexey Date: Fri, 10 Oct 2025 19:27:04 +0300 Subject: [PATCH] add method update --- com/Unit/Update.lua | 102 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 com/Unit/Update.lua diff --git a/com/Unit/Update.lua b/com/Unit/Update.lua new file mode 100644 index 0000000..e981617 --- /dev/null +++ b/com/Unit/Update.lua @@ -0,0 +1,102 @@ +-- File com/Unit/Update.lua +-- +-- Created at 2025-10-10 +-- + +local log = require("internal.log") +local db = require("internal.database.sqlite").connect("db/unit.db", { log = true }) +local session = require("internal.session") + +local common = require("com/Unit/_common") +local errors = require("com/Unit/_errors") + +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({"user_id", "fields"}, params) +if not ok then + close_db() + session.response.send_error(errors.MISSING_PARAMS.code, errors.MISSING_PARAMS.message, mp) +end + +if type(params.fields) ~= "table" or next(params.fields) == nil then + close_db() + session.response.send_error(errors.INVALID_FIELD_TYPE.code, errors.INVALID_FIELD_TYPE.message) +end + +local allowed = { + username = true, + email = true, + password = false, + entry_status = true +} + +local exists = db:query_row( + "SELECT 1 FROM units WHERE user_id = ? AND deleted_at IS NULL LIMIT 1", + { params.user_id } +) + +if not exists then + close_db() + session.response.send_error(errors.UNIT_NOT_FOUND.code, errors.UNIT_NOT_FOUND.message) +end + +local set_clauses = {} +local values = {} + +for k, v in pairs(params.fields) do + if allowed[k] then + table.insert(set_clauses, k .. " = ?") + table.insert(values, v) + else + log.warn("Ignoring unsupported field: " .. k) + end +end + +if #set_clauses == 0 then + close_db() + session.response.send_error(errors.NO_VALID_FIELDS.code, errors.NO_VALID_FIELDS.message) +end + +table.insert(set_clauses, "updated_at = CURRENT_TIMESTAMP") + +local query = "UPDATE units SET " .. table.concat(set_clauses, ", ") + .. " WHERE user_id = ? AND deleted_at IS NULL" + +table.insert(values, params.user_id) + +local ctx, err = db:exec(query, values) +if not ctx then + close_db() + if tostring(err):match("UNIQUE constraint failed") then + session.response.send_error(errors.UNIQUE_CONSTRAINT.code, errors.UNIQUE_CONSTRAINT.message) + else + session.response.send_error() + end +end + +local _, err = ctx:wait() +if err ~= nil then + close_db() + if tostring(err):match("UNIQUE constraint failed") then + session.response.send_error(errors.UNIQUE_CONSTRAINT.code, errors.UNIQUE_CONSTRAINT.message) + else + log.error("Insert confirmation failed: "..tostring(err)) + session.response.send_error() + end +end + +close_db() + +session.response.send({ + message = "User updated successfully", + fields_updated = #set_clauses - 1, -- excluding updated_at + fields = params.fields +})