@web-ts-toolkit/access-router 0.28.0 → 0.29.0

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 (3) hide show
  1. package/index.js +27 -15
  2. package/index.mjs +27 -15
  3. package/package.json +3 -3
package/index.js CHANGED
@@ -90,9 +90,6 @@ var filterCollection = (collection, predicate) => {
90
90
  var findElement = (collection, predicate) => {
91
91
  return (0, import_utils.find)(collection, (0, import_sift.default)(predicate));
92
92
  };
93
- var matchElement = (element, predicate) => {
94
- return (0, import_sift.default)(predicate)(element);
95
- };
96
93
  var findElementById = (collection, id) => {
97
94
  return findElement(collection, { _id: id });
98
95
  };
@@ -1195,16 +1192,33 @@ var Base = class {
1195
1192
  return docs;
1196
1193
  }
1197
1194
  async includeDocsCount(docs, include) {
1198
- const { model, path, localField, foreignField, filter: _filters } = include;
1195
+ const { model, path, localField, foreignField, filter: _filters, args = {}, options = {} } = include;
1199
1196
  const svc = this.req.macl.getPublicService(model);
1200
1197
  if (!svc) return docs;
1198
+ const includeLocalValues = [];
1199
+ (0, import_utils11.forEach)(docs, (doc) => {
1200
+ includeLocalValues.push((0, import_utils11.get)(doc, localField));
1201
+ });
1202
+ const filter2 = { ..._filters ?? {}, [foreignField]: { $in: (0, import_utils11.flatten)(includeLocalValues) } };
1203
+ const result = await svc.find(
1204
+ filter2,
1205
+ {
1206
+ ...args,
1207
+ select: [foreignField]
1208
+ },
1209
+ {
1210
+ ...options,
1211
+ lean: true,
1212
+ includePermissions: false,
1213
+ includeCount: false
1214
+ }
1215
+ );
1216
+ if (!result.success) return docs;
1201
1217
  for (let y = 0; y < docs.length; y++) {
1202
1218
  const doc = docs[y];
1203
1219
  const localValue = (0, import_utils11.get)(doc, localField);
1204
- const filter2 = { ..._filters ?? {}, [foreignField]: localValue };
1205
- const result = await svc.count(filter2);
1206
- if (!result.success) continue;
1207
- setDocValue(doc, path, result.data);
1220
+ const filterFn = (row) => (0, import_utils11.intersectionBy)((0, import_utils11.castArray)(localValue), (0, import_utils11.castArray)((0, import_utils11.get)(row, foreignField)), String).length > 0;
1221
+ setDocValue(doc, path, result.data.filter(filterFn).length);
1208
1222
  }
1209
1223
  return docs;
1210
1224
  }
@@ -1946,14 +1960,12 @@ var Service = class extends Base {
1946
1960
  const { populate, overrides } = this.resolveUpsertArgs(args);
1947
1961
  const { skim, includePermissions, populateAccess } = this.resolveUpsertOptions(options);
1948
1962
  const { filter: overrideFilter, populate: overridePopulate } = overrides ?? {};
1949
- const theone = await this.model.findOne({ filter: filter2 });
1963
+ const _filter = await (overrideFilter || this.genFilter("update", filter2));
1964
+ const query = { filter: _filter };
1965
+ logger.debug(JSON.stringify({ op: "upsert", query }));
1966
+ if (_filter === false) return { success: false, code: "forbidden" /* Forbidden */, query };
1967
+ const theone = await this.model.findOne({ filter: _filter });
1950
1968
  if (theone) {
1951
- const _filter = await (overrideFilter || this.genFilter("update", filter2));
1952
- const query = { filter: _filter };
1953
- logger.debug(JSON.stringify({ op: "upsert", query }));
1954
- if (_filter === false) return { success: false, code: "forbidden" /* Forbidden */, query };
1955
- const matched = matchElement(theone, _filter);
1956
- if (!matched) return { success: false, code: "forbidden" /* Forbidden */, query };
1957
1969
  return this.updateOne(
1958
1970
  null,
1959
1971
  data,
package/index.mjs CHANGED
@@ -43,9 +43,6 @@ var filterCollection = (collection, predicate) => {
43
43
  var findElement = (collection, predicate) => {
44
44
  return find(collection, sift(predicate));
45
45
  };
46
- var matchElement = (element, predicate) => {
47
- return sift(predicate)(element);
48
- };
49
46
  var findElementById = (collection, id) => {
50
47
  return findElement(collection, { _id: id });
51
48
  };
@@ -1158,16 +1155,33 @@ var Base = class {
1158
1155
  return docs;
1159
1156
  }
1160
1157
  async includeDocsCount(docs, include) {
1161
- const { model, path, localField, foreignField, filter: _filters } = include;
1158
+ const { model, path, localField, foreignField, filter: _filters, args = {}, options = {} } = include;
1162
1159
  const svc = this.req.macl.getPublicService(model);
1163
1160
  if (!svc) return docs;
1161
+ const includeLocalValues = [];
1162
+ forEach3(docs, (doc) => {
1163
+ includeLocalValues.push(get4(doc, localField));
1164
+ });
1165
+ const filter2 = { ..._filters ?? {}, [foreignField]: { $in: flatten(includeLocalValues) } };
1166
+ const result = await svc.find(
1167
+ filter2,
1168
+ {
1169
+ ...args,
1170
+ select: [foreignField]
1171
+ },
1172
+ {
1173
+ ...options,
1174
+ lean: true,
1175
+ includePermissions: false,
1176
+ includeCount: false
1177
+ }
1178
+ );
1179
+ if (!result.success) return docs;
1164
1180
  for (let y = 0; y < docs.length; y++) {
1165
1181
  const doc = docs[y];
1166
1182
  const localValue = get4(doc, localField);
1167
- const filter2 = { ..._filters ?? {}, [foreignField]: localValue };
1168
- const result = await svc.count(filter2);
1169
- if (!result.success) continue;
1170
- setDocValue(doc, path, result.data);
1183
+ const filterFn = (row) => intersectionBy(castArray(localValue), castArray(get4(row, foreignField)), String).length > 0;
1184
+ setDocValue(doc, path, result.data.filter(filterFn).length);
1171
1185
  }
1172
1186
  return docs;
1173
1187
  }
@@ -1917,14 +1931,12 @@ var Service = class extends Base {
1917
1931
  const { populate, overrides } = this.resolveUpsertArgs(args);
1918
1932
  const { skim, includePermissions, populateAccess } = this.resolveUpsertOptions(options);
1919
1933
  const { filter: overrideFilter, populate: overridePopulate } = overrides ?? {};
1920
- const theone = await this.model.findOne({ filter: filter2 });
1934
+ const _filter = await (overrideFilter || this.genFilter("update", filter2));
1935
+ const query = { filter: _filter };
1936
+ logger.debug(JSON.stringify({ op: "upsert", query }));
1937
+ if (_filter === false) return { success: false, code: "forbidden" /* Forbidden */, query };
1938
+ const theone = await this.model.findOne({ filter: _filter });
1921
1939
  if (theone) {
1922
- const _filter = await (overrideFilter || this.genFilter("update", filter2));
1923
- const query = { filter: _filter };
1924
- logger.debug(JSON.stringify({ op: "upsert", query }));
1925
- if (_filter === false) return { success: false, code: "forbidden" /* Forbidden */, query };
1926
- const matched = matchElement(theone, _filter);
1927
- if (!matched) return { success: false, code: "forbidden" /* Forbidden */, query };
1928
1940
  return this.updateOne(
1929
1941
  null,
1930
1942
  data,
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@web-ts-toolkit/access-router",
3
3
  "description": "ACL-aware Express routers and in-memory data services for Mongoose-backed APIs",
4
4
  "homepage": "https://web-ts-toolkit.pages.dev/docs/packages/access-router",
5
- "version": "0.28.0",
5
+ "version": "0.29.0",
6
6
  "sideEffects": false,
7
7
  "keywords": [
8
8
  "express",
@@ -40,8 +40,8 @@
40
40
  "node": ">=20"
41
41
  },
42
42
  "dependencies": {
43
- "@web-ts-toolkit/express-json-router": "0.28.0",
44
- "@web-ts-toolkit/utils": "0.28.0",
43
+ "@web-ts-toolkit/express-json-router": "0.29.0",
44
+ "@web-ts-toolkit/utils": "0.29.0",
45
45
  "just-diff": "^6.0.2",
46
46
  "mongoose-schema-jsonschema": "^4.0.1",
47
47
  "sift": "^17.1.3",