UNPKG

@digigov-oss/auditrecord-postgresql-engine

Version:

PostgreSQL storage database for use with audit mechanism of GSIS

164 lines (163 loc) 9.39 kB
"use strict"; //To check this engine you have to have a PostgreSQL database installed and running. //The database must be configured to allow connections from the host that the application is running on. //The database must also have the following table: //table audit_records // auditUnit: varchar(255); // auditTransactionId: varchar(255); // auditProtocol: varchar(255); // auditTransactionDate: varchar(20); // auditUserIp: varchar(16); // auditUserId: varchar(255); // if you do not provide the table name, the engine will create it for you. var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; var _PostgreSqlEngine_table, _PostgreSqlEngine_columnNames, _PostgreSqlEngine_client; Object.defineProperty(exports, "__esModule", { value: true }); exports.PostgreSqlEngine = void 0; //You can use Docker to run PostgreSQL for your tests. //`docker run -d --name audit-postgres -e POSTGRES_PASSWORD=audit --network host postgres` //`docker exec -it audit-postgres psql -U postgres -h localhost -c "CREATE DATABASE audit;"` //`docker exec -it audit-postgres psql -U postgres -h localhost -c "CREATE TABLE audit_log (auditUnit varchar(255), auditTransactionId varchar(255), auditProtocol varchar(255), auditTransactionDate varchar(20), auditUserIp varchar(16), auditUserId varchar(255));"` //You can also map the fields of already existent table to the fields in the audit log. const pg_native_1 = __importDefault(require("pg-native")); /** * @description AuditEngine implementation * @note This class is used to implement the methods that must be implemented by the AuditEngine * @class PostgreSqlEngine * @implements AuditEngine * @param {string} connectionString - connect to db via connection string * @param {DatabaseSettings} dbSettings - database settings */ class PostgreSqlEngine { /** * @description constructor * @param {string} connectionString - connect to db via connection string * @param {DatabaseSettings} settings - settings for the database * @param {AuditRecord} columnNames - column names * @memberof PostgreSqlEngine */ constructor(connectionString = "", dbSettings = {}) { _PostgreSqlEngine_table.set(this, void 0); _PostgreSqlEngine_columnNames.set(this, void 0); _PostgreSqlEngine_client.set(this, void 0); const connection = connectionString != "" ? { connectionString } : {}; __classPrivateFieldSet(this, _PostgreSqlEngine_table, dbSettings.tableName || "audit_records", "f"); __classPrivateFieldSet(this, _PostgreSqlEngine_columnNames, dbSettings.columns || { auditUnit: "auditUnit", auditTransactionId: "auditTransactionId", auditProtocol: "auditProtocol", auditTransactionDate: "auditTransactionDate", auditUserIp: "auditUserIp", auditUserId: "auditUserId" }, "f"); __classPrivateFieldSet(this, _PostgreSqlEngine_client, new pg_native_1.default(connection), "f"); __classPrivateFieldGet(this, _PostgreSqlEngine_client, "f").connectSync(); if (!dbSettings.tableName) { __classPrivateFieldGet(this, _PostgreSqlEngine_client, "f").querySync("CREATE TABLE IF NOT EXISTS " + __classPrivateFieldGet(this, _PostgreSqlEngine_table, "f") + " (" + __classPrivateFieldGet(this, _PostgreSqlEngine_columnNames, "f").auditUnit + " varchar(255), " + __classPrivateFieldGet(this, _PostgreSqlEngine_columnNames, "f").auditTransactionId + " varchar(255), " + __classPrivateFieldGet(this, _PostgreSqlEngine_columnNames, "f").auditProtocol + " varchar(255), " + __classPrivateFieldGet(this, _PostgreSqlEngine_columnNames, "f").auditTransactionDate + " varchar(20), " + __classPrivateFieldGet(this, _PostgreSqlEngine_columnNames, "f").auditUserIp + " varchar(16), " + __classPrivateFieldGet(this, _PostgreSqlEngine_columnNames, "f").auditUserId + " varchar(255));"); } } /** * @description Store a record in the database * @param {AuditRecord} record - record to be stored * @returns {AuditRecord} - the record stored * @memberof FileEngine * @method put */ put(record) { const data = JSON.stringify(record, null, 2); try { __classPrivateFieldGet(this, _PostgreSqlEngine_client, "f").querySync("INSERT INTO " + __classPrivateFieldGet(this, _PostgreSqlEngine_table, "f") + " (" + __classPrivateFieldGet(this, _PostgreSqlEngine_columnNames, "f").auditUnit + "," + __classPrivateFieldGet(this, _PostgreSqlEngine_columnNames, "f").auditTransactionId + "," + __classPrivateFieldGet(this, _PostgreSqlEngine_columnNames, "f").auditProtocol + "," + __classPrivateFieldGet(this, _PostgreSqlEngine_columnNames, "f").auditTransactionDate + "," + __classPrivateFieldGet(this, _PostgreSqlEngine_columnNames, "f").auditUserIp + "," + __classPrivateFieldGet(this, _PostgreSqlEngine_columnNames, "f").auditUserId + ") \ VALUES ('" + record.auditUnit + "','" + record.auditTransactionId + "','" + record.auditProtocol + "','" + record.auditTransactionDate + "','" + record.auditUserIp + "','" + record.auditUserId + "');"); return record; } catch (error) { throw error; } } /** * @description Get a record from the database * @param auditTransactionId: string - transaction id * @returns {AuditRecord} * @memberof FileEngine * @method get */ get(auditTransactionId) { try { let data = {}; const res = __classPrivateFieldGet(this, _PostgreSqlEngine_client, "f").querySync("SELECT * FROM " + __classPrivateFieldGet(this, _PostgreSqlEngine_table, "f") + " WHERE " + __classPrivateFieldGet(this, _PostgreSqlEngine_columnNames, "f").auditTransactionId + "='" + auditTransactionId + "';"); data = res[0]; return data; } catch (error) { throw error; } } /** * @description Generate a new sequence number * @param path * @returns number * @memberof FileEngine * @method seq */ seq() { try { __classPrivateFieldGet(this, _PostgreSqlEngine_client, "f").querySync("CREATE SEQUENCE IF NOT EXISTS " + __classPrivateFieldGet(this, _PostgreSqlEngine_table, "f") + "_seq START 1"); const res = __classPrivateFieldGet(this, _PostgreSqlEngine_client, "f").querySync("SELECT nextval('" + __classPrivateFieldGet(this, _PostgreSqlEngine_table, "f") + "_seq');"); return res[0].nextval; } catch (error) { throw error; } } /** * @description Generate a new protocol number * @param path * @returns string * @memberof FileEngine * @method protocol */ pn(pnreset) { try { let protocol_split = "aion"; let protocol_date = new Date().toISOString().split('T')[0]; switch (pnreset) { case "daily": protocol_split = protocol_date; break; case "monthly": protocol_split = protocol_date.split('-')[0] + "-" + protocol_date.split('-')[1]; break; case "yearly": protocol_split = protocol_date.split('-')[0]; break; case "innumerable": protocol_split = "aion"; break; } const seqName = "prot" + protocol_split.replace(/-/g, ''); //create sequence for protocol_split if not exists __classPrivateFieldGet(this, _PostgreSqlEngine_client, "f").querySync("CREATE SEQUENCE IF NOT EXISTS " + seqName + "_seq START 1"); const res = __classPrivateFieldGet(this, _PostgreSqlEngine_client, "f").querySync("SELECT nextval('" + seqName + "_seq');"); return res[0].nextval + "/" + protocol_date; } catch (error) { throw error; } } } exports.PostgreSqlEngine = PostgreSqlEngine; _PostgreSqlEngine_table = new WeakMap(), _PostgreSqlEngine_columnNames = new WeakMap(), _PostgreSqlEngine_client = new WeakMap(); exports.default = PostgreSqlEngine;