From caad881beebbbb54839f5f5f7514a6470578619b Mon Sep 17 00:00:00 2001 From: Markus <46903097+mskg@users.noreply.github.com> Date: Sun, 11 Apr 2021 21:13:35 +0200 Subject: [PATCH] Deduplicate audit entries, resolves #158 (#160) --- .../tabler-world-common/package-lock.json | 17 +++++++++++++++ packages/tabler-world-common/package.json | 3 ++- packages/tabler-world-common/src/Audit.ts | 21 +++++++++++++------ 3 files changed, 34 insertions(+), 7 deletions(-) create mode 100644 packages/tabler-world-common/package-lock.json diff --git a/packages/tabler-world-common/package-lock.json b/packages/tabler-world-common/package-lock.json new file mode 100644 index 00000000..5e708aa6 --- /dev/null +++ b/packages/tabler-world-common/package-lock.json @@ -0,0 +1,17 @@ +{ + "name": "@mskg/tabler-world-common", + "version": "0.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/lodash": { + "version": "4.14.149", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.149.tgz", + "integrity": "sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ==", + "dev": true + }, + "lodash": { + "version": "4.17.15" + } + } +} diff --git a/packages/tabler-world-common/package.json b/packages/tabler-world-common/package.json index 1b5dd5a3..67fd87dd 100644 --- a/packages/tabler-world-common/package.json +++ b/packages/tabler-world-common/package.json @@ -12,7 +12,8 @@ "license": "Copyright 2019-present Markus Kling", "dependencies": {}, "devDependencies": { + "@types/lodash": "^4.14.149", "@types/node": "^14.6.0", "typescript": "4.0.2" } -} +} \ No newline at end of file diff --git a/packages/tabler-world-common/src/Audit.ts b/packages/tabler-world-common/src/Audit.ts index de511efd..c12c263c 100644 --- a/packages/tabler-world-common/src/Audit.ts +++ b/packages/tabler-world-common/src/Audit.ts @@ -1,3 +1,4 @@ +import { values } from 'lodash'; import { format } from 'util'; export type AuditEntry = { @@ -18,7 +19,7 @@ export enum AuditAction { } export class Audit { - entries: InternalAuditEntry[] = []; + entries: { [key: string]: InternalAuditEntry } = {}; constructor( private requestId?: string, @@ -28,22 +29,30 @@ export class Audit { } public async clear() { - this.entries = []; + this.entries = {}; } public async add(entry: AuditEntry) { - this.entries.push({ + const type = entry.type.replace(/ /ig, '_').toLocaleLowerCase(); + const key = `${type}:${entry.id}`; + + if (this.entries[key] != null) { + // we don't override the time if it has been access more than once + return; + } + + this.entries[key] = { ...entry, - type: entry.type.replace(/ /ig, '_').toLocaleLowerCase(), + type, time: new Date().toISOString(), - }); + }; } /** * We don't want lambda to play with our log messages */ public async dump() { - this.entries.forEach((e) => { + values(this.entries).forEach((e) => { process.stdout.write( // tslint:disable-next-line: prefer-template format('AUDIT', e.time, this.requestId, this.deviceId, this.principal, e.action, e.type, e.id) + '\n',