prostgles-server 2.0.201 → 2.0.202
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/dist/DboBuilder/delete.d.ts +5 -0
- package/dist/DboBuilder/delete.d.ts.map +1 -0
- package/dist/DboBuilder/delete.js +121 -0
- package/dist/DboBuilder/delete.js.map +1 -0
- package/dist/DboBuilder/insert.d.ts.map +1 -1
- package/dist/DboBuilder/insert.js +0 -4
- package/dist/DboBuilder/insert.js.map +1 -1
- package/dist/DboBuilder/insertDataParse.d.ts.map +1 -1
- package/dist/DboBuilder/insertDataParse.js +2 -43
- package/dist/DboBuilder/insertDataParse.js.map +1 -1
- package/dist/DboBuilder/update.d.ts +5 -0
- package/dist/DboBuilder/update.d.ts.map +1 -0
- package/dist/DboBuilder/update.js +111 -0
- package/dist/DboBuilder/update.js.map +1 -0
- package/dist/DboBuilder/uploadFile.d.ts +6 -0
- package/dist/DboBuilder/uploadFile.d.ts.map +1 -0
- package/dist/DboBuilder/uploadFile.js +48 -0
- package/dist/DboBuilder/uploadFile.js.map +1 -0
- package/dist/DboBuilder.d.ts +4 -2
- package/dist/DboBuilder.d.ts.map +1 -1
- package/dist/DboBuilder.js +12 -172
- package/dist/DboBuilder.js.map +1 -1
- package/dist/FileManager.d.ts.map +1 -1
- package/dist/FileManager.js +2 -0
- package/dist/FileManager.js.map +1 -1
- package/dist/QueryBuilder.d.ts +5 -1
- package/dist/QueryBuilder.d.ts.map +1 -1
- package/lib/DboBuilder/delete.d.ts +5 -0
- package/lib/DboBuilder/delete.d.ts.map +1 -0
- package/lib/DboBuilder/delete.js +120 -0
- package/lib/DboBuilder/delete.ts +127 -0
- package/lib/DboBuilder/insert.d.ts.map +1 -1
- package/lib/DboBuilder/insert.js +0 -4
- package/lib/DboBuilder/insert.ts +0 -4
- package/lib/DboBuilder/insertDataParse.d.ts.map +1 -1
- package/lib/DboBuilder/insertDataParse.js +2 -43
- package/lib/DboBuilder/insertDataParse.ts +2 -46
- package/lib/DboBuilder/update.d.ts +5 -0
- package/lib/DboBuilder/update.d.ts.map +1 -0
- package/lib/DboBuilder/update.js +110 -0
- package/lib/DboBuilder/update.ts +127 -0
- package/lib/DboBuilder/uploadFile.d.ts +6 -0
- package/lib/DboBuilder/uploadFile.d.ts.map +1 -0
- package/lib/DboBuilder/uploadFile.js +47 -0
- package/lib/DboBuilder/uploadFile.ts +50 -0
- package/lib/DboBuilder.d.ts +4 -2
- package/lib/DboBuilder.d.ts.map +1 -1
- package/lib/DboBuilder.js +12 -172
- package/lib/DboBuilder.ts +15 -198
- package/lib/FileManager.d.ts.map +1 -1
- package/lib/FileManager.js +2 -0
- package/lib/FileManager.ts +1 -0
- package/package.json +2 -2
- package/tests/client/PID.txt +1 -1
- package/tests/isomorphic_queries.d.ts.map +1 -1
- package/tests/isomorphic_queries.js +33 -1
- package/tests/isomorphic_queries.ts +39 -2
- package/tests/server/package-lock.json +3 -3
package/dist/DboBuilder.js
CHANGED
|
@@ -29,6 +29,8 @@ const QueryBuilder_1 = require("./QueryBuilder");
|
|
|
29
29
|
const PubSubManager_1 = require("./PubSubManager");
|
|
30
30
|
const insertDataParse_1 = require("./DboBuilder/insertDataParse");
|
|
31
31
|
const insert_1 = require("./DboBuilder/insert");
|
|
32
|
+
const update_1 = require("./DboBuilder/update");
|
|
33
|
+
const delete_1 = require("./DboBuilder/delete");
|
|
32
34
|
const Filtering_1 = require("./Filtering");
|
|
33
35
|
exports.pgp = pgPromise({
|
|
34
36
|
promiseLib: Bluebird
|
|
@@ -104,10 +106,15 @@ exports.makeErr = makeErr;
|
|
|
104
106
|
exports.EXISTS_KEYS = ["$exists", "$notExists", "$existsJoined", "$notExistsJoined"];
|
|
105
107
|
const FILTER_FUNCS = QueryBuilder_1.FUNCTIONS.filter(f => f.canBeUsedForFilter);
|
|
106
108
|
function parseError(e) {
|
|
107
|
-
// console.trace("INTERNAL ERROR: ", e);
|
|
108
109
|
let res = e instanceof Error ? e.message : (!Object.keys(e || {}).length ? e : (e && e.toString) ? e.toString() : e);
|
|
109
|
-
if (isPlainObject(e))
|
|
110
|
-
|
|
110
|
+
if (isPlainObject(e)) {
|
|
111
|
+
if (typeof e.err === "string") {
|
|
112
|
+
res = e.err;
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
res = JSON.stringify(e, null, 2);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
111
118
|
return res;
|
|
112
119
|
}
|
|
113
120
|
exports.parseError = parseError;
|
|
@@ -1653,76 +1660,7 @@ class TableHandler extends ViewHandler {
|
|
|
1653
1660
|
};
|
|
1654
1661
|
}
|
|
1655
1662
|
async update(filter, newData, params, tableRules, localParams) {
|
|
1656
|
-
|
|
1657
|
-
const parsedRules = await this.parseUpdateRules(filter, newData, params, tableRules, localParams);
|
|
1658
|
-
if (localParams?.testRule) {
|
|
1659
|
-
return parsedRules;
|
|
1660
|
-
}
|
|
1661
|
-
const { fields, validateRow, forcedData, finalUpdateFilter, returningFields, forcedFilter, filterFields } = parsedRules;
|
|
1662
|
-
let { returning, multi = true, onConflictDoNothing = false, fixIssues = false } = params || {};
|
|
1663
|
-
const { returnQuery = false } = localParams ?? {};
|
|
1664
|
-
if (params) {
|
|
1665
|
-
const good_params = ["returning", "multi", "onConflictDoNothing", "fixIssues"];
|
|
1666
|
-
const bad_params = Object.keys(params).filter(k => !good_params.includes(k));
|
|
1667
|
-
if (bad_params && bad_params.length)
|
|
1668
|
-
throw "Invalid params: " + bad_params.join(", ") + " \n Expecting: " + good_params.join(", ");
|
|
1669
|
-
}
|
|
1670
|
-
const { data, allowedCols } = this.validateNewData({ row: newData, forcedData, allowedFields: fields, tableRules, fixIssues });
|
|
1671
|
-
/* Patch data */
|
|
1672
|
-
let patchedTextData = [];
|
|
1673
|
-
this.columns.map(c => {
|
|
1674
|
-
const d = data[c.name];
|
|
1675
|
-
if (c.data_type === "text" && d && isPlainObject(d) && !["from", "to"].find(key => typeof d[key] !== "number")) {
|
|
1676
|
-
const unrecProps = Object.keys(d).filter(k => !["from", "to", "text", "md5"].includes(k));
|
|
1677
|
-
if (unrecProps.length)
|
|
1678
|
-
throw "Unrecognised params in textPatch field: " + unrecProps.join(", ");
|
|
1679
|
-
patchedTextData.push({ ...d, fieldName: c.name });
|
|
1680
|
-
}
|
|
1681
|
-
});
|
|
1682
|
-
if (patchedTextData && patchedTextData.length) {
|
|
1683
|
-
if (tableRules && !tableRules.select)
|
|
1684
|
-
throw "Select needs to be permitted to patch data";
|
|
1685
|
-
const rows = await this.find(filter, { select: patchedTextData.reduce((a, v) => ({ ...a, [v.fieldName]: 1 }), {}) }, undefined, tableRules);
|
|
1686
|
-
if (rows.length !== 1) {
|
|
1687
|
-
throw "Cannot patch data within a filter that affects more/less than 1 row";
|
|
1688
|
-
}
|
|
1689
|
-
patchedTextData.map(p => {
|
|
1690
|
-
data[p.fieldName] = (0, prostgles_types_1.unpatchText)(rows[0][p.fieldName], p);
|
|
1691
|
-
});
|
|
1692
|
-
// https://w3resource.com/PostgreSQL/overlay-function.p hp
|
|
1693
|
-
// overlay(coalesce(status, '') placing 'hom' from 2 for 0)
|
|
1694
|
-
}
|
|
1695
|
-
let nData = { ...data };
|
|
1696
|
-
// if(tableRules && tableRules.update && tableRules?.update?.validate){
|
|
1697
|
-
// nData = await tableRules.update.validate(nData);
|
|
1698
|
-
// }
|
|
1699
|
-
let query = await this.colSet.getUpdateQuery(nData, allowedCols, validateRow); //pgp.helpers.update(nData, columnSet) + " ";
|
|
1700
|
-
query += (await this.prepareWhere({
|
|
1701
|
-
filter,
|
|
1702
|
-
forcedFilter,
|
|
1703
|
-
filterFields,
|
|
1704
|
-
localParams,
|
|
1705
|
-
tableRule: tableRules
|
|
1706
|
-
})).where;
|
|
1707
|
-
if (onConflictDoNothing)
|
|
1708
|
-
query += " ON CONFLICT DO NOTHING ";
|
|
1709
|
-
let qType = "none";
|
|
1710
|
-
if (returning) {
|
|
1711
|
-
qType = multi ? "any" : "one";
|
|
1712
|
-
query += this.makeReturnQuery(await this.prepareReturning(returning, this.parseFieldFilter(returningFields)));
|
|
1713
|
-
}
|
|
1714
|
-
if (returnQuery)
|
|
1715
|
-
return query;
|
|
1716
|
-
if (this.t) {
|
|
1717
|
-
return this.t[qType](query).catch((err) => makeErr(err, localParams, this, fields));
|
|
1718
|
-
}
|
|
1719
|
-
return this.db.tx(t => t[qType](query)).catch(err => makeErr(err, localParams, this, fields));
|
|
1720
|
-
}
|
|
1721
|
-
catch (e) {
|
|
1722
|
-
if (localParams && localParams.testRule)
|
|
1723
|
-
throw e;
|
|
1724
|
-
throw { err: parseError(e), msg: `Issue with dbo.${this.name}.update(${JSON.stringify(filter || {}, null, 2)}, ${JSON.stringify(newData || {}, null, 2)}, ${JSON.stringify(params || {}, null, 2)})` };
|
|
1725
|
-
}
|
|
1663
|
+
return update_1.update.bind(this)(filter, newData, params, tableRules, localParams);
|
|
1726
1664
|
}
|
|
1727
1665
|
;
|
|
1728
1666
|
validateNewData({ row, forcedData, allowedFields, tableRules, fixIssues = false }) {
|
|
@@ -1756,105 +1694,7 @@ class TableHandler extends ViewHandler {
|
|
|
1756
1694
|
return "";
|
|
1757
1695
|
}
|
|
1758
1696
|
async delete(filter, params, param3_unused, table_rules, localParams) {
|
|
1759
|
-
|
|
1760
|
-
const { returning } = params || {};
|
|
1761
|
-
filter = filter || {};
|
|
1762
|
-
this.checkFilter(filter);
|
|
1763
|
-
// table_rules = table_rules || {};
|
|
1764
|
-
let forcedFilter = {}, filterFields = "*", returningFields = "*", validate;
|
|
1765
|
-
const { testRule = false, returnQuery = false } = localParams || {};
|
|
1766
|
-
if (table_rules) {
|
|
1767
|
-
if (!table_rules.delete)
|
|
1768
|
-
throw "delete rules missing";
|
|
1769
|
-
forcedFilter = table_rules.delete.forcedFilter;
|
|
1770
|
-
filterFields = table_rules.delete.filterFields;
|
|
1771
|
-
returningFields = table_rules.delete.returningFields;
|
|
1772
|
-
validate = table_rules.delete.validate;
|
|
1773
|
-
if (!returningFields)
|
|
1774
|
-
returningFields = (0, utils_1.get)(table_rules, "select.fields");
|
|
1775
|
-
if (!returningFields)
|
|
1776
|
-
returningFields = (0, utils_1.get)(table_rules, "delete.filterFields");
|
|
1777
|
-
if (!filterFields)
|
|
1778
|
-
throw ` Invalid delete rule for ${this.name}. filterFields missing `;
|
|
1779
|
-
/* Safely test publish rules */
|
|
1780
|
-
if (testRule) {
|
|
1781
|
-
await this.validateViewRules({ filterFields, returningFields, forcedFilter, rule: "delete" });
|
|
1782
|
-
return true;
|
|
1783
|
-
}
|
|
1784
|
-
}
|
|
1785
|
-
if (params) {
|
|
1786
|
-
const good_params = ["returning"];
|
|
1787
|
-
const bad_params = Object.keys(params).filter(k => !good_params.includes(k));
|
|
1788
|
-
if (bad_params && bad_params.length)
|
|
1789
|
-
throw "Invalid params: " + bad_params.join(", ") + " \n Expecting: " + good_params.join(", ");
|
|
1790
|
-
}
|
|
1791
|
-
let queryType = 'none';
|
|
1792
|
-
let _query = "DELETE FROM " + this.escapedName;
|
|
1793
|
-
const filterOpts = (await this.prepareWhere({
|
|
1794
|
-
filter,
|
|
1795
|
-
forcedFilter,
|
|
1796
|
-
filterFields,
|
|
1797
|
-
localParams,
|
|
1798
|
-
tableRule: table_rules
|
|
1799
|
-
}));
|
|
1800
|
-
_query += filterOpts.where;
|
|
1801
|
-
if (validate) {
|
|
1802
|
-
const _filter = filterOpts.filter;
|
|
1803
|
-
await validate(_filter);
|
|
1804
|
-
}
|
|
1805
|
-
let returningQuery = "";
|
|
1806
|
-
if (returning) {
|
|
1807
|
-
queryType = "any";
|
|
1808
|
-
if (!returningFields) {
|
|
1809
|
-
throw "Returning dissallowed";
|
|
1810
|
-
}
|
|
1811
|
-
returningQuery = this.makeReturnQuery(await this.prepareReturning(returning, this.parseFieldFilter(returningFields)));
|
|
1812
|
-
_query += returningQuery;
|
|
1813
|
-
}
|
|
1814
|
-
if (returnQuery)
|
|
1815
|
-
return _query;
|
|
1816
|
-
/**
|
|
1817
|
-
* Delete file
|
|
1818
|
-
*/
|
|
1819
|
-
const dbHandler = (this.t || this.db);
|
|
1820
|
-
if (this.is_media && this.dboBuilder.prostgles.fileManager) {
|
|
1821
|
-
if (this.dboBuilder.prostgles.opts.fileTable?.delayedDelete) {
|
|
1822
|
-
return dbHandler[queryType](`UPDATE ${(0, prostgles_types_1.asName)(this.name)} SET deleted = now() ${filterOpts.where} ${returningQuery};`);
|
|
1823
|
-
}
|
|
1824
|
-
else {
|
|
1825
|
-
const txDelete = async (tbl) => {
|
|
1826
|
-
if (!tbl.t)
|
|
1827
|
-
throw new Error("Missing transaction object t");
|
|
1828
|
-
const files = await this.find(filterOpts.filter);
|
|
1829
|
-
for await (const file of files) {
|
|
1830
|
-
await tbl.t?.any(`DELETE FROM ${(0, prostgles_types_1.asName)(this.name)} WHERE id = ` + "${id}", file);
|
|
1831
|
-
await tbl.dboBuilder.prostgles.fileManager?.deleteFile(file.name);
|
|
1832
|
-
}
|
|
1833
|
-
if (returning) {
|
|
1834
|
-
return files.map(f => (0, PubSubManager_1.pickKeys)(f, ["id", "name"]));
|
|
1835
|
-
}
|
|
1836
|
-
};
|
|
1837
|
-
if (localParams?.dbTX) {
|
|
1838
|
-
return txDelete(localParams.dbTX[this.name]);
|
|
1839
|
-
}
|
|
1840
|
-
else if (this.t) {
|
|
1841
|
-
return txDelete(this);
|
|
1842
|
-
}
|
|
1843
|
-
else {
|
|
1844
|
-
return this.dboBuilder.getTX(tx => {
|
|
1845
|
-
return txDelete(tx[this.name]);
|
|
1846
|
-
});
|
|
1847
|
-
}
|
|
1848
|
-
}
|
|
1849
|
-
}
|
|
1850
|
-
return dbHandler[queryType](_query).catch((err) => makeErr(err, localParams));
|
|
1851
|
-
}
|
|
1852
|
-
catch (e) {
|
|
1853
|
-
// console.trace(e)
|
|
1854
|
-
if (localParams && localParams.testRule)
|
|
1855
|
-
throw e;
|
|
1856
|
-
throw { err: parseError(e), msg: `Issue with dbo.${this.name}.delete(${JSON.stringify(filter || {}, null, 2)}, ${JSON.stringify(params || {}, null, 2)})` };
|
|
1857
|
-
}
|
|
1697
|
+
return delete_1._delete.bind(this)(filter, params, param3_unused, table_rules, localParams);
|
|
1858
1698
|
}
|
|
1859
1699
|
;
|
|
1860
1700
|
remove(filter, params, param3_unused, tableRules, localParams) {
|