@saltcorn/data 1.6.0-beta.3 → 1.6.0-beta.5
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/base-plugin/index.d.ts.map +1 -1
- package/dist/base-plugin/viewtemplates/edit.d.ts.map +1 -1
- package/dist/base-plugin/viewtemplates/list.d.ts.map +1 -1
- package/dist/base-plugin/viewtemplates/list.js +13 -1
- package/dist/base-plugin/viewtemplates/list.js.map +1 -1
- package/dist/base-plugin/viewtemplates/show.d.ts.map +1 -1
- package/dist/db/fixtures.d.ts.map +1 -1
- package/dist/db/fixtures.js +1 -0
- package/dist/db/fixtures.js.map +1 -1
- package/dist/migrations/202604091531.d.ts +2 -0
- package/dist/migrations/202604091531.d.ts.map +1 -0
- package/dist/migrations/202604091531.js +9 -0
- package/dist/migrations/202604091531.js.map +1 -0
- package/dist/migrations/202604111200.d.ts +4 -0
- package/dist/migrations/202604111200.d.ts.map +1 -0
- package/dist/migrations/202604111200.js +23 -0
- package/dist/migrations/202604111200.js.map +1 -0
- package/dist/mobile-mocks/npm/npm-registry-fetch.d.ts +3 -0
- package/dist/mobile-mocks/npm/npm-registry-fetch.d.ts.map +1 -0
- package/dist/mobile-mocks/npm/npm-registry-fetch.js +3 -0
- package/dist/mobile-mocks/npm/npm-registry-fetch.js.map +1 -0
- package/dist/mobile-mocks/saltcorn/admin-models-tenant.d.ts +1 -0
- package/dist/mobile-mocks/saltcorn/admin-models-tenant.d.ts.map +1 -0
- package/dist/mobile-mocks/saltcorn/admin-models-tenant.js +2 -0
- package/dist/mobile-mocks/saltcorn/admin-models-tenant.js.map +1 -0
- package/dist/mobile-mocks/saltcorn/plugins-loader-plugin-installer.d.ts +1 -0
- package/dist/mobile-mocks/saltcorn/plugins-loader-plugin-installer.d.ts.map +1 -0
- package/dist/mobile-mocks/saltcorn/plugins-loader-plugin-installer.js +2 -0
- package/dist/mobile-mocks/saltcorn/plugins-loader-plugin-installer.js.map +1 -0
- package/dist/mobile-mocks/saltcorn/plugins-loader-stable-versioning.d.ts +1 -0
- package/dist/mobile-mocks/saltcorn/plugins-loader-stable-versioning.d.ts.map +1 -0
- package/dist/mobile-mocks/saltcorn/plugins-loader-stable-versioning.js +2 -0
- package/dist/mobile-mocks/saltcorn/plugins-loader-stable-versioning.js.map +1 -0
- package/dist/models/config.d.ts.map +1 -1
- package/dist/models/config.js +16 -0
- package/dist/models/config.js.map +1 -1
- package/dist/models/expression.d.ts +6 -3
- package/dist/models/expression.d.ts.map +1 -1
- package/dist/models/expression.js +6 -3
- package/dist/models/expression.js.map +1 -1
- package/dist/models/page.d.ts +1 -0
- package/dist/models/page.d.ts.map +1 -1
- package/dist/models/page.js +5 -1
- package/dist/models/page.js.map +1 -1
- package/dist/models/plugin.d.ts +56 -0
- package/dist/models/plugin.d.ts.map +1 -1
- package/dist/models/plugin.js +305 -1
- package/dist/models/plugin.js.map +1 -1
- package/dist/models/table.d.ts +3 -1
- package/dist/models/table.d.ts.map +1 -1
- package/dist/models/table.js +104 -31
- package/dist/models/table.js.map +1 -1
- package/dist/models/trigger.d.ts +2 -1
- package/dist/models/trigger.d.ts.map +1 -1
- package/dist/models/trigger.js +8 -4
- package/dist/models/trigger.js.map +1 -1
- package/dist/models/user.d.ts.map +1 -1
- package/dist/models/user.js +1 -0
- package/dist/models/user.js.map +1 -1
- package/dist/models/view.d.ts +1 -0
- package/dist/models/view.d.ts.map +1 -1
- package/dist/models/view.js +65 -6
- package/dist/models/view.js.map +1 -1
- package/dist/models/workflow_run.js +1 -1
- package/dist/models/workflow_run.js.map +1 -1
- package/dist/plugin-helper.d.ts +3 -11
- package/dist/plugin-helper.d.ts.map +1 -1
- package/dist/plugin-helper.js +85 -54
- package/dist/plugin-helper.js.map +1 -1
- package/package.json +10 -8
- package/webpack.config.js +11 -0
- package/dist/tests/actions.test.d.ts +0 -2
- package/dist/tests/actions.test.d.ts.map +0 -1
- package/dist/tests/actions.test.js +0 -936
- package/dist/tests/actions.test.js.map +0 -1
- package/dist/tests/auth.test.d.ts +0 -2
- package/dist/tests/auth.test.d.ts.map +0 -1
- package/dist/tests/auth.test.js +0 -824
- package/dist/tests/auth.test.js.map +0 -1
- package/dist/tests/auxtest.test.d.ts +0 -2
- package/dist/tests/auxtest.test.d.ts.map +0 -1
- package/dist/tests/auxtest.test.js +0 -562
- package/dist/tests/auxtest.test.js.map +0 -1
- package/dist/tests/base.test.d.ts +0 -2
- package/dist/tests/base.test.d.ts.map +0 -1
- package/dist/tests/base.test.js +0 -30
- package/dist/tests/base.test.js.map +0 -1
- package/dist/tests/calc.test.d.ts +0 -2
- package/dist/tests/calc.test.d.ts.map +0 -1
- package/dist/tests/calc.test.js +0 -1081
- package/dist/tests/calc.test.js.map +0 -1
- package/dist/tests/composite_pk.test.d.ts +0 -2
- package/dist/tests/composite_pk.test.d.ts.map +0 -1
- package/dist/tests/composite_pk.test.js +0 -98
- package/dist/tests/composite_pk.test.js.map +0 -1
- package/dist/tests/config.test.d.ts +0 -2
- package/dist/tests/config.test.d.ts.map +0 -1
- package/dist/tests/config.test.js +0 -86
- package/dist/tests/config.test.js.map +0 -1
- package/dist/tests/db.test.d.ts +0 -2
- package/dist/tests/db.test.d.ts.map +0 -1
- package/dist/tests/db.test.js +0 -178
- package/dist/tests/db.test.js.map +0 -1
- package/dist/tests/discover.test.d.ts +0 -2
- package/dist/tests/discover.test.d.ts.map +0 -1
- package/dist/tests/discover.test.js +0 -245
- package/dist/tests/discover.test.js.map +0 -1
- package/dist/tests/edit.test.d.ts +0 -2
- package/dist/tests/edit.test.d.ts.map +0 -1
- package/dist/tests/edit.test.js +0 -1161
- package/dist/tests/edit.test.js.map +0 -1
- package/dist/tests/email.test.d.ts +0 -2
- package/dist/tests/email.test.d.ts.map +0 -1
- package/dist/tests/email.test.js +0 -255
- package/dist/tests/email.test.js.map +0 -1
- package/dist/tests/exact_views.test.d.ts +0 -2
- package/dist/tests/exact_views.test.d.ts.map +0 -1
- package/dist/tests/exact_views.test.js +0 -1363
- package/dist/tests/exact_views.test.js.map +0 -1
- package/dist/tests/field.test.d.ts +0 -2
- package/dist/tests/field.test.d.ts.map +0 -1
- package/dist/tests/field.test.js +0 -588
- package/dist/tests/field.test.js.map +0 -1
- package/dist/tests/fieldviews.test.d.ts +0 -2
- package/dist/tests/fieldviews.test.d.ts.map +0 -1
- package/dist/tests/fieldviews.test.js +0 -74
- package/dist/tests/fieldviews.test.js.map +0 -1
- package/dist/tests/file.test.d.ts +0 -2
- package/dist/tests/file.test.d.ts.map +0 -1
- package/dist/tests/file.test.js +0 -148
- package/dist/tests/file.test.js.map +0 -1
- package/dist/tests/filter.test.d.ts +0 -2
- package/dist/tests/filter.test.d.ts.map +0 -1
- package/dist/tests/filter.test.js +0 -496
- package/dist/tests/filter.test.js.map +0 -1
- package/dist/tests/form.test.d.ts +0 -2
- package/dist/tests/form.test.d.ts.map +0 -1
- package/dist/tests/form.test.js +0 -264
- package/dist/tests/form.test.js.map +0 -1
- package/dist/tests/list.test.d.ts +0 -2
- package/dist/tests/list.test.d.ts.map +0 -1
- package/dist/tests/list.test.js +0 -1037
- package/dist/tests/list.test.js.map +0 -1
- package/dist/tests/models.test.d.ts +0 -2
- package/dist/tests/models.test.d.ts.map +0 -1
- package/dist/tests/models.test.js +0 -417
- package/dist/tests/models.test.js.map +0 -1
- package/dist/tests/page.test.d.ts +0 -2
- package/dist/tests/page.test.d.ts.map +0 -1
- package/dist/tests/page.test.js +0 -26
- package/dist/tests/page.test.js.map +0 -1
- package/dist/tests/page_group.test.d.ts +0 -2
- package/dist/tests/page_group.test.d.ts.map +0 -1
- package/dist/tests/page_group.test.js +0 -51
- package/dist/tests/page_group.test.js.map +0 -1
- package/dist/tests/plugin.test.d.ts +0 -2
- package/dist/tests/plugin.test.d.ts.map +0 -1
- package/dist/tests/plugin.test.js +0 -60
- package/dist/tests/plugin.test.js.map +0 -1
- package/dist/tests/show.test.d.ts +0 -2
- package/dist/tests/show.test.d.ts.map +0 -1
- package/dist/tests/show.test.js +0 -561
- package/dist/tests/show.test.js.map +0 -1
- package/dist/tests/state.test.d.ts +0 -2
- package/dist/tests/state.test.d.ts.map +0 -1
- package/dist/tests/state.test.js +0 -82
- package/dist/tests/state.test.js.map +0 -1
- package/dist/tests/table.test.d.ts +0 -2
- package/dist/tests/table.test.d.ts.map +0 -1
- package/dist/tests/table.test.js +0 -2717
- package/dist/tests/table.test.js.map +0 -1
- package/dist/tests/table_history.test.d.ts +0 -2
- package/dist/tests/table_history.test.d.ts.map +0 -1
- package/dist/tests/table_history.test.js +0 -413
- package/dist/tests/table_history.test.js.map +0 -1
- package/dist/tests/tag.test.d.ts +0 -2
- package/dist/tests/tag.test.d.ts.map +0 -1
- package/dist/tests/tag.test.js +0 -97
- package/dist/tests/tag.test.js.map +0 -1
- package/dist/tests/user.test.d.ts +0 -2
- package/dist/tests/user.test.d.ts.map +0 -1
- package/dist/tests/user.test.js +0 -441
- package/dist/tests/user.test.js.map +0 -1
- package/dist/tests/view.test.d.ts +0 -2
- package/dist/tests/view.test.d.ts.map +0 -1
- package/dist/tests/view.test.js +0 -699
- package/dist/tests/view.test.js.map +0 -1
- package/dist/tests/workflow.test.d.ts +0 -2
- package/dist/tests/workflow.test.d.ts.map +0 -1
- package/dist/tests/workflow.test.js +0 -303
- package/dist/tests/workflow.test.js.map +0 -1
- package/dist/tests/workflow_run.test.d.ts +0 -2
- package/dist/tests/workflow_run.test.d.ts.map +0 -1
- package/dist/tests/workflow_run.test.js +0 -922
- package/dist/tests/workflow_run.test.js.map +0 -1
package/dist/models/table.js
CHANGED
|
@@ -201,6 +201,9 @@ class Table {
|
|
|
201
201
|
this.provider_cfg = stringToJSON(o.provider_cfg);
|
|
202
202
|
this.provider_name = o.provider_name;
|
|
203
203
|
this.fields = o.fields.map((f) => new field_1.default(f));
|
|
204
|
+
this.updated_at = ["string", "number"].includes(typeof o.updated_at)
|
|
205
|
+
? new Date(o.updated_at)
|
|
206
|
+
: o.updated_at;
|
|
204
207
|
}
|
|
205
208
|
static subClass({ user, read_only, } = {}) {
|
|
206
209
|
var _a;
|
|
@@ -242,6 +245,7 @@ class Table {
|
|
|
242
245
|
const { fields, constraints, ...updDB } = upd_rec;
|
|
243
246
|
if (updDB.ownership_field_id === "")
|
|
244
247
|
delete updDB.ownership_field_id;
|
|
248
|
+
updDB.updated_at = new Date();
|
|
245
249
|
await db_1.default.update("_sc_tables", updDB, tbl.id);
|
|
246
250
|
//limited refresh if we do not have a client
|
|
247
251
|
if (!db_1.default.getRequestContext()?.client)
|
|
@@ -600,6 +604,7 @@ class Table {
|
|
|
600
604
|
description: options.description || "",
|
|
601
605
|
provider_name: options.provider_name,
|
|
602
606
|
provider_cfg: options.provider_cfg,
|
|
607
|
+
updated_at: new Date(),
|
|
603
608
|
};
|
|
604
609
|
let pk_fld_id;
|
|
605
610
|
if (!id) {
|
|
@@ -780,25 +785,50 @@ class Table {
|
|
|
780
785
|
}
|
|
781
786
|
}
|
|
782
787
|
}
|
|
783
|
-
async addDeleteSyncInfo(ids, timestamp) {
|
|
788
|
+
async addDeleteSyncInfo(ids, timestamp, ownerFieldName, ownershipFormula) {
|
|
784
789
|
if (this.constructor.read_only)
|
|
785
790
|
throw new Error("Read-only access");
|
|
791
|
+
// Top-level keys referenced by the formula (strip join path suffixes,
|
|
792
|
+
// drop "user"). Stored in owner_fields so is_owner() can re-evaluate later.
|
|
793
|
+
const formulaTopKeys = ownershipFormula
|
|
794
|
+
? [
|
|
795
|
+
...new Set([...freeVariables(ownershipFormula)]
|
|
796
|
+
.map((v) => v.split(/[.Ⱶ]/)[0])
|
|
797
|
+
.filter((v) => v !== "user")),
|
|
798
|
+
]
|
|
799
|
+
: null;
|
|
786
800
|
await db_1.default.tryCatchInTransaction(async () => {
|
|
787
801
|
if (ids.length > 0) {
|
|
788
802
|
const schema = db_1.default.getTenantSchemaPrefix();
|
|
789
803
|
const pkName = this.pk_name || "id";
|
|
790
804
|
if (isNode()) {
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
805
|
+
const pkVals = ids.map((row) => row[pkName]);
|
|
806
|
+
await db_1.default.query(`delete from ${schema}"${db_1.default.sqlsanitize(this.name)}_sync_info" where ref = ANY($1)`, [pkVals]);
|
|
807
|
+
const tsParam = timestamp.valueOf() / 1000.0;
|
|
808
|
+
const insertParams = [tsParam];
|
|
809
|
+
const valueClauses = pkVals.map((pkVal, i) => {
|
|
810
|
+
const ownerVal = ownerFieldName
|
|
811
|
+
? ids[i][ownerFieldName] ?? null
|
|
812
|
+
: null;
|
|
813
|
+
const ownerFieldsVal = formulaTopKeys && formulaTopKeys.length > 0
|
|
814
|
+
? JSON.stringify(Object.fromEntries(formulaTopKeys.map((k) => [k, ids[i][k] ?? null])))
|
|
815
|
+
: null;
|
|
816
|
+
insertParams.push(pkVal);
|
|
817
|
+
insertParams.push(ownerVal);
|
|
818
|
+
insertParams.push(ownerFieldsVal);
|
|
819
|
+
return `($${insertParams.length - 2}, date_trunc('milliseconds', to_timestamp($1)), true, $${insertParams.length - 1}, $${insertParams.length})`;
|
|
820
|
+
});
|
|
821
|
+
await db_1.default.query(`insert into ${schema}"${db_1.default.sqlsanitize(this.name)}_sync_info" (ref, last_modified, deleted, owner_id, owner_fields)
|
|
822
|
+
values ${valueClauses.join(",")}`, insertParams);
|
|
797
823
|
}
|
|
798
824
|
else {
|
|
825
|
+
const pkVals = ids.map((row) => row[pkName]);
|
|
826
|
+
const placeholders = pkVals
|
|
827
|
+
.map((_, i) => `$${i + 1}`)
|
|
828
|
+
.join(",");
|
|
799
829
|
await db_1.default.query(`update "${db_1.default.sqlsanitize(this.name)}_sync_info"
|
|
800
830
|
set deleted = true, modified_local = true
|
|
801
|
-
where ref in (${
|
|
831
|
+
where ref in (${placeholders})`, pkVals);
|
|
802
832
|
}
|
|
803
833
|
}
|
|
804
834
|
}, (e) => {
|
|
@@ -842,6 +872,12 @@ class Table {
|
|
|
842
872
|
// get triggers on delete
|
|
843
873
|
const triggers = await trigger_1.default.getTableTriggers("Delete", this);
|
|
844
874
|
const fields = this.fields;
|
|
875
|
+
const ownerFieldName = (() => {
|
|
876
|
+
if (!this.has_sync_info || !this.ownership_field_id)
|
|
877
|
+
return null;
|
|
878
|
+
const f = fields?.find((f) => f.id === this.ownership_field_id);
|
|
879
|
+
return f?.name ?? null;
|
|
880
|
+
})();
|
|
845
881
|
if (this.updateWhereWithOwnership(where, use_user)?.notAuthorized) {
|
|
846
882
|
const state = require("../db/state").getState();
|
|
847
883
|
state.log(4, `Not authorized to deleteRows in table ${this.name}.`);
|
|
@@ -854,6 +890,13 @@ class Table {
|
|
|
854
890
|
expression: "__aggregation",
|
|
855
891
|
attributes: { json: { table: this.name } },
|
|
856
892
|
}, { cached: true });
|
|
893
|
+
// Join fields needed to snapshot ownership_formula values into sync_info.
|
|
894
|
+
// Computed once here; used either via the existing rows fetch (if it runs)
|
|
895
|
+
// or via a separate minimal fetch in the else branch below.
|
|
896
|
+
const ownershipJoinFields = {};
|
|
897
|
+
if (this.has_sync_info && this.ownership_formula) {
|
|
898
|
+
add_free_variables_to_joinfields(freeVariables(this.ownership_formula), ownershipJoinFields, fields);
|
|
899
|
+
}
|
|
857
900
|
let rows;
|
|
858
901
|
if (calc_agg_fields.length ||
|
|
859
902
|
(use_user &&
|
|
@@ -863,6 +906,7 @@ class Table {
|
|
|
863
906
|
where,
|
|
864
907
|
forUser: use_user,
|
|
865
908
|
forPublic: use_user?.role_id === 100,
|
|
909
|
+
joinFields: ownershipJoinFields,
|
|
866
910
|
});
|
|
867
911
|
}
|
|
868
912
|
const deleteFileFields = fields.filter((f) => f.type === "File" && f.attributes?.also_delete_file);
|
|
@@ -900,32 +944,47 @@ class Table {
|
|
|
900
944
|
}
|
|
901
945
|
await db_1.default.tryCatchInTransaction(async () => {
|
|
902
946
|
if (rows) {
|
|
903
|
-
const
|
|
947
|
+
const pkIds = rows.map((r) => r[this.pk_name]);
|
|
904
948
|
if (!db_1.default.isSQLite) {
|
|
905
949
|
await db_1.default.deleteWhere(this.name, {
|
|
906
|
-
[this.pk_name]: { in:
|
|
950
|
+
[this.pk_name]: { in: pkIds },
|
|
907
951
|
});
|
|
908
952
|
}
|
|
909
953
|
else {
|
|
910
|
-
await db_1.default.query(`delete from "${db_1.default.sqlsanitize(this.name)}" where "${db_1.default.sqlsanitize(this.pk_name)}" in (${
|
|
954
|
+
await db_1.default.query(`delete from "${db_1.default.sqlsanitize(this.name)}" where "${db_1.default.sqlsanitize(this.pk_name)}" in (${pkIds.join(",")})`);
|
|
911
955
|
}
|
|
912
956
|
for (const row of rows)
|
|
913
957
|
await this.auto_update_calc_aggregations(row);
|
|
914
958
|
if (this.has_sync_info) {
|
|
915
959
|
const dbTime = await db_1.default.time();
|
|
916
|
-
await this.addDeleteSyncInfo(rows, dbTime);
|
|
960
|
+
await this.addDeleteSyncInfo(rows, dbTime, ownerFieldName, this.ownership_formula);
|
|
917
961
|
}
|
|
918
962
|
}
|
|
919
963
|
else {
|
|
920
|
-
|
|
921
|
-
? await db_1.default.select(this.name, where, {
|
|
922
|
-
fields: [this.pk_name],
|
|
923
|
-
})
|
|
924
|
-
: null;
|
|
925
|
-
await db_1.default.deleteWhere(this.name, where);
|
|
964
|
+
let preDeleteRows = null;
|
|
926
965
|
if (this.has_sync_info) {
|
|
966
|
+
if (this.ownership_formula) {
|
|
967
|
+
// ownership_formula: fetch all fields (including join fields) so
|
|
968
|
+
// addDeleteSyncInfo can snapshot them into owner_fields.
|
|
969
|
+
preDeleteRows = await this.getJoinedRows({
|
|
970
|
+
where,
|
|
971
|
+
joinFields: ownershipJoinFields,
|
|
972
|
+
});
|
|
973
|
+
}
|
|
974
|
+
else {
|
|
975
|
+
// Simple case: fetch only the pk (and owner field if present).
|
|
976
|
+
const selectFields = ownerFieldName
|
|
977
|
+
? [this.pk_name, ownerFieldName]
|
|
978
|
+
: [this.pk_name];
|
|
979
|
+
preDeleteRows = await db_1.default.select(this.name, where, {
|
|
980
|
+
fields: selectFields,
|
|
981
|
+
});
|
|
982
|
+
}
|
|
983
|
+
}
|
|
984
|
+
await db_1.default.deleteWhere(this.name, where);
|
|
985
|
+
if (this.has_sync_info && preDeleteRows) {
|
|
927
986
|
const dbTime = await db_1.default.time();
|
|
928
|
-
await this.addDeleteSyncInfo(
|
|
987
|
+
await this.addDeleteSyncInfo(preDeleteRows, dbTime, ownerFieldName, this.ownership_formula);
|
|
929
988
|
}
|
|
930
989
|
}
|
|
931
990
|
//if (fields.find((f) => f.primary_key)) await this.resetSequence();
|
|
@@ -1124,9 +1183,20 @@ class Table {
|
|
|
1124
1183
|
* @param fieldnm
|
|
1125
1184
|
* @returns {Promise<Object[]>}
|
|
1126
1185
|
*/
|
|
1127
|
-
async distinctValues(fieldnm, whereObj) {
|
|
1128
|
-
|
|
1129
|
-
|
|
1186
|
+
async distinctValues(fieldnm, whereObj, user) {
|
|
1187
|
+
const useWhere = { ...(whereObj || {}) };
|
|
1188
|
+
if (user &&
|
|
1189
|
+
user.role_id > this.min_role_read &&
|
|
1190
|
+
!(this.ownership_field_id || this.ownership_formula)) {
|
|
1191
|
+
return [];
|
|
1192
|
+
}
|
|
1193
|
+
if (user &&
|
|
1194
|
+
user.role_id > this.min_role_read &&
|
|
1195
|
+
(this.ownership_field_id || this.ownership_formula)) {
|
|
1196
|
+
this.updateWhereWithOwnership(useWhere, user, true);
|
|
1197
|
+
}
|
|
1198
|
+
if (Object.keys(useWhere).length) {
|
|
1199
|
+
const { where, values } = (0, internal_1.mkWhere)(useWhere, db_1.default.isSQLite);
|
|
1130
1200
|
const res = await db_1.default.query(`select distinct "${db_1.default.sqlsanitize(fieldnm)}" from ${this.sql_name} ${where} order by "${db_1.default.sqlsanitize(fieldnm)}" limit 1000`, values);
|
|
1131
1201
|
return res.rows.map((r) => r[fieldnm]);
|
|
1132
1202
|
}
|
|
@@ -1509,8 +1579,8 @@ class Table {
|
|
|
1509
1579
|
}
|
|
1510
1580
|
else {
|
|
1511
1581
|
await db_1.default.query(`insert into "${db_1.default.sqlsanitize(this.name)}_sync_info"
|
|
1512
|
-
(ref, modified_local, deleted)
|
|
1513
|
-
values(
|
|
1582
|
+
(ref, modified_local, deleted)
|
|
1583
|
+
values($1, true, false)`, [id]);
|
|
1514
1584
|
}
|
|
1515
1585
|
}, (e) => {
|
|
1516
1586
|
require("../db/state")
|
|
@@ -1545,8 +1615,8 @@ class Table {
|
|
|
1545
1615
|
]);
|
|
1546
1616
|
}
|
|
1547
1617
|
else {
|
|
1548
|
-
await db_1.default.query(`update "${db_1.default.sqlsanitize(this.name)}_sync_info" set modified_local = true
|
|
1549
|
-
where ref = $
|
|
1618
|
+
await db_1.default.query(`update "${db_1.default.sqlsanitize(this.name)}_sync_info" set modified_local = true
|
|
1619
|
+
where ref = $1 and last_modified = $2`, [id, oldLastModified ? oldLastModified.valueOf() : null]);
|
|
1550
1620
|
}
|
|
1551
1621
|
}, (e) => {
|
|
1552
1622
|
require("../db/state")
|
|
@@ -1822,15 +1892,15 @@ class Table {
|
|
|
1822
1892
|
if (isNode()) {
|
|
1823
1893
|
// sync_info for insert
|
|
1824
1894
|
const schemaPrefix = db_1.default.getTenantSchemaPrefix();
|
|
1895
|
+
const tsParam = (syncTimestamp ? syncTimestamp : await db_1.default.time()).valueOf() /
|
|
1896
|
+
1000.0;
|
|
1825
1897
|
await db_1.default.query(`insert into ${schemaPrefix}"${db_1.default.sqlsanitize(this.name)}_sync_info"
|
|
1826
|
-
(ref, last_modified) values(
|
|
1827
|
-
${id}, date_trunc('milliseconds', to_timestamp(${(syncTimestamp ? syncTimestamp : await db_1.default.time()).valueOf() /
|
|
1828
|
-
1000.0})))`);
|
|
1898
|
+
(ref, last_modified) values($1, date_trunc('milliseconds', to_timestamp($2)))`, [id, tsParam]);
|
|
1829
1899
|
}
|
|
1830
1900
|
else {
|
|
1831
1901
|
await db_1.default.query(`insert into "${db_1.default.sqlsanitize(this.name)}_sync_info"
|
|
1832
1902
|
(last_modified, ref, modified_local, deleted)
|
|
1833
|
-
values(NULL, $
|
|
1903
|
+
values(NULL, $1, true, false)`, [id]);
|
|
1834
1904
|
}
|
|
1835
1905
|
}, (e) => {
|
|
1836
1906
|
state.log(2, `Error inserting sync info for table ${this.name}: ${e.message}`);
|
|
@@ -2145,7 +2215,9 @@ class Table {
|
|
|
2145
2215
|
ref integer,
|
|
2146
2216
|
last_modified timestamp,
|
|
2147
2217
|
deleted boolean default false,
|
|
2148
|
-
updated_fields jsonb
|
|
2218
|
+
updated_fields jsonb,
|
|
2219
|
+
owner_id integer,
|
|
2220
|
+
owner_fields jsonb)`);
|
|
2149
2221
|
await db_1.default.query(`create index "${(0, internal_1.sqlsanitize)(this.name)}_sync_info_ref_index" on ${schemaPrefix}"${(0, internal_1.sqlsanitize)(this.name)}_sync_info"(ref)`);
|
|
2150
2222
|
await db_1.default.query(`create index "${(0, internal_1.sqlsanitize)(this.name)}_sync_info_lm_index" on ${schemaPrefix}"${(0, internal_1.sqlsanitize)(this.name)}_sync_info"(last_modified)`);
|
|
2151
2223
|
await db_1.default.query(`create index "${(0, internal_1.sqlsanitize)(this.name)}_sync_info_deleted_index" on ${schemaPrefix}"${(0, internal_1.sqlsanitize)(this.name)}_sync_info"(deleted)`);
|
|
@@ -2334,6 +2406,7 @@ class Table {
|
|
|
2334
2406
|
throw new Error(`Unable to find table with id: ${this.id}`);
|
|
2335
2407
|
}
|
|
2336
2408
|
const { external, fields, constraints, ...upd_rec } = new_table_rec;
|
|
2409
|
+
upd_rec.updated_at = new Date();
|
|
2337
2410
|
await db_1.default.update("_sc_tables", upd_rec, this.id);
|
|
2338
2411
|
//limited refresh if we do not have a client
|
|
2339
2412
|
if (!db_1.default.getRequestContext()?.client)
|