prostgles-server 4.2.607 → 4.2.609
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -29
- package/dist/Audit/AuditTable.d.ts +5 -4
- package/dist/Audit/AuditTable.d.ts.map +1 -1
- package/dist/Audit/AuditTable.js +1 -1
- package/dist/Audit/AuditTable.js.map +1 -1
- package/dist/Audit/AuditTypes.d.ts +5 -0
- package/dist/Audit/AuditTypes.d.ts.map +1 -1
- package/dist/Audit/getAuditTableConfig.d.ts +1 -6
- package/dist/Audit/getAuditTableConfig.d.ts.map +1 -1
- package/dist/Audit/getAuditTableConfig.js +21 -29
- package/dist/Audit/getAuditTableConfig.js.map +1 -1
- package/dist/Audit/getAuditTriggerConfig.d.ts +4 -0
- package/dist/Audit/getAuditTriggerConfig.d.ts.map +1 -0
- package/dist/Audit/getAuditTriggerConfig.js +47 -0
- package/dist/Audit/getAuditTriggerConfig.js.map +1 -0
- package/dist/Audit/parseAuditConfig.d.ts +3 -3
- package/dist/Audit/parseAuditConfig.d.ts.map +1 -1
- package/dist/Audit/parseAuditConfig.js +38 -93
- package/dist/Audit/parseAuditConfig.js.map +1 -1
- package/dist/DboBuilder/TableHandler/updateFile.d.ts +37 -2
- package/dist/DboBuilder/TableHandler/updateFile.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/getInfo.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/getInfo.js +1 -1
- package/dist/DboBuilder/ViewHandler/getInfo.js.map +1 -1
- package/dist/DboBuilder/getColumns.d.ts.map +1 -1
- package/dist/DboBuilder/getColumns.js +1 -1
- package/dist/DboBuilder/getColumns.js.map +1 -1
- package/dist/DboBuilder/schema/getTablesForSchemaPostgresSQL.d.ts +2 -2
- package/dist/Prostgles.d.ts +1 -2
- package/dist/Prostgles.d.ts.map +1 -1
- package/dist/Prostgles.js +19 -3
- package/dist/Prostgles.js.map +1 -1
- package/dist/ProstglesTypes.d.ts +2 -2
- package/dist/ProstglesTypes.d.ts.map +1 -1
- package/dist/StorageClient/getFileTableConfig.d.ts +2 -4
- package/dist/StorageClient/getFileTableConfig.d.ts.map +1 -1
- package/dist/StorageClient/getFileTableConfig.js.map +1 -1
- package/dist/TableConfig/TableConfigTypes.d.ts +1 -1
- package/dist/TableConfig/TableConfigTypes.d.ts.map +1 -1
- package/dist/TableConfig/TableRowFromColumnDefinitions.d.ts +12 -0
- package/dist/TableConfig/TableRowFromColumnDefinitions.d.ts.map +1 -0
- package/dist/TableConfig/TableRowFromColumnDefinitions.js +3 -0
- package/dist/TableConfig/TableRowFromColumnDefinitions.js.map +1 -0
- package/dist/TableConfig/getTableTriggerQueries.d.ts +2 -2
- package/dist/TableConfig/getTableTriggerQueries.d.ts.map +1 -1
- package/dist/TableConfig/getTableTriggerQueries.js +8 -14
- package/dist/TableConfig/getTableTriggerQueries.js.map +1 -1
- package/dist/TableConfig/initTableConfig.d.ts.map +1 -1
- package/dist/TableConfig/initTableConfig.js +0 -4
- package/dist/TableConfig/initTableConfig.js.map +1 -1
- package/dist/TableConfig/managedTriggerNames.d.ts.map +1 -1
- package/dist/TableConfig/managedTriggerNames.js +0 -1
- package/dist/TableConfig/managedTriggerNames.js.map +1 -1
- package/dist/TableConfig/syncTableTriggers.d.ts.map +1 -1
- package/dist/TableConfig/syncTableTriggers.js +10 -20
- package/dist/TableConfig/syncTableTriggers.js.map +1 -1
- package/dist/WebsocketAPI/getClientSchema.d.ts.map +1 -1
- package/dist/WebsocketAPI/getClientSchema.js +2 -1
- package/dist/WebsocketAPI/getClientSchema.js.map +1 -1
- package/dist/initProstgles.d.ts.map +1 -1
- package/dist/initProstgles.js +3 -0
- package/dist/initProstgles.js.map +1 -1
- package/lib/Audit/AuditTable.ts +4 -9
- package/lib/Audit/AuditTypes.ts +6 -0
- package/lib/Audit/getAuditTableConfig.ts +21 -41
- package/lib/Audit/getAuditTriggerConfig.ts +45 -0
- package/lib/Audit/parseAuditConfig.ts +44 -131
- package/lib/DboBuilder/ViewHandler/getInfo.ts +1 -0
- package/lib/DboBuilder/getColumns.ts +1 -0
- package/lib/Prostgles.ts +20 -4
- package/lib/ProstglesTypes.ts +2 -1
- package/lib/StorageClient/getFileTableConfig.ts +2 -13
- package/lib/TableConfig/TableConfigTypes.ts +1 -1
- package/lib/TableConfig/TableRowFromColumnDefinitions.ts +19 -0
- package/lib/TableConfig/getTableTriggerQueries.ts +16 -31
- package/lib/TableConfig/initTableConfig.ts +0 -3
- package/lib/TableConfig/managedTriggerNames.ts +0 -1
- package/lib/TableConfig/syncTableTriggers.ts +19 -33
- package/lib/WebsocketAPI/getClientSchema.ts +7 -1
- package/lib/initProstgles.ts +2 -0
- package/package.json +1 -1
|
@@ -1,18 +1,14 @@
|
|
|
1
1
|
import { as } from "pg-promise";
|
|
2
|
-
import type { DB } from "../initProstgles";
|
|
3
2
|
import { asName } from "prostgles-types";
|
|
4
|
-
import type {
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
getManagedTriggerName,
|
|
8
|
-
isManagedTriggerName,
|
|
9
|
-
} from "./managedTriggerNames";
|
|
3
|
+
import type { DB } from "../initProstgles";
|
|
4
|
+
import type { BaseTableDefinition } from "./TableConfigTypes";
|
|
5
|
+
import { getManagedTriggerName, isManagedTriggerName } from "./managedTriggerNames";
|
|
10
6
|
|
|
11
7
|
/** Compare actual definitions so unchanged triggers do not cause schema refreshes. */
|
|
12
8
|
export const getTableTriggerQueries = async (
|
|
13
9
|
db: DB,
|
|
14
10
|
tableIdent: string,
|
|
15
|
-
|
|
11
|
+
triggers: BaseTableDefinition["triggers"],
|
|
16
12
|
): Promise<string[]> => {
|
|
17
13
|
const existing = await db.any<{
|
|
18
14
|
name: string;
|
|
@@ -40,9 +36,7 @@ export const getTableTriggerQueries = async (
|
|
|
40
36
|
const queries: string[] = [];
|
|
41
37
|
const desired = new Set<string>();
|
|
42
38
|
const actionBits = { insert: 4, delete: 8, update: 16, truncate: 32 };
|
|
43
|
-
for (const [functionName, trigger] of Object.entries(
|
|
44
|
-
tableConfig.triggers ?? {},
|
|
45
|
-
)) {
|
|
39
|
+
for (const [functionName, trigger] of Object.entries(triggers ?? {})) {
|
|
46
40
|
const functionIdent = asName(functionName);
|
|
47
41
|
let functionAdded = false;
|
|
48
42
|
for (const action of trigger.actions) {
|
|
@@ -52,23 +46,18 @@ export const getTableTriggerQueries = async (
|
|
|
52
46
|
const legacyName = `${functionName}_${action}`;
|
|
53
47
|
if (
|
|
54
48
|
legacyName !== name &&
|
|
55
|
-
existing.some(
|
|
56
|
-
(t) => t.name === legacyName && t.function_name === functionName,
|
|
57
|
-
)
|
|
49
|
+
existing.some((t) => t.name === legacyName && t.function_name === functionName)
|
|
58
50
|
) {
|
|
59
51
|
queries.push(`DROP TRIGGER ${asName(legacyName)} ON ${tableIdent};`);
|
|
60
52
|
}
|
|
61
53
|
const triggerIdent = asName(name);
|
|
62
54
|
const hasTransitionTables =
|
|
63
|
-
trigger.forEach === "statement" &&
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
const
|
|
67
|
-
hasTransitionTables
|
|
68
|
-
|
|
69
|
-
hasTransitionTables && action !== "delete" ? "new_table" : null;
|
|
70
|
-
const transitionTables = hasTransitionTables
|
|
71
|
-
? [
|
|
55
|
+
trigger.forEach === "statement" && trigger.type === "after" && action !== "truncate";
|
|
56
|
+
const oldTable = hasTransitionTables && action !== "insert" ? "old_table" : null;
|
|
57
|
+
const newTable = hasTransitionTables && action !== "delete" ? "new_table" : null;
|
|
58
|
+
const transitionTables =
|
|
59
|
+
hasTransitionTables ?
|
|
60
|
+
[
|
|
72
61
|
"REFERENCING",
|
|
73
62
|
newTable ? "NEW TABLE AS new_table" : "",
|
|
74
63
|
oldTable ? "OLD TABLE AS old_table" : "",
|
|
@@ -77,11 +66,9 @@ export const getTableTriggerQueries = async (
|
|
|
77
66
|
const type =
|
|
78
67
|
actionBits[action] |
|
|
79
68
|
(trigger.forEach === "row" ? 1 : 0) |
|
|
80
|
-
(trigger.type === "before"
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
? 64
|
|
84
|
-
: 0);
|
|
69
|
+
(trigger.type === "before" ? 2
|
|
70
|
+
: trigger.type === "instead of" ? 64
|
|
71
|
+
: 0);
|
|
85
72
|
const previous = existing.find((entry) => entry.name === name);
|
|
86
73
|
if (
|
|
87
74
|
previous?.type === type &&
|
|
@@ -108,9 +95,7 @@ export const getTableTriggerQueries = async (
|
|
|
108
95
|
}
|
|
109
96
|
for (const trigger of existing) {
|
|
110
97
|
const managed = isManagedTriggerName(trigger.name);
|
|
111
|
-
|
|
112
|
-
const protectsHistory = trigger.name.startsWith(AUDIT_HISTORY_PROTECTION_PREFIX);
|
|
113
|
-
if (managed && !protectsHistory && !desired.has(trigger.name)) {
|
|
98
|
+
if (managed && !desired.has(trigger.name)) {
|
|
114
99
|
queries.push(`DROP TRIGGER ${asName(trigger.name)} ON ${tableIdent};`);
|
|
115
100
|
}
|
|
116
101
|
}
|
|
@@ -12,7 +12,6 @@ import { getTableColumnQueries } from "./getTableColumnQueries";
|
|
|
12
12
|
import { getIndexesQueries } from "./indexes/getIndexesQueries";
|
|
13
13
|
import { runMigrations } from "./runMigrations";
|
|
14
14
|
import type { TableConfigurator } from "./TableConfigurator";
|
|
15
|
-
import { syncTableTriggers } from "./syncTableTriggers";
|
|
16
15
|
|
|
17
16
|
export const initTableConfig = async function (this: TableConfigurator) {
|
|
18
17
|
this.initialising = true;
|
|
@@ -282,6 +281,4 @@ export const initTableConfig = async function (this: TableConfigurator) {
|
|
|
282
281
|
}
|
|
283
282
|
|
|
284
283
|
await this.prostgles.rebuildDBO();
|
|
285
|
-
await syncTableTriggers(this.prostgles);
|
|
286
|
-
if (this.prostgles.opts.audit) await this.prostgles.rebuildDBO();
|
|
287
284
|
};
|
|
@@ -4,7 +4,6 @@ import { md5 } from "prostgles-types/dist/md5";
|
|
|
4
4
|
// Keep generated names within PostgreSQL's 63-byte identifier limit.
|
|
5
5
|
export const TABLE_CONFIG_TRIGGER_PREFIX = "prostgles_table_config_";
|
|
6
6
|
export const AUDIT_TRIGGER_PREFIX = "prostgles_audit_";
|
|
7
|
-
// History protection survives removing or changing the audit configuration.
|
|
8
7
|
export const AUDIT_HISTORY_PROTECTION_PREFIX = AUDIT_TRIGGER_PREFIX + "guard_";
|
|
9
8
|
export const AUDIT_TRUNCATE_PROTECTION_PREFIX = AUDIT_TRIGGER_PREFIX + "block_";
|
|
10
9
|
export const AUDIT_WRITER_PREFIX = AUDIT_TRIGGER_PREFIX + "write_";
|
|
@@ -1,42 +1,28 @@
|
|
|
1
|
-
import { parseAuditConfig } from "../Audit/parseAuditConfig";
|
|
2
1
|
import type { Prostgles } from "../Prostgles";
|
|
3
2
|
import { EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID } from "../PubSubManager/PubSubManagerUtils";
|
|
4
3
|
import { getTableTriggerQueries } from "./getTableTriggerQueries";
|
|
5
4
|
|
|
6
5
|
/** Applies application and generated audit triggers together, after all tables exist. */
|
|
7
6
|
export async function syncTableTriggers(prgl: Prostgles) {
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const config = prgl.mergedTableConfig.tableConfig ?? {};
|
|
14
|
-
const queries: string[] = [];
|
|
15
|
-
for (const name of Object.keys(config)) {
|
|
16
|
-
if (!prgl.dboBuilder.tables.some((t) => t.name === name)) {
|
|
17
|
-
throw new Error(
|
|
18
|
-
`Table config name must exactly match a schema table name: ${name}`,
|
|
19
|
-
);
|
|
20
|
-
}
|
|
7
|
+
const config = prgl.mergedTableConfig.tableConfig ?? {};
|
|
8
|
+
const queries: string[] = [];
|
|
9
|
+
for (const name of Object.keys(config)) {
|
|
10
|
+
if (!prgl.dboBuilder.tables.some((t) => t.name === name)) {
|
|
11
|
+
throw new Error(`Table config name must exactly match a schema table name: ${name}`);
|
|
21
12
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
)
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
);
|
|
37
|
-
}
|
|
38
|
-
} catch (error) {
|
|
39
|
-
prgl.parsedAuditConfig = previousAudit;
|
|
40
|
-
throw error;
|
|
13
|
+
}
|
|
14
|
+
for (const table of prgl.dboBuilder.tables) {
|
|
15
|
+
queries.push(
|
|
16
|
+
...(await getTableTriggerQueries(
|
|
17
|
+
prgl.dbForSchema!,
|
|
18
|
+
table.escaped_identifier,
|
|
19
|
+
config[table.name]?.triggers,
|
|
20
|
+
)),
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
if (queries.length) {
|
|
24
|
+
await prgl.dbForSchema!.tx((tx) =>
|
|
25
|
+
tx.none(`/* ${EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID} */\n${queries.join("\n")}`),
|
|
26
|
+
);
|
|
41
27
|
}
|
|
42
28
|
}
|
|
@@ -45,11 +45,17 @@ export async function getClientSchema(
|
|
|
45
45
|
const { tables: rawTables = [] } = fullSchema ?? {};
|
|
46
46
|
const { tableSchemaErrors = {} } = fullSchema ?? {};
|
|
47
47
|
const { modifyClientSchema } = this.opts;
|
|
48
|
+
const resolvedAuditConfig = modifyClientSchema ? this.resolvedAuditConfig : undefined;
|
|
48
49
|
const tables =
|
|
49
50
|
modifyClientSchema ?
|
|
50
51
|
await Promise.all(
|
|
51
52
|
rawTables.map(async (t) =>
|
|
52
|
-
modifyClientSchema(
|
|
53
|
+
modifyClientSchema(
|
|
54
|
+
t,
|
|
55
|
+
this.dboBuilder.dboMap.get(t.name)?.config,
|
|
56
|
+
userData,
|
|
57
|
+
resolvedAuditConfig,
|
|
58
|
+
),
|
|
53
59
|
),
|
|
54
60
|
)
|
|
55
61
|
: rawTables;
|
package/lib/initProstgles.ts
CHANGED
|
@@ -236,6 +236,8 @@ export const initProstgles = async function (
|
|
|
236
236
|
} finally {
|
|
237
237
|
this.preparingTableConfig = false;
|
|
238
238
|
}
|
|
239
|
+
await syncTableTriggers(this);
|
|
240
|
+
if (this.opts.audit) await this.rebuildDBO();
|
|
239
241
|
});
|
|
240
242
|
await this.tableConfigurator?.setTableOnMounts();
|
|
241
243
|
// onMount may create additional targets; validate joins against the completed schema.
|