@7365admin1/core 3.52.8 → 3.52.9

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/index.mjs CHANGED
@@ -13433,20 +13433,7 @@ async function resolveInviteActor(userId) {
13433
13433
  members.map((m) => m.role?.toString?.() ?? "").filter((r) => r && ObjectId25.isValid(r))
13434
13434
  )
13435
13435
  );
13436
- const orgLevelRoleIds = /* @__PURE__ */ new Set();
13437
- if (memberRoleIds.length) {
13438
- const memberRoles = await db2.collection("roles").find(
13439
- {
13440
- _id: { $in: memberRoleIds.map((r) => new ObjectId25(r)) },
13441
- ...LIVE_ROLE
13442
- },
13443
- { projection: { site: 1 } }
13444
- ).toArray();
13445
- for (const role of memberRoles) {
13446
- if (!role.site)
13447
- orgLevelRoleIds.add(role._id.toString());
13448
- }
13449
- }
13436
+ const orgLevelRoleIds = await orgLevelRoles(db2, memberRoleIds);
13450
13437
  return {
13451
13438
  id,
13452
13439
  name: user?.name ?? adminMember?.name ?? "",
@@ -13490,6 +13477,25 @@ async function hasOrgInvitation(userId, orgId) {
13490
13477
  );
13491
13478
  return Boolean(invite);
13492
13479
  }
13480
+ async function orgLevelRoles(db2, roles) {
13481
+ const ids2 = Array.from(
13482
+ new Set(
13483
+ roles.map((role) => role?.toString?.() ?? "").filter((role) => role && ObjectId25.isValid(role))
13484
+ )
13485
+ );
13486
+ const orgLevel = /* @__PURE__ */ new Set();
13487
+ if (!ids2.length)
13488
+ return orgLevel;
13489
+ const docs = await db2.collection("roles").find(
13490
+ { _id: { $in: ids2.map((id) => new ObjectId25(id)) }, ...LIVE_ROLE },
13491
+ { projection: { site: 1 } }
13492
+ ).toArray();
13493
+ for (const role of docs) {
13494
+ if (!role.site)
13495
+ orgLevel.add(role._id.toString());
13496
+ }
13497
+ return orgLevel;
13498
+ }
13493
13499
 
13494
13500
  // src/services/service-provider-invite.service.ts
13495
13501
  import {
@@ -23884,6 +23890,13 @@ function cameraGrant(params) {
23884
23890
  return atSite;
23885
23891
  const atOrg = org ? params.memberships.find(
23886
23892
  (membership) => !idOf(membership.siteId) && idOf(membership.org) === org
23893
+ ) ?? // Owner rule, 2026-09-02, reconciled with the LIST half (`orgSiteScope`):
23894
+ // an ORGANISATION-LEVEL role reaches every site of its own organisation
23895
+ // even when its membership row also names a `siteId`. Asked SECOND so a
23896
+ // site-less membership still grants first and nobody's granting row — and
23897
+ // so nobody's permissions — changes.
23898
+ params.memberships.find(
23899
+ (membership) => membership.orgLevelRole === true && idOf(membership.org) === org
23887
23900
  ) : void 0;
23888
23901
  if (atOrg)
23889
23902
  return atOrg;
@@ -25351,11 +25364,22 @@ function useCameraViewService() {
25351
25364
  engagedOrgs.add(String(engagement.org));
25352
25365
  }
25353
25366
  }
25367
+ const siteOrg = idText(params.site?.orgId ?? params.site?.org);
25368
+ const widenable = memberships.filter(
25369
+ (membership) => idText(membership.siteId) && idText(membership.siteId) !== String(params.siteObjectId) && siteOrg && idText(membership.org) === siteOrg
25370
+ );
25371
+ const orgLevel = widenable.length ? await orgLevelRoles(
25372
+ params.db,
25373
+ widenable.map((membership) => membership.role)
25374
+ ) : /* @__PURE__ */ new Set();
25354
25375
  const grant = cameraGrant({
25355
25376
  cameraSite: params.siteObjectId,
25356
25377
  // `orgId` is the real field; `org` is kept as a fallback only.
25357
25378
  cameraOrg: params.site?.orgId ?? params.site?.org,
25358
- memberships,
25379
+ memberships: orgLevel.size ? memberships.map((membership) => ({
25380
+ ...membership,
25381
+ orgLevelRole: orgLevel.has(idText(membership.role))
25382
+ })) : memberships,
25359
25383
  engagedOrgs
25360
25384
  });
25361
25385
  return { memberships, grant };
@@ -25939,6 +25963,9 @@ function maxConcurrentGrabs() {
25939
25963
  }
25940
25964
  var inFlightGrabs = 0;
25941
25965
  var LAST_FRAME_TTL_SECONDS = 60 * 60;
25966
+ function idText(value) {
25967
+ return value ? String(value) : "";
25968
+ }
25942
25969
 
25943
25970
  // src/utils/site-reach.util.ts
25944
25971
  async function requireSiteReach(req, site, permission) {
@@ -91869,6 +91896,7 @@ export {
91869
91896
  occasionForStatus,
91870
91897
  occurrence_book_namespace_collection,
91871
91898
  online_forms_namespace_collection,
91899
+ orgLevelRoles,
91872
91900
  orgSchema,
91873
91901
  orgSiteScope,
91874
91902
  overnight_parking_requests_namespace_collection,