From 23338cbdf535089351ea2a363c50378c6bf5bd1e Mon Sep 17 00:00:00 2001 From: Repinoid Date: Thu, 1 Oct 2026 18:37:27 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20created=5Fat/created=5Fby=20=E2=80=94?= =?UTF-8?q?=20=D0=B2=D0=B8=D0=B4=D0=BD=D0=BE=20=D0=B2=D1=80=D0=B5=D0=BC?= =?UTF-8?q?=D1=8F=20=D0=B8=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81,=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=B2=D1=88=D0=B8=D0=B9=20?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=BE=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CREATE TABLE IF NOT EXISTS дополнена колонками: created_at TIMESTAMPTZ NOT NULL DEFAULT now() created_by TEXT NOT NULL DEFAULT '' - ALTER TABLE ... ADD COLUMN IF NOT EXISTS досыпает колонки в уже существующую таблицу — данные при этом не теряются; - INSERT пишет created_by из env SERVICE_NAME (задаётся в json_env манифеста), created_at ставит сама СУБД; - список записей и UI показывают обе колонки. Зачем: три приложения (flask / lucee / nodejs) пишут в ОДНУ таблицу — теперь сразу видно, какое из них и когда добавило строку. --- server.js | 28 +++++++++++++++++++++++----- views/index.ejs | 4 +++- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/server.js b/server.js index 97b16bb..65064c2 100644 --- a/server.js +++ b/server.js @@ -14,6 +14,9 @@ const path = require("path"); const VERSION = "1.0.0"; const TABLE_NAME = process.env.TABLE_NAME || "crud_items"; +// SERVICE_NAME — какое приложение добавило строку (колонка created_by). +// Задаётся в json_env манифеста для каждого сервиса (flask / lucee / nodejs). +const SERVICE_NAME = process.env.SERVICE_NAME || "nodejs"; const PORT = process.env.PORT || 3000; const pool = new Pool({ @@ -32,15 +35,26 @@ app.set("view engine", "ejs"); app.set("views", path.join(__dirname, "views")); // --- Инициализация БД --- +// Таблица выставочная: кроме id/value — две метки: created_at (когда добавлено) +// и created_by (какое приложение добавило). ALTER ... IF NOT EXISTS досыпает +// колонки в таблицу, созданную прошлой версией приложения, не теряя данные. async function initDB() { const client = await pool.connect(); try { await client.query(` CREATE TABLE IF NOT EXISTS ${TABLE_NAME} ( - id SERIAL PRIMARY KEY, - value TEXT NOT NULL DEFAULT '' + id SERIAL PRIMARY KEY, + value TEXT NOT NULL DEFAULT '', + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + created_by TEXT NOT NULL DEFAULT '' ) `); + await client.query( + `ALTER TABLE ${TABLE_NAME} ADD COLUMN IF NOT EXISTS created_at TIMESTAMPTZ NOT NULL DEFAULT now()` + ); + await client.query( + `ALTER TABLE ${TABLE_NAME} ADD COLUMN IF NOT EXISTS created_by TEXT NOT NULL DEFAULT ''` + ); } finally { client.release(); } @@ -52,14 +66,14 @@ app.get("/", async (req, res) => { let editRow = null; if (req.query.edit) { const result = await pool.query( - `SELECT id, value FROM ${TABLE_NAME} WHERE id = $1`, + `SELECT id, value, created_at, created_by FROM ${TABLE_NAME} WHERE id = $1`, [parseInt(req.query.edit)] ); if (result.rows.length > 0) editRow = result.rows[0]; } const result = await pool.query( - `SELECT id, value FROM ${TABLE_NAME} ORDER BY id` + `SELECT id, value, created_at, created_by FROM ${TABLE_NAME} ORDER BY id` ); res.render("index", { @@ -78,7 +92,11 @@ app.post("/", async (req, res) => { const { action, value, id } = req.body; if (action === "create") { - await pool.query(`INSERT INTO ${TABLE_NAME} (value) VALUES ($1)`, [value || ""]); + // created_at ставит СУБД (DEFAULT now()), created_by — имя этого сервиса + await pool.query( + `INSERT INTO ${TABLE_NAME} (value, created_by) VALUES ($1, $2)`, + [value || "", SERVICE_NAME] + ); } else if (action === "update") { await pool.query(`UPDATE ${TABLE_NAME} SET value = $1 WHERE id = $2`, [ value || "", diff --git a/views/index.ejs b/views/index.ejs index 2472a23..5dbd98e 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -23,7 +23,7 @@ - + @@ -33,6 +33,8 @@ + +
IDVALUEIDVALUEДОБАВЛЕНОКЕМ
<%= row.id %> <%= row.value %><%= row.created_at ? new Date(row.created_at).toLocaleString('ru-RU') : '' %><%= row.created_by %> ✏️