prostgles-server 3.0.38 → 3.0.40

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.
Files changed (118) hide show
  1. package/dist/DBSchemaBuilder.d.ts.map +1 -1
  2. package/dist/DBSchemaBuilder.js.map +1 -1
  3. package/dist/DboBuilder/QueryBuilder/QueryBuilder.d.ts +2 -1
  4. package/dist/DboBuilder/QueryBuilder/QueryBuilder.d.ts.map +1 -1
  5. package/dist/DboBuilder/QueryBuilder/QueryBuilder.js +47 -2
  6. package/dist/DboBuilder/QueryBuilder/QueryBuilder.js.map +1 -1
  7. package/dist/DboBuilder/QueryBuilder/makeSelectQuery.d.ts +1 -1
  8. package/dist/DboBuilder/QueryBuilder/makeSelectQuery.d.ts.map +1 -1
  9. package/dist/DboBuilder/QueryBuilder/makeSelectQuery.js.map +1 -1
  10. package/dist/DboBuilder/TableHandler.d.ts +62 -0
  11. package/dist/DboBuilder/TableHandler.d.ts.map +1 -0
  12. package/dist/DboBuilder/TableHandler.js +304 -0
  13. package/dist/DboBuilder/TableHandler.js.map +1 -0
  14. package/dist/DboBuilder/ViewHandler.d.ts +137 -0
  15. package/dist/DboBuilder/ViewHandler.d.ts.map +1 -0
  16. package/dist/DboBuilder/ViewHandler.js +1292 -0
  17. package/dist/DboBuilder/ViewHandler.js.map +1 -0
  18. package/dist/DboBuilder/delete.d.ts +2 -1
  19. package/dist/DboBuilder/delete.d.ts.map +1 -1
  20. package/dist/DboBuilder/delete.js.map +1 -1
  21. package/dist/DboBuilder/getColumns.d.ts +12 -0
  22. package/dist/DboBuilder/getColumns.d.ts.map +1 -0
  23. package/dist/DboBuilder/getColumns.js +95 -0
  24. package/dist/DboBuilder/getColumns.js.map +1 -0
  25. package/dist/DboBuilder/insert.d.ts +2 -1
  26. package/dist/DboBuilder/insert.d.ts.map +1 -1
  27. package/dist/DboBuilder/insert.js +1 -1
  28. package/dist/DboBuilder/insert.js.map +1 -1
  29. package/dist/DboBuilder/insertDataParse.d.ts +2 -1
  30. package/dist/DboBuilder/insertDataParse.d.ts.map +1 -1
  31. package/dist/DboBuilder/insertDataParse.js +2 -3
  32. package/dist/DboBuilder/insertDataParse.js.map +1 -1
  33. package/dist/DboBuilder/parseUpdateRules.d.ts +18 -0
  34. package/dist/DboBuilder/parseUpdateRules.d.ts.map +1 -0
  35. package/dist/DboBuilder/parseUpdateRules.js +119 -0
  36. package/dist/DboBuilder/parseUpdateRules.js.map +1 -0
  37. package/dist/DboBuilder/update.d.ts +2 -1
  38. package/dist/DboBuilder/update.d.ts.map +1 -1
  39. package/dist/DboBuilder/update.js.map +1 -1
  40. package/dist/DboBuilder/uploadFile.d.ts +2 -1
  41. package/dist/DboBuilder/uploadFile.d.ts.map +1 -1
  42. package/dist/DboBuilder/uploadFile.js.map +1 -1
  43. package/dist/DboBuilder.d.ts +5 -185
  44. package/dist/DboBuilder.d.ts.map +1 -1
  45. package/dist/DboBuilder.js +7 -1773
  46. package/dist/DboBuilder.js.map +1 -1
  47. package/dist/FileManager.d.ts.map +1 -1
  48. package/dist/FileManager.js +4 -4
  49. package/dist/FileManager.js.map +1 -1
  50. package/dist/PubSubManager.d.ts.map +1 -1
  51. package/dist/PubSubManager.js +4 -0
  52. package/dist/PubSubManager.js.map +1 -1
  53. package/dist/PublishParser.d.ts.map +1 -1
  54. package/dist/PublishParser.js.map +1 -1
  55. package/dist/index.js +0 -38
  56. package/dist/index.js.map +1 -1
  57. package/lib/DBSchemaBuilder.d.ts.map +1 -1
  58. package/lib/DBSchemaBuilder.ts +1 -1
  59. package/lib/DboBuilder/QueryBuilder/QueryBuilder.d.ts +2 -1
  60. package/lib/DboBuilder/QueryBuilder/QueryBuilder.d.ts.map +1 -1
  61. package/lib/DboBuilder/QueryBuilder/QueryBuilder.js +47 -2
  62. package/lib/DboBuilder/QueryBuilder/QueryBuilder.ts +55 -2
  63. package/lib/DboBuilder/QueryBuilder/makeSelectQuery.d.ts +1 -1
  64. package/lib/DboBuilder/QueryBuilder/makeSelectQuery.d.ts.map +1 -1
  65. package/lib/DboBuilder/QueryBuilder/makeSelectQuery.ts +2 -1
  66. package/lib/DboBuilder/TableHandler.d.ts +54 -0
  67. package/lib/DboBuilder/TableHandler.d.ts.map +1 -0
  68. package/lib/DboBuilder/TableHandler.js +303 -0
  69. package/lib/DboBuilder/TableHandler.ts +365 -0
  70. package/lib/DboBuilder/ViewHandler.d.ts +133 -0
  71. package/lib/DboBuilder/ViewHandler.d.ts.map +1 -0
  72. package/lib/DboBuilder/ViewHandler.js +1291 -0
  73. package/lib/DboBuilder/ViewHandler.ts +1542 -0
  74. package/lib/DboBuilder/delete.d.ts +2 -1
  75. package/lib/DboBuilder/delete.d.ts.map +1 -1
  76. package/lib/DboBuilder/delete.ts +2 -1
  77. package/lib/DboBuilder/getColumns.d.ts +12 -0
  78. package/lib/DboBuilder/getColumns.d.ts.map +1 -0
  79. package/lib/DboBuilder/getColumns.js +94 -0
  80. package/lib/DboBuilder/getColumns.ts +133 -0
  81. package/lib/DboBuilder/insert.d.ts +2 -1
  82. package/lib/DboBuilder/insert.d.ts.map +1 -1
  83. package/lib/DboBuilder/insert.js +1 -1
  84. package/lib/DboBuilder/insert.ts +3 -2
  85. package/lib/DboBuilder/insertDataParse.d.ts +2 -1
  86. package/lib/DboBuilder/insertDataParse.d.ts.map +1 -1
  87. package/lib/DboBuilder/insertDataParse.js +2 -3
  88. package/lib/DboBuilder/insertDataParse.ts +6 -5
  89. package/lib/DboBuilder/parseUpdateRules.d.ts +18 -0
  90. package/lib/DboBuilder/parseUpdateRules.d.ts.map +1 -0
  91. package/lib/DboBuilder/parseUpdateRules.js +118 -0
  92. package/lib/DboBuilder/parseUpdateRules.ts +156 -0
  93. package/lib/DboBuilder/update.d.ts +2 -1
  94. package/lib/DboBuilder/update.d.ts.map +1 -1
  95. package/lib/DboBuilder/update.ts +2 -1
  96. package/lib/DboBuilder/uploadFile.d.ts +2 -1
  97. package/lib/DboBuilder/uploadFile.d.ts.map +1 -1
  98. package/lib/DboBuilder/uploadFile.ts +2 -1
  99. package/lib/DboBuilder.d.ts +5 -185
  100. package/lib/DboBuilder.d.ts.map +1 -1
  101. package/lib/DboBuilder.js +7 -1773
  102. package/lib/DboBuilder.ts +170 -2296
  103. package/lib/FileManager.d.ts.map +1 -1
  104. package/lib/FileManager.js +4 -4
  105. package/lib/FileManager.ts +3 -1
  106. package/lib/PubSubManager.d.ts.map +1 -1
  107. package/lib/PubSubManager.js +4 -0
  108. package/lib/PubSubManager.ts +6 -1
  109. package/lib/PublishParser.d.ts.map +1 -1
  110. package/lib/PublishParser.ts +3 -1
  111. package/lib/SyncReplication.ts +1 -1
  112. package/lib/index.js +0 -38
  113. package/lib/index.ts +1 -53
  114. package/package.json +2 -2
  115. package/tests/client/PID.txt +1 -1
  116. package/tests/client_only_queries.ts +1 -1
  117. package/tests/server/package-lock.json +409 -250
  118. package/tests/server/package.json +1 -1
@@ -1,5 +1,6 @@
1
1
  import { DeleteParams } from "prostgles-types";
2
- import { Filter, LocalParams, TableHandler } from "../DboBuilder";
2
+ import { Filter, LocalParams } from "../DboBuilder";
3
3
  import { TableRule } from "../PublishParser";
4
+ import { TableHandler } from "./TableHandler";
4
5
  export declare function _delete(this: TableHandler, filter?: Filter, params?: DeleteParams, param3_unused?: undefined, table_rules?: TableRule, localParams?: LocalParams): Promise<any>;
5
6
  //# sourceMappingURL=delete.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["delete.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,YAAY,EAAe,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAAE,MAAM,EAAE,WAAW,EAAuB,YAAY,EAAE,MAAM,eAAe,CAAC;AACvF,OAAO,EAAc,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGzD,wBAAsB,OAAO,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CA6HrL"}
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["delete.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,YAAY,EAAe,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAAE,MAAM,EAAE,WAAW,EAAuB,MAAM,eAAe,CAAC;AACzE,OAAO,EAAc,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,wBAAsB,OAAO,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CA6HrL"}
@@ -1,8 +1,9 @@
1
1
  import pgPromise from "pg-promise";
2
2
  import { AnyObject, asName, DeleteParams, FieldFilter } from "prostgles-types";
3
- import { Filter, LocalParams, makeErr, parseError, TableHandler } from "../DboBuilder";
3
+ import { Filter, LocalParams, makeErr, parseError } from "../DboBuilder";
4
4
  import { DeleteRule, TableRule } from "../PublishParser";
5
5
  import { pickKeys } from "../PubSubManager";
6
+ import { TableHandler } from "./TableHandler";
6
7
 
7
8
  export async function _delete(this: TableHandler, filter?: Filter, params?: DeleteParams, param3_unused?: undefined, table_rules?: TableRule, localParams?: LocalParams): Promise<any> {
8
9
  try {
@@ -0,0 +1,12 @@
1
+ import { AnyObject, ValidatedColumnInfo } from "prostgles-types";
2
+ import { LocalParams } from "../DboBuilder";
3
+ import { TableRule } from "../PublishParser";
4
+ import { TableHandler } from "./TableHandler";
5
+ import { ViewHandler } from "./ViewHandler";
6
+ export declare const isTableHandler: (v: any) => v is TableHandler;
7
+ export declare function getColumns(this: ViewHandler, lang?: string, params?: {
8
+ rule: "update";
9
+ filter: AnyObject;
10
+ data: AnyObject;
11
+ }, _param3?: undefined, tableRules?: TableRule, localParams?: LocalParams): Promise<ValidatedColumnInfo[]>;
12
+ //# sourceMappingURL=getColumns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getColumns.d.ts","sourceRoot":"","sources":["getColumns.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,mBAAmB,EACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAiB,WAAW,EAAgC,MAAM,eAAe,CAAC;AACzF,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,eAAO,MAAM,cAAc,MAAO,GAAG,sBAA+C,CAAC;AAErF,wBAAsB,UAAU,CAC9B,IAAI,EAAE,WAAW,EACjB,IAAI,CAAC,EAAE,MAAM,EACb,MAAM,CAAC,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE,EAC/D,OAAO,CAAC,EAAE,SAAS,EACnB,UAAU,CAAC,EAAE,SAAS,EACtB,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAuGhC"}
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getColumns = exports.isTableHandler = void 0;
4
+ const prostgles_types_1 = require("prostgles-types");
5
+ const DboBuilder_1 = require("../DboBuilder");
6
+ const isTableHandler = (v) => "parseUpdateRules" in v;
7
+ exports.isTableHandler = isTableHandler;
8
+ async function getColumns(lang, params, _param3, tableRules, localParams) {
9
+ try {
10
+ const p = this.getValidatedRules(tableRules, localParams);
11
+ if (!p.getColumns)
12
+ throw "Not allowed";
13
+ // console.log("getColumns", this.name, this.columns.map(c => c.name))
14
+ let dynamicUpdateFields;
15
+ if (params && tableRules && (0, exports.isTableHandler)(this)) {
16
+ if (!(0, DboBuilder_1.isPlainObject)(params) ||
17
+ (params.data && !(0, DboBuilder_1.isPlainObject)(params.data)) ||
18
+ !(0, DboBuilder_1.isPlainObject)(params.filter) ||
19
+ params.rule !== "update") {
20
+ throw "params must be { rule: 'update', filter: object, data?: object } but got: " + JSON.stringify(params);
21
+ }
22
+ if (!tableRules?.update) {
23
+ dynamicUpdateFields = [];
24
+ }
25
+ else {
26
+ const { data, filter } = params;
27
+ const updateRules = await this.parseUpdateRules(filter, data, undefined, tableRules, { ...localParams, testRule: true });
28
+ dynamicUpdateFields = updateRules.fields;
29
+ }
30
+ }
31
+ let columns = this.columns
32
+ .filter(c => {
33
+ const { insert, select, update } = p || {};
34
+ return [
35
+ ...(insert?.fields || []),
36
+ ...(select?.fields || []),
37
+ ...(update?.fields || []),
38
+ ].includes(c.name);
39
+ })
40
+ .map(_c => {
41
+ let c = { ..._c };
42
+ let label = c.comment || capitalizeFirstLetter(c.name, " ");
43
+ let select = c.privileges.some(p => p.privilege_type === "SELECT"), insert = c.privileges.some(p => p.privilege_type === "INSERT"), update = c.privileges.some(p => p.privilege_type === "UPDATE"), _delete = this.tableOrViewInfo.privileges.delete; // c.privileges.some(p => p.privilege_type === "DELETE");
44
+ delete c.privileges;
45
+ const prostgles = this.dboBuilder?.prostgles;
46
+ const fileConfig = prostgles.fileManager?.getColInfo({ colName: c.name, tableName: this.name });
47
+ /** Do not allow updates to file table unless it's to delete fields */
48
+ if (prostgles.fileManager?.config && prostgles.fileManager.tableName === this.name) {
49
+ update = false;
50
+ }
51
+ const nonOrderableUD_Types = [...prostgles_types_1._PG_geometric, "xml"];
52
+ let result = {
53
+ ...c,
54
+ label,
55
+ tsDataType: (0, DboBuilder_1.postgresToTsType)(c.udt_name),
56
+ insert: insert && Boolean(p.insert?.fields?.includes(c.name)) && tableRules?.insert?.forcedData?.[c.name] === undefined,
57
+ select: select && Boolean(p.select?.fields?.includes(c.name)),
58
+ orderBy: select && Boolean(p.select?.fields && p.select.orderByFields.includes(c.name)) && !nonOrderableUD_Types.includes(c.udt_name),
59
+ filter: Boolean(p.select?.filterFields?.includes(c.name)),
60
+ update: update && Boolean(p.update?.fields?.includes(c.name)) && tableRules?.update?.forcedData?.[c.name] === undefined,
61
+ delete: _delete && Boolean(p.delete && p.delete.filterFields && p.delete.filterFields.includes(c.name)),
62
+ ...(prostgles?.tableConfigurator?.getColInfo({ table: this.name, col: c.name, lang }) || {}),
63
+ ...(fileConfig && { file: fileConfig })
64
+ };
65
+ if (dynamicUpdateFields) {
66
+ result.update = dynamicUpdateFields.includes(c.name);
67
+ }
68
+ return result;
69
+ }).filter(c => c.select || c.update || c.delete || c.insert);
70
+ //.sort((a, b) => a.ordinal_position - b.ordinal_position);
71
+ // const tblInfo = await this.getInfo();
72
+ // if(tblInfo && tblInfo.media_table_name && tblInfo.has_media){
73
+ // const mediaRules = this.dboBuilder.dbo[tblInfo.media_table_name]?.
74
+ // return columns.concat({
75
+ // comment: "",
76
+ // data_type: "file",
77
+ // delete: false,
78
+ // });
79
+ // }
80
+ return columns;
81
+ }
82
+ catch (e) {
83
+ throw (0, DboBuilder_1.parseError)(e, `db.${this.name}.getColumns()`);
84
+ // throw "Something went wrong in " + `db.${this.name}.getColumns()`;
85
+ }
86
+ }
87
+ exports.getColumns = getColumns;
88
+ function replaceNonAlphaNumeric(string, replacement = "_") {
89
+ return string.replace(/[\W_]+/g, replacement);
90
+ }
91
+ function capitalizeFirstLetter(string, nonalpha_replacement) {
92
+ const str = replaceNonAlphaNumeric(string, nonalpha_replacement);
93
+ return str.charAt(0).toUpperCase() + str.slice(1);
94
+ }
@@ -0,0 +1,133 @@
1
+ import {
2
+ AnyObject, PG_COLUMN_UDT_DATA_TYPE,
3
+ ValidatedColumnInfo, _PG_geometric
4
+ } from "prostgles-types";
5
+ import { isPlainObject, LocalParams, parseError, postgresToTsType } from "../DboBuilder";
6
+ import { TableRule } from "../PublishParser";
7
+ import { TableHandler } from "./TableHandler";
8
+ import { ViewHandler } from "./ViewHandler";
9
+
10
+ export const isTableHandler = (v: any): v is TableHandler => "parseUpdateRules" in v;
11
+
12
+ export async function getColumns(
13
+ this: ViewHandler,
14
+ lang?: string,
15
+ params?: { rule: "update", filter: AnyObject, data: AnyObject },
16
+ _param3?: undefined,
17
+ tableRules?: TableRule,
18
+ localParams?: LocalParams
19
+ ): Promise<ValidatedColumnInfo[]> {
20
+
21
+ try {
22
+ const p = this.getValidatedRules(tableRules, localParams);
23
+
24
+ if (!p.getColumns) throw "Not allowed";
25
+
26
+ // console.log("getColumns", this.name, this.columns.map(c => c.name))
27
+
28
+
29
+ let dynamicUpdateFields: string[] | undefined;
30
+
31
+ if (params && tableRules && isTableHandler(this)) {
32
+ if (
33
+ !isPlainObject(params) ||
34
+ (params.data && !isPlainObject(params.data)) ||
35
+ !isPlainObject(params.filter) ||
36
+ params.rule !== "update"
37
+ ) {
38
+ throw "params must be { rule: 'update', filter: object, data?: object } but got: " + JSON.stringify(params);
39
+ }
40
+
41
+ if (!tableRules?.update) {
42
+ dynamicUpdateFields = [];
43
+ } else {
44
+ const { data, filter } = params;
45
+ const updateRules = await this.parseUpdateRules(filter, data, undefined, tableRules, { ...localParams, testRule: true });
46
+ dynamicUpdateFields = updateRules.fields;
47
+ }
48
+ }
49
+
50
+ const columns = this.columns
51
+ .filter(c => {
52
+ const { insert, select, update } = p || {};
53
+
54
+ return [
55
+ ...(insert?.fields || []),
56
+ ...(select?.fields || []),
57
+ ...(update?.fields || []),
58
+ ].includes(c.name)
59
+ })
60
+ .map(_c => {
61
+ let c = { ..._c };
62
+
63
+ let label = c.comment || capitalizeFirstLetter(c.name, " ");
64
+
65
+ let select = c.privileges.some(p => p.privilege_type === "SELECT"),
66
+ insert = c.privileges.some(p => p.privilege_type === "INSERT"),
67
+ update = c.privileges.some(p => p.privilege_type === "UPDATE"),
68
+ _delete = this.tableOrViewInfo.privileges.delete;// c.privileges.some(p => p.privilege_type === "DELETE");
69
+
70
+ delete (c as any).privileges;
71
+
72
+ const prostgles = this.dboBuilder?.prostgles;
73
+ const fileConfig = prostgles.fileManager?.getColInfo({ colName: c.name, tableName: this.name });
74
+
75
+ /** Do not allow updates to file table unless it's to delete fields */
76
+ if (prostgles.fileManager?.config && prostgles.fileManager.tableName === this.name) {
77
+ update = false;
78
+ }
79
+
80
+ const nonOrderableUD_Types: PG_COLUMN_UDT_DATA_TYPE[] = [..._PG_geometric, "xml" as any];
81
+
82
+ let result: ValidatedColumnInfo = {
83
+ ...c,
84
+ label,
85
+ tsDataType: postgresToTsType(c.udt_name),
86
+ insert: insert && Boolean(p.insert?.fields?.includes(c.name)) && tableRules?.insert?.forcedData?.[c.name] === undefined,
87
+ select: select && Boolean(p.select?.fields?.includes(c.name)),
88
+ orderBy: select && Boolean(p.select?.fields && p.select.orderByFields.includes(c.name)) && !nonOrderableUD_Types.includes(c.udt_name),
89
+ filter: Boolean(p.select?.filterFields?.includes(c.name)),
90
+ update: update && Boolean(p.update?.fields?.includes(c.name)) && tableRules?.update?.forcedData?.[c.name] === undefined,
91
+ delete: _delete && Boolean(p.delete && p.delete.filterFields && p.delete.filterFields.includes(c.name)),
92
+ ...(prostgles?.tableConfigurator?.getColInfo({ table: this.name, col: c.name, lang }) || {}),
93
+ ...(fileConfig && { file: fileConfig })
94
+ }
95
+
96
+ if (dynamicUpdateFields) {
97
+ result.update = dynamicUpdateFields.includes(c.name);
98
+ }
99
+
100
+ return result;
101
+ }).filter(c => c.select || c.update || c.delete || c.insert)
102
+
103
+ //.sort((a, b) => a.ordinal_position - b.ordinal_position);
104
+
105
+ // const tblInfo = await this.getInfo();
106
+
107
+ // if(tblInfo && tblInfo.media_table_name && tblInfo.has_media){
108
+ // const mediaRules = this.dboBuilder.dbo[tblInfo.media_table_name]?.
109
+ // return columns.concat({
110
+ // comment: "",
111
+ // data_type: "file",
112
+ // delete: false,
113
+ // });
114
+ // }
115
+
116
+ return columns;
117
+
118
+ } catch (e) {
119
+ throw parseError(e, `db.${this.name}.getColumns()`);
120
+ // throw "Something went wrong in " + `db.${this.name}.getColumns()`;
121
+ }
122
+ }
123
+
124
+
125
+
126
+
127
+ function replaceNonAlphaNumeric(string: string, replacement = "_"): string {
128
+ return string.replace(/[\W_]+/g, replacement);
129
+ }
130
+ function capitalizeFirstLetter(string: string, nonalpha_replacement?: string) : string {
131
+ const str = replaceNonAlphaNumeric(string, nonalpha_replacement);
132
+ return str.charAt(0).toUpperCase() + str.slice(1);
133
+ }
@@ -1,5 +1,6 @@
1
1
  import { AnyObject, InsertParams } from "prostgles-types";
2
- import { LocalParams, TableHandler } from "../DboBuilder";
2
+ import { LocalParams } from "../DboBuilder";
3
3
  import { TableRule } from "../PublishParser";
4
+ import { TableHandler } from "./TableHandler";
4
5
  export declare function insert(this: TableHandler, rowOrRows: (AnyObject | AnyObject[]), param2?: InsertParams, param3_unused?: undefined, tableRules?: TableRule, localParams?: LocalParams): Promise<any | any[] | boolean>;
5
6
  //# sourceMappingURL=insert.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"insert.d.ts","sourceRoot":"","sources":["insert.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAqC,YAAY,EAAY,MAAM,iBAAiB,CAAC;AACvG,OAAO,EAA+B,WAAW,EAA4B,YAAY,EAAE,MAAM,eAAe,CAAC;AACjH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG7C,wBAAsB,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC,CAiL1N"}
1
+ {"version":3,"file":"insert.d.ts","sourceRoot":"","sources":["insert.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAqC,YAAY,EAAY,MAAM,iBAAiB,CAAC;AACvG,OAAO,EAAiB,WAAW,EAA4B,MAAM,eAAe,CAAC;AACrF,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,wBAAsB,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC,CAiL1N"}
@@ -79,7 +79,7 @@ async function insert(rowOrRows, param2, param3_unused, tableRules, localParams)
79
79
  let returningSelect = this.makeReturnQuery(finalSelect);
80
80
  const makeQuery = async (_row, isOne = false) => {
81
81
  let row = { ..._row };
82
- if (!(0, DboBuilder_1.isPojoObject)(row)) {
82
+ if (!(0, prostgles_types_1.isObject)(row)) {
83
83
  console.trace(row);
84
84
  throw "\ninvalid insert data provided -> " + JSON.stringify(row);
85
85
  }
@@ -1,8 +1,9 @@
1
1
  import pgPromise from "pg-promise";
2
2
  import { AnyObject, asName, FieldFilter, get, getKeys, InsertParams, isObject } from "prostgles-types";
3
- import { isPlainObject, isPojoObject, LocalParams, makeErr, parseError, pgp, TableHandler } from "../DboBuilder";
3
+ import { isPlainObject, LocalParams, makeErr, parseError, pgp } from "../DboBuilder";
4
4
  import { TableRule } from "../PublishParser";
5
5
  import { asValue, omitKeys, pickKeys } from "../PubSubManager";
6
+ import { TableHandler } from "./TableHandler";
6
7
 
7
8
  export async function insert(this: TableHandler, rowOrRows: (AnyObject | AnyObject[]), param2?: InsertParams, param3_unused?: undefined, tableRules?: TableRule, localParams?: LocalParams): Promise<any | any[] | boolean> {
8
9
  // const localParams = _localParams || {};
@@ -93,7 +94,7 @@ export async function insert(this: TableHandler, rowOrRows: (AnyObject | AnyObje
93
94
  const makeQuery = async (_row: AnyObject | undefined, isOne = false) => {
94
95
  let row = { ..._row };
95
96
 
96
- if (!isPojoObject(row)) {
97
+ if (!isObject(row)) {
97
98
  console.trace(row)
98
99
  throw "\ninvalid insert data provided -> " + JSON.stringify(row);
99
100
  }
@@ -1,6 +1,7 @@
1
1
  import { AnyObject, InsertParams } from "prostgles-types";
2
- import { LocalParams, TableHandler } from "../DboBuilder";
2
+ import { LocalParams } from "../DboBuilder";
3
3
  import { TableRule } from "../PublishParser";
4
+ import { TableHandler } from "./TableHandler";
4
5
  /**
5
6
  * Used for doing referenced inserts within a single transaction
6
7
  */
@@ -1 +1 @@
1
- {"version":3,"file":"insertDataParse.d.ts","sourceRoot":"","sources":["insertDataParse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAqC,YAAY,EAAgD,MAAM,iBAAiB,CAAC;AAC3I,OAAO,EAA4B,WAAW,EAAmC,YAAY,EAAiB,MAAM,eAAe,CAAC;AACpI,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAI7C;;GAEG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC,EAC/B,MAAM,CAAC,EAAE,YAAY,EACrB,aAAa,CAAC,EAAE,SAAS,EACzB,UAAU,CAAC,EAAE,SAAS,EACtB,YAAY,CAAC,EAAE,WAAW,GACzB,OAAO,CAAC;IACT,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,EAAE,CAAC;IAC/B,YAAY,CAAC,EAAE,SAAS,GAAG,SAAS,EAAE,CAAC;CACxC,CAAC,CAoQD"}
1
+ {"version":3,"file":"insertDataParse.d.ts","sourceRoot":"","sources":["insertDataParse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAW,YAAY,EAAgD,MAAM,iBAAiB,CAAC;AACjH,OAAO,EAAE,WAAW,EAAiB,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C;;GAEG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC,EAC/B,MAAM,CAAC,EAAE,YAAY,EACrB,aAAa,CAAC,EAAE,SAAS,EACzB,UAAU,CAAC,EAAE,SAAS,EACtB,YAAY,CAAC,EAAE,WAAW,GACzB,OAAO,CAAC;IACT,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,EAAE,CAAC;IAC/B,YAAY,CAAC,EAAE,SAAS,GAAG,SAAS,EAAE,CAAC;CACxC,CAAC,CAoQD"}
@@ -2,7 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.insertDataParse = void 0;
4
4
  const prostgles_types_1 = require("prostgles-types");
5
- const DboBuilder_1 = require("../DboBuilder");
6
5
  const PubSubManager_1 = require("../PubSubManager");
7
6
  const uploadFile_1 = require("./uploadFile");
8
7
  /**
@@ -18,7 +17,7 @@ async function insertDataParse(data, param2, param3_unused, tableRules, _localPa
18
17
  return !this.column_names.concat(MEDIA_COL_NAMES).includes(k);
19
18
  }
20
19
  else if (!this.columns.find(c => c.name === k)) {
21
- if (!(0, DboBuilder_1.isPojoObject)(d[k]) && !Array.isArray(d[k])) {
20
+ if (!(0, prostgles_types_1.isObject)(d[k]) && !Array.isArray(d[k])) {
22
21
  throw new Error("Invalid/Dissalowed field in data: " + k);
23
22
  }
24
23
  else if (!this.dboBuilder.dbo[k]) {
@@ -30,7 +29,7 @@ async function insertDataParse(data, param2, param3_unused, tableRules, _localPa
30
29
  });
31
30
  const ALLOWED_COL_TYPES = ["int2", "int4", "int8", "numeric", "uuid", "text", "varchar", "char"];
32
31
  const getColumnInserts = (d) => (0, prostgles_types_1.getKeys)(d)
33
- .filter(k => d[k] && (0, DboBuilder_1.isPojoObject)(d[k]))
32
+ .filter(k => d[k] && (0, prostgles_types_1.isObject)(d[k]))
34
33
  .map(k => {
35
34
  const insertedCol = this.columns.find(c => c.name === k &&
36
35
  ALLOWED_COL_TYPES.includes(c.udt_name));
@@ -1,8 +1,9 @@
1
- import { AnyObject, asName, FieldFilter, get, getKeys, InsertParams, isDefined, isObject, PG_COLUMN_UDT_DATA_TYPE } from "prostgles-types";
2
- import { DboBuilder, isPojoObject, LocalParams, makeErr, Media, parseError, pgp, TableHandler, TableHandlers } from "../DboBuilder";
1
+ import { AnyObject, getKeys, InsertParams, isDefined, isObject, PG_COLUMN_UDT_DATA_TYPE } from "prostgles-types";
2
+ import { LocalParams, TableHandlers } from "../DboBuilder";
3
3
  import { TableRule } from "../PublishParser";
4
4
  import { omitKeys } from "../PubSubManager";
5
- import { isFile, uploadFile } from "./uploadFile";
5
+ import { TableHandler } from "./TableHandler";
6
+ import { uploadFile } from "./uploadFile";
6
7
 
7
8
  /**
8
9
  * Used for doing referenced inserts within a single transaction
@@ -27,7 +28,7 @@ export async function insertDataParse(
27
28
  if(this.is_media){
28
29
  return !this.column_names.concat(MEDIA_COL_NAMES).includes(k)
29
30
  } else if(!this.columns.find(c => c.name === k)){
30
- if(!isPojoObject(d[k]) && !Array.isArray(d[k])){
31
+ if(!isObject(d[k]) && !Array.isArray(d[k])){
31
32
  throw new Error("Invalid/Dissalowed field in data: " + k)
32
33
  } else if(!this.dboBuilder.dbo[k]){
33
34
  throw new Error("Invalid/Dissalowed nested insert table name in data: " + k)
@@ -38,7 +39,7 @@ export async function insertDataParse(
38
39
  });
39
40
  const ALLOWED_COL_TYPES: PG_COLUMN_UDT_DATA_TYPE[] = ["int2", "int4", "int8", "numeric", "uuid", "text", "varchar", "char"];
40
41
  const getColumnInserts = (d: AnyObject) => getKeys(d)
41
- .filter(k => d[k] && isPojoObject(d[k]))
42
+ .filter(k => d[k] && isObject(d[k]))
42
43
  .map(k => {
43
44
  const insertedCol = this.columns.find(c =>
44
45
  c.name === k &&
@@ -0,0 +1,18 @@
1
+ import { AnyObject, FieldFilter, UpdateParams } from "prostgles-types";
2
+ import { Filter, LocalParams } from "../DboBuilder";
3
+ import { TableRule, ValidateRow } from "../PublishParser";
4
+ import { TableHandler } from "./TableHandler";
5
+ /**
6
+ * 1) Check if publish is valid
7
+ * 2) Retrieve allowed update cols for a specific request
8
+ */
9
+ export declare function parseUpdateRules(this: TableHandler, filter: Filter, newData: AnyObject, params?: UpdateParams, tableRules?: TableRule, localParams?: LocalParams): Promise<{
10
+ fields: string[];
11
+ validateRow?: ValidateRow;
12
+ finalUpdateFilter: AnyObject;
13
+ forcedData?: AnyObject;
14
+ forcedFilter?: AnyObject;
15
+ returningFields: FieldFilter;
16
+ filterFields?: FieldFilter;
17
+ }>;
18
+ //# sourceMappingURL=parseUpdateRules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseUpdateRules.d.ts","sourceRoot":"","sources":["parseUpdateRules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAa,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,SAAS,EAAc,WAAW,EAAqB,MAAM,kBAAkB,CAAC;AACzF,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,SAAS,EAClB,MAAM,CAAC,EAAE,YAAY,EACrB,UAAU,CAAC,EAAE,SAAS,EACtB,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC;IACT,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,iBAAiB,EAAE,SAAS,CAAC;IAC7B,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,eAAe,EAAE,WAAW,CAAC;IAC7B,YAAY,CAAC,EAAE,WAAW,CAAC;CAC5B,CAAC,CAmID"}
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseUpdateRules = void 0;
4
+ const prostgles_types_1 = require("prostgles-types");
5
+ /**
6
+ * 1) Check if publish is valid
7
+ * 2) Retrieve allowed update cols for a specific request
8
+ */
9
+ async function parseUpdateRules(filter, newData, params, tableRules, localParams) {
10
+ const { testRule = false } = localParams ?? {};
11
+ if (!testRule) {
12
+ if (!newData || !Object.keys(newData).length) {
13
+ throw "no update data provided\nEXPECTING db.table.update(filter, updateData, options)";
14
+ }
15
+ this.checkFilter(filter);
16
+ }
17
+ let forcedFilter = {}, forcedData = {}, validate, returningFields = "*", filterFields = "*", fields = "*";
18
+ let finalUpdateFilter = { ...filter };
19
+ if (tableRules) {
20
+ if (!tableRules.update)
21
+ throw "update rules missing for " + this.name;
22
+ ({ forcedFilter, forcedData, fields, filterFields, validate } = tableRules.update);
23
+ returningFields = tableRules.update.returningFields ?? tableRules?.select?.fields ?? "";
24
+ if (!returningFields && params?.returning) {
25
+ throw "You are not allowed to return any fields from the update";
26
+ }
27
+ if (!fields) {
28
+ throw ` Invalid update rule fo r ${this.name}. fields missing `;
29
+ }
30
+ finalUpdateFilter = (await this.prepareWhere({ filter, forcedFilter, filterFields, localParams, tableRule: tableRules })).filter;
31
+ if (forcedFilter) {
32
+ const match = await this.findOne(finalUpdateFilter);
33
+ if (!match) {
34
+ fields = [];
35
+ }
36
+ }
37
+ if (tableRules.update.dynamicFields?.length) {
38
+ /**
39
+ * dynamicFields.fields used to allow a custom list of fields for specific records
40
+ * dynamicFields.filter cannot overlap each other
41
+ * updates must target records from a specific dynamicFields.filter or not match any dynamicFields.filter
42
+ */
43
+ if (testRule) {
44
+ for await (const [dfIndex, dfRule] of tableRules.update.dynamicFields.entries()) {
45
+ const condition = await this.getCondition({ allowed_colnames: this.column_names, filter: dfRule.filter });
46
+ if (!condition)
47
+ throw "dynamicFields.filter cannot be empty: " + JSON.stringify(dfRule);
48
+ await this.find(dfRule.filter, { limit: 0 });
49
+ /** Ensure dynamicFields filters do not overlap */
50
+ for await (const [_dfIndex, _dfRule] of tableRules.update.dynamicFields.entries()) {
51
+ if (dfIndex !== _dfIndex) {
52
+ if (await this.findOne({ $and: [dfRule.filter, _dfRule.filter] }, { select: "" })) {
53
+ throw `dynamicFields.filter cannot overlap each other. \n
54
+ Overlapping dynamicFields rules:
55
+ ${JSON.stringify(dfRule)}
56
+ AND
57
+ ${JSON.stringify(_dfRule)}
58
+ `;
59
+ }
60
+ }
61
+ }
62
+ }
63
+ }
64
+ /** Pick dynamicFields.fields if matching filter */
65
+ let matchedRule;
66
+ for await (const dfRule of tableRules.update.dynamicFields) {
67
+ const match = await this.findOne({ $and: [finalUpdateFilter, dfRule.filter].filter(prostgles_types_1.isDefined) });
68
+ if (match) {
69
+ /** Ensure it doesn't overlap with other dynamicFields.filter */
70
+ if (matchedRule) {
71
+ throw "Your update is targeting multiple tableRules.update.dynamicFields. Restrict update filter to only target one rule";
72
+ }
73
+ matchedRule = dfRule;
74
+ fields = dfRule.fields;
75
+ }
76
+ }
77
+ }
78
+ /* Safely test publish rules */
79
+ if (testRule) {
80
+ await this.validateViewRules({ fields, filterFields, returningFields, forcedFilter, dynamicFields: tableRules.update.dynamicFields, rule: "update" });
81
+ if (forcedData) {
82
+ try {
83
+ const { data, allowedCols } = this.validateNewData({ row: forcedData, forcedData: undefined, allowedFields: "*", tableRules, fixIssues: false });
84
+ const updateQ = await this.colSet.getUpdateQuery(data, allowedCols, this.dbTX || this.dboBuilder.dbo, validate ? ((row) => validate({ update: row, filter: {} }, this.dbTX || this.dboBuilder.dbo)) : undefined); //pgp.helpers.update(data, columnSet)
85
+ let query = updateQ + " WHERE FALSE ";
86
+ await this.db.any("EXPLAIN " + query);
87
+ }
88
+ catch (e) {
89
+ throw " issue with forcedData: \nVALUE: " + JSON.stringify(forcedData, null, 2) + "\nERROR: " + e;
90
+ }
91
+ }
92
+ return true;
93
+ }
94
+ }
95
+ /* Update all allowed fields (fields) except the forcedFilter (so that the user cannot change the forced filter values) */
96
+ let _fields = this.parseFieldFilter(fields);
97
+ /**
98
+ * A forced filter must be basic
99
+ */
100
+ if (forcedFilter) {
101
+ const _forcedFilterKeys = Object.keys(forcedFilter);
102
+ const nonFields = _forcedFilterKeys.filter(key => !this.column_names.includes(key));
103
+ if (nonFields.length)
104
+ throw "forcedFilter must be a basic filter ( { col_name: 'value' } ). Invalid filter keys: " + nonFields;
105
+ // const clashingFields = _forcedFilterKeys.filter(key => _fields.includes(key));
106
+ }
107
+ const validateRow = validate ? (row) => validate({ update: row, filter: finalUpdateFilter }, this.dbTX || this.dboBuilder.dbo) : undefined;
108
+ return {
109
+ fields: _fields,
110
+ validateRow,
111
+ finalUpdateFilter,
112
+ forcedData,
113
+ forcedFilter,
114
+ returningFields,
115
+ filterFields,
116
+ };
117
+ }
118
+ exports.parseUpdateRules = parseUpdateRules;