@memberjunction/core-entities-server 6.2.0-edge.5 → 6.2.0-edge.7

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 (214) hide show
  1. package/README.md +155 -100
  2. package/dist/custom/MJAIAgentExampleEntityServer.server.d.ts +2 -0
  3. package/dist/custom/MJAIAgentExampleEntityServer.server.d.ts.map +1 -1
  4. package/dist/custom/MJAIAgentExampleEntityServer.server.js +8 -5
  5. package/dist/custom/MJAIAgentExampleEntityServer.server.js.map +1 -1
  6. package/dist/custom/MJAIAgentNoteEntityServer.server.d.ts +2 -0
  7. package/dist/custom/MJAIAgentNoteEntityServer.server.d.ts.map +1 -1
  8. package/dist/custom/MJAIAgentNoteEntityServer.server.js +8 -5
  9. package/dist/custom/MJAIAgentNoteEntityServer.server.js.map +1 -1
  10. package/dist/custom/MJAIAgentRelationshipEntityServer.server.d.ts +17 -0
  11. package/dist/custom/MJAIAgentRelationshipEntityServer.server.d.ts.map +1 -0
  12. package/dist/custom/MJAIAgentRelationshipEntityServer.server.js +71 -0
  13. package/dist/custom/MJAIAgentRelationshipEntityServer.server.js.map +1 -0
  14. package/dist/custom/MJAIAgentSessionEntityServer.server.d.ts +8 -39
  15. package/dist/custom/MJAIAgentSessionEntityServer.server.d.ts.map +1 -1
  16. package/dist/custom/MJAIAgentSessionEntityServer.server.js +44 -44
  17. package/dist/custom/MJAIAgentSessionEntityServer.server.js.map +1 -1
  18. package/dist/custom/MJAIAgentUserPolicyEntityServer.server.d.ts +23 -0
  19. package/dist/custom/MJAIAgentUserPolicyEntityServer.server.d.ts.map +1 -0
  20. package/dist/custom/MJAIAgentUserPolicyEntityServer.server.js +53 -0
  21. package/dist/custom/MJAIAgentUserPolicyEntityServer.server.js.map +1 -0
  22. package/dist/custom/MJAIPromptEntityServer.server.d.ts.map +1 -1
  23. package/dist/custom/MJAIPromptEntityServer.server.js +2 -1
  24. package/dist/custom/MJAIPromptEntityServer.server.js.map +1 -1
  25. package/dist/custom/MJBrandKitEntityServer.server.d.ts +14 -0
  26. package/dist/custom/MJBrandKitEntityServer.server.d.ts.map +1 -0
  27. package/dist/custom/MJBrandKitEntityServer.server.js +75 -0
  28. package/dist/custom/MJBrandKitEntityServer.server.js.map +1 -0
  29. package/dist/custom/MJCompanyIntegrationEntityServer.server.d.ts.map +1 -1
  30. package/dist/custom/MJCompanyIntegrationEntityServer.server.js +1 -0
  31. package/dist/custom/MJCompanyIntegrationEntityServer.server.js.map +1 -1
  32. package/dist/custom/MJComponentEntityServer.server.d.ts +11 -0
  33. package/dist/custom/MJComponentEntityServer.server.d.ts.map +1 -1
  34. package/dist/custom/MJComponentEntityServer.server.js +30 -2
  35. package/dist/custom/MJComponentEntityServer.server.js.map +1 -1
  36. package/dist/custom/MJConversationEntityServer.server.d.ts +13 -0
  37. package/dist/custom/MJConversationEntityServer.server.d.ts.map +1 -0
  38. package/dist/custom/MJConversationEntityServer.server.js +33 -0
  39. package/dist/custom/MJConversationEntityServer.server.js.map +1 -0
  40. package/dist/custom/MJDashboardEntityServer.server.d.ts +14 -0
  41. package/dist/custom/MJDashboardEntityServer.server.d.ts.map +1 -0
  42. package/dist/custom/MJDashboardEntityServer.server.js +38 -0
  43. package/dist/custom/MJDashboardEntityServer.server.js.map +1 -0
  44. package/dist/custom/MJDuplicateRunEntityServer.server.d.ts +34 -2
  45. package/dist/custom/MJDuplicateRunEntityServer.server.d.ts.map +1 -1
  46. package/dist/custom/MJDuplicateRunEntityServer.server.js +103 -23
  47. package/dist/custom/MJDuplicateRunEntityServer.server.js.map +1 -1
  48. package/dist/custom/MJEntityAlternateBaseViewEntityServer.server.d.ts +73 -0
  49. package/dist/custom/MJEntityAlternateBaseViewEntityServer.server.d.ts.map +1 -0
  50. package/dist/custom/MJEntityAlternateBaseViewEntityServer.server.js +391 -0
  51. package/dist/custom/MJEntityAlternateBaseViewEntityServer.server.js.map +1 -0
  52. package/dist/custom/MJEntityDocumentEntityServer.server.d.ts.map +1 -1
  53. package/dist/custom/MJEntityDocumentEntityServer.server.js +1 -0
  54. package/dist/custom/MJEntityDocumentEntityServer.server.js.map +1 -1
  55. package/dist/custom/MJEntityFieldPermissionEntityServer.server.d.ts +96 -22
  56. package/dist/custom/MJEntityFieldPermissionEntityServer.server.d.ts.map +1 -1
  57. package/dist/custom/MJEntityFieldPermissionEntityServer.server.js +239 -55
  58. package/dist/custom/MJEntityFieldPermissionEntityServer.server.js.map +1 -1
  59. package/dist/custom/MJListDetailEntityServer.server.d.ts.map +1 -1
  60. package/dist/custom/MJListDetailEntityServer.server.js +1 -0
  61. package/dist/custom/MJListDetailEntityServer.server.js.map +1 -1
  62. package/dist/custom/MJQueryEntityServer.server.d.ts +184 -46
  63. package/dist/custom/MJQueryEntityServer.server.d.ts.map +1 -1
  64. package/dist/custom/MJQueryEntityServer.server.js +505 -159
  65. package/dist/custom/MJQueryEntityServer.server.js.map +1 -1
  66. package/dist/custom/MJQuerySQLEntityServer.server.d.ts +15 -18
  67. package/dist/custom/MJQuerySQLEntityServer.server.d.ts.map +1 -1
  68. package/dist/custom/MJQuerySQLEntityServer.server.js +34 -42
  69. package/dist/custom/MJQuerySQLEntityServer.server.js.map +1 -1
  70. package/dist/custom/MJTagEntityServer.server.d.ts +2 -0
  71. package/dist/custom/MJTagEntityServer.server.d.ts.map +1 -1
  72. package/dist/custom/MJTagEntityServer.server.js +13 -7
  73. package/dist/custom/MJTagEntityServer.server.js.map +1 -1
  74. package/dist/custom/MJUserRoleEntityServer.server.d.ts +74 -7
  75. package/dist/custom/MJUserRoleEntityServer.server.d.ts.map +1 -1
  76. package/dist/custom/MJUserRoleEntityServer.server.js +206 -20
  77. package/dist/custom/MJUserRoleEntityServer.server.js.map +1 -1
  78. package/dist/custom/MJUserRoutineEntityServer.server.d.ts.map +1 -1
  79. package/dist/custom/MJUserRoutineEntityServer.server.js +8 -1
  80. package/dist/custom/MJUserRoutineEntityServer.server.js.map +1 -1
  81. package/dist/custom/MJUserViewEntityServer.server.d.ts +17 -1
  82. package/dist/custom/MJUserViewEntityServer.server.d.ts.map +1 -1
  83. package/dist/custom/MJUserViewEntityServer.server.js +95 -7
  84. package/dist/custom/MJUserViewEntityServer.server.js.map +1 -1
  85. package/dist/custom/MJVectorIndexEntityServer.server.d.ts +2 -0
  86. package/dist/custom/MJVectorIndexEntityServer.server.d.ts.map +1 -1
  87. package/dist/custom/MJVectorIndexEntityServer.server.js +33 -0
  88. package/dist/custom/MJVectorIndexEntityServer.server.js.map +1 -1
  89. package/dist/custom/anonymousOwnershipKeyGuard.d.ts +42 -0
  90. package/dist/custom/anonymousOwnershipKeyGuard.d.ts.map +1 -0
  91. package/dist/custom/anonymousOwnershipKeyGuard.js +36 -0
  92. package/dist/custom/anonymousOwnershipKeyGuard.js.map +1 -0
  93. package/dist/custom/approvalStamp.d.ts +37 -0
  94. package/dist/custom/approvalStamp.d.ts.map +1 -0
  95. package/dist/custom/approvalStamp.js +67 -0
  96. package/dist/custom/approvalStamp.js.map +1 -0
  97. package/dist/custom/fieldPermissionAccess.d.ts +31 -0
  98. package/dist/custom/fieldPermissionAccess.d.ts.map +1 -0
  99. package/dist/custom/fieldPermissionAccess.js +38 -0
  100. package/dist/custom/fieldPermissionAccess.js.map +1 -0
  101. package/dist/custom/fieldPermissionReconciler.d.ts.map +1 -1
  102. package/dist/custom/fieldPermissionReconciler.js +12 -2
  103. package/dist/custom/fieldPermissionReconciler.js.map +1 -1
  104. package/dist/custom/query-extraction/childRowWriter.d.ts +77 -0
  105. package/dist/custom/query-extraction/childRowWriter.d.ts.map +1 -0
  106. package/dist/custom/query-extraction/childRowWriter.js +277 -0
  107. package/dist/custom/query-extraction/childRowWriter.js.map +1 -0
  108. package/dist/custom/query-extraction/compositionTargets.d.ts +40 -0
  109. package/dist/custom/query-extraction/compositionTargets.d.ts.map +1 -0
  110. package/dist/custom/query-extraction/compositionTargets.js +99 -0
  111. package/dist/custom/query-extraction/compositionTargets.js.map +1 -0
  112. package/dist/custom/query-extraction/declared.d.ts +79 -0
  113. package/dist/custom/query-extraction/declared.d.ts.map +1 -0
  114. package/dist/custom/query-extraction/declared.js +91 -0
  115. package/dist/custom/query-extraction/declared.js.map +1 -0
  116. package/dist/custom/query-extraction/describeFacts.d.ts +40 -0
  117. package/dist/custom/query-extraction/describeFacts.d.ts.map +1 -0
  118. package/dist/custom/query-extraction/describeFacts.js +225 -0
  119. package/dist/custom/query-extraction/describeFacts.js.map +1 -0
  120. package/dist/custom/query-extraction/descriptionPass.d.ts +23 -0
  121. package/dist/custom/query-extraction/descriptionPass.d.ts.map +1 -0
  122. package/dist/custom/query-extraction/descriptionPass.js +95 -0
  123. package/dist/custom/query-extraction/descriptionPass.js.map +1 -0
  124. package/dist/custom/query-extraction/extractQuery.d.ts +25 -0
  125. package/dist/custom/query-extraction/extractQuery.d.ts.map +1 -0
  126. package/dist/custom/query-extraction/extractQuery.js +146 -0
  127. package/dist/custom/query-extraction/extractQuery.js.map +1 -0
  128. package/dist/custom/query-extraction/extractionTypes.d.ts +133 -0
  129. package/dist/custom/query-extraction/extractionTypes.d.ts.map +1 -0
  130. package/dist/custom/query-extraction/extractionTypes.js +2 -0
  131. package/dist/custom/query-extraction/extractionTypes.js.map +1 -0
  132. package/dist/custom/query-extraction/index.d.ts +16 -0
  133. package/dist/custom/query-extraction/index.d.ts.map +1 -1
  134. package/dist/custom/query-extraction/index.js +11 -1
  135. package/dist/custom/query-extraction/index.js.map +1 -1
  136. package/dist/custom/query-extraction/pipeline.d.ts +6 -2
  137. package/dist/custom/query-extraction/pipeline.d.ts.map +1 -1
  138. package/dist/custom/query-extraction/pipeline.js +21 -14
  139. package/dist/custom/query-extraction/pipeline.js.map +1 -1
  140. package/dist/custom/query-extraction/resolve.d.ts +7 -2
  141. package/dist/custom/query-extraction/resolve.d.ts.map +1 -1
  142. package/dist/custom/query-extraction/resolve.js +41 -20
  143. package/dist/custom/query-extraction/resolve.js.map +1 -1
  144. package/dist/custom/query-extraction/sourceBinding.d.ts +57 -0
  145. package/dist/custom/query-extraction/sourceBinding.d.ts.map +1 -0
  146. package/dist/custom/query-extraction/sourceBinding.js +104 -0
  147. package/dist/custom/query-extraction/sourceBinding.js.map +1 -0
  148. package/dist/custom/query-extraction/sync.d.ts +28 -4
  149. package/dist/custom/query-extraction/sync.d.ts.map +1 -1
  150. package/dist/custom/query-extraction/sync.js +147 -59
  151. package/dist/custom/query-extraction/sync.js.map +1 -1
  152. package/dist/custom/query-extraction/templateFacts.d.ts +62 -0
  153. package/dist/custom/query-extraction/templateFacts.d.ts.map +1 -0
  154. package/dist/custom/query-extraction/templateFacts.js +229 -0
  155. package/dist/custom/query-extraction/templateFacts.js.map +1 -0
  156. package/dist/custom/query-extraction/types.d.ts +8 -0
  157. package/dist/custom/query-extraction/types.d.ts.map +1 -1
  158. package/dist/custom/query-refresh/QueryExtractionService.d.ts +54 -0
  159. package/dist/custom/query-refresh/QueryExtractionService.d.ts.map +1 -0
  160. package/dist/custom/query-refresh/QueryExtractionService.js +207 -0
  161. package/dist/custom/query-refresh/QueryExtractionService.js.map +1 -0
  162. package/dist/custom/query-refresh/QueryRefreshExtractionServerOperation.d.ts +28 -0
  163. package/dist/custom/query-refresh/QueryRefreshExtractionServerOperation.d.ts.map +1 -0
  164. package/dist/custom/query-refresh/QueryRefreshExtractionServerOperation.js +106 -0
  165. package/dist/custom/query-refresh/QueryRefreshExtractionServerOperation.js.map +1 -0
  166. package/dist/custom/query-refresh/index.d.ts +14 -0
  167. package/dist/custom/query-refresh/index.d.ts.map +1 -0
  168. package/dist/custom/query-refresh/index.js +10 -0
  169. package/dist/custom/query-refresh/index.js.map +1 -0
  170. package/dist/custom/query-refresh/queryRebind.d.ts +33 -0
  171. package/dist/custom/query-refresh/queryRebind.d.ts.map +1 -0
  172. package/dist/custom/query-refresh/queryRebind.js +85 -0
  173. package/dist/custom/query-refresh/queryRebind.js.map +1 -0
  174. package/dist/custom/query-refresh/refreshAuthorization.d.ts +29 -0
  175. package/dist/custom/query-refresh/refreshAuthorization.d.ts.map +1 -0
  176. package/dist/custom/query-refresh/refreshAuthorization.js +66 -0
  177. package/dist/custom/query-refresh/refreshAuthorization.js.map +1 -0
  178. package/dist/custom/query-refresh/refreshFormat.d.ts +16 -0
  179. package/dist/custom/query-refresh/refreshFormat.d.ts.map +1 -0
  180. package/dist/custom/query-refresh/refreshFormat.js +67 -0
  181. package/dist/custom/query-refresh/refreshFormat.js.map +1 -0
  182. package/dist/custom/query-refresh/refreshOrder.d.ts +25 -0
  183. package/dist/custom/query-refresh/refreshOrder.d.ts.map +1 -0
  184. package/dist/custom/query-refresh/refreshOrder.js +95 -0
  185. package/dist/custom/query-refresh/refreshOrder.js.map +1 -0
  186. package/dist/custom/query-refresh/refreshSelection.d.ts +15 -0
  187. package/dist/custom/query-refresh/refreshSelection.d.ts.map +1 -0
  188. package/dist/custom/query-refresh/refreshSelection.js +99 -0
  189. package/dist/custom/query-refresh/refreshSelection.js.map +1 -0
  190. package/dist/custom/query-refresh/refreshTypes.d.ts +81 -0
  191. package/dist/custom/query-refresh/refreshTypes.d.ts.map +1 -0
  192. package/dist/custom/query-refresh/refreshTypes.js +5 -0
  193. package/dist/custom/query-refresh/refreshTypes.js.map +1 -0
  194. package/dist/custom/systemUserGuardState.d.ts +73 -0
  195. package/dist/custom/systemUserGuardState.d.ts.map +1 -0
  196. package/dist/custom/systemUserGuardState.js +161 -0
  197. package/dist/custom/systemUserGuardState.js.map +1 -0
  198. package/dist/custom/template-extraction/parser.js +5 -2
  199. package/dist/custom/template-extraction/parser.js.map +1 -1
  200. package/dist/custom/template-extraction/types.d.ts +1 -1
  201. package/dist/custom/template-extraction/types.d.ts.map +1 -1
  202. package/dist/custom/util.d.ts +8 -0
  203. package/dist/custom/util.d.ts.map +1 -1
  204. package/dist/custom/util.js +18 -1
  205. package/dist/custom/util.js.map +1 -1
  206. package/dist/engines/QueryEngineServer.d.ts +4 -1
  207. package/dist/engines/QueryEngineServer.d.ts.map +1 -1
  208. package/dist/engines/QueryEngineServer.js +10 -7
  209. package/dist/engines/QueryEngineServer.js.map +1 -1
  210. package/dist/index.d.ts +9 -0
  211. package/dist/index.d.ts.map +1 -1
  212. package/dist/index.js +9 -0
  213. package/dist/index.js.map +1 -1
  214. package/package.json +30 -30
@@ -5,10 +5,15 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
7
  var MJUserRoleEntityServer_1;
8
- import { BaseEntity, BaseEntityResult, IsRestrictingFieldRule, Metadata, ValidationErrorInfo, ValidationErrorType, } from '@memberjunction/core';
9
- import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
8
+ import { BaseEntity, BaseEntityResult, Metadata, ValidationErrorInfo, ValidationErrorType, } from '@memberjunction/core';
9
+ import { RegisterClass, UUIDSet, UUIDsEqual } from '@memberjunction/global';
10
10
  import { MJUserRoleEntity } from '@memberjunction/core-entities';
11
- import { FindSystemUserFieldAccessViolations, UserCache } from '@memberjunction/generic-database-provider';
11
+ import { UserCache } from '@memberjunction/generic-database-provider';
12
+ import { IsRestrictingFieldRuleAnyCase } from './fieldPermissionAccess.js';
13
+ import { GuardedTransactionGroupRefusal, IsSystemUserID, ReleaseGuardedTransactionGroupWrite, ReserveGuardedTransactionGroupWrite, StoredRestrictingFieldIDsForRole, StoredRoleRemovalViolations, } from './systemUserGuardState.js';
14
+ const UNDETERMINED_PRIOR_ASSIGNMENT_MESSAGE = 'Could not determine which user and role this assignment granted before the edit, so the change cannot be ' +
15
+ "checked against the MJ system user's field access. Refusing to save rather than risk removing a role the " +
16
+ 'server depends on. Reload the record and try again.';
12
17
  /**
13
18
  * Server-side `MJ: User Roles` entity. It carries TWO independent guards that happen to protect the
14
19
  * same table from opposite directions. They share no state and no helpers, and every write path
@@ -84,7 +89,7 @@ import { FindSystemUserFieldAccessViolations, UserCache } from '@memberjunction/
84
89
  * `CloneUserForSessionContext` carries it onto the per-session clone.)
85
90
  *
86
91
  * NOT COVERED, deliberately: a magic-link session's SYNTHESIZED roles (`context.ts`
87
- * `buildMagicLinkSessionUser`) count as roles held, so a scope-limited principal is measured by the
92
+ * `BuildMagicLinkSessionUser`) count as roles held, so a scope-limited principal is measured by the
88
93
  * same rule as any other caller. Narrowing scope-limited principals further is a magic-link concern,
89
94
  * not a role-elevation one — `IsScopeLimitedPrincipal` lives in MJServer, which this package cannot
90
95
  * import, and duplicating its predicate here would put one decision in two places. Such a session
@@ -119,6 +124,9 @@ import { FindSystemUserFieldAccessViolations, UserCache } from '@memberjunction/
119
124
  * short of its entity-level access. Removal is the opposite shape: it drops rules OUT of the
120
125
  * aggregate, so what matters is not what the departing role said but whether an `Allow` survives
121
126
  * without it.
127
+ * - **Re-pointing** ({@link Save}) — an UPDATE that changes `UserID` or `RoleID` on an existing
128
+ * row takes its OLD (user, role) pair apart exactly as a delete would, so the removal check runs
129
+ * against the pair being vacated. `Validate()` already checks the new pair as an assignment.
122
130
  *
123
131
  * Why the system user must stay unrestricted: the server runs background work as that account.
124
132
  * It pre-warms the shared engine caches at startup, and in task mode — which job and agent
@@ -128,14 +136,23 @@ import { FindSystemUserFieldAccessViolations, UserCache } from '@memberjunction/
128
136
  * cache that everyone reads afterward, with nothing at the point of failure pointing back at
129
137
  * the role assignment that caused it.
130
138
  *
131
- * Unlike guard A, guard B reads cached metadata (`Metadata.Entities`, the provider, `UserCache`).
132
- * It still performs no database I/O, but it is not state-free, and it needs those caches populated
133
- * to have an opinion — a cold `UserCache` skips the check rather than blocking an administrator.
139
+ * Unlike guard A, guard B is not pure. `Validate()` checks an assignment against cached metadata
140
+ * so a form can show the reason early, but the deciding checks run in `Save()` and `Delete()` on
141
+ * the system user's role set and field rules as stored in the database (`systemUserGuardState`),
142
+ * because the caches lag a write made a moment before. They run for a `ReplayOnly` save too. A
143
+ * transaction group holding this and another guarded write that concerns the system user is
144
+ * refused, since neither check could see the other's change. A cold `UserCache` (no system user
145
+ * to identify) skips the check rather than blocking an administrator.
134
146
  *
135
147
  * This restricts CONFIGURATION only. There is no user who is exempt from a Deny at runtime —
136
148
  * not even the system user, whose access comes from the same rows as everyone else's.
137
149
  */
138
150
  let MJUserRoleEntityServer = MJUserRoleEntityServer_1 = class MJUserRoleEntityServer extends MJUserRoleEntity {
151
+ constructor() {
152
+ super(...arguments);
153
+ /** This write's place in its transaction group, held from guard B's group check until the write enrols. */
154
+ this.pendingGroupWrite = null;
155
+ }
139
156
  Validate() {
140
157
  const result = super.Validate();
141
158
  // Guard A — the caller may only assign/move a role they hold themselves.
@@ -168,7 +185,131 @@ let MJUserRoleEntityServer = MJUserRoleEntityServer_1 = class MJUserRoleEntitySe
168
185
  return this.refuse(this.IsSaved ? 'update' : 'create', 'Only an Owner may perform a ReplayOnly save on a user-role assignment. ReplayOnly bypasses ' +
169
186
  'validation, which is where this entity\'s role-elevation invariants are enforced.');
170
187
  }
171
- return super.Save(options);
188
+ // Guard B on the save path. Not only in Validate(): a ReplayOnly save skips Validate(), and
189
+ // an Owner may replay — this check has no Owner exemption, so it must run either way.
190
+ let saved = false;
191
+ try {
192
+ const rejection = await this.systemUserSaveRejection();
193
+ if (rejection) {
194
+ return this.refuse(this.IsSaved ? 'update' : 'create', rejection);
195
+ }
196
+ saved = await super.Save(options);
197
+ return saved;
198
+ }
199
+ finally {
200
+ this.settleGroupWrite(saved);
201
+ }
202
+ }
203
+ /**
204
+ * Ends this write's hold on the group place guard B reserved: kept when the write enrolled,
205
+ * given back when it was refused, returned false or threw, so a retry is not counted twice.
206
+ */
207
+ settleGroupWrite(enrolled) {
208
+ const pending = this.pendingGroupWrite;
209
+ this.pendingGroupWrite = null;
210
+ if (!enrolled) {
211
+ ReleaseGuardedTransactionGroupWrite(pending);
212
+ }
213
+ }
214
+ /**
215
+ * Guard B for a save, judged on the database rather than the caches: a transaction group
216
+ * holding this and another guarded write that concerns the system user is refused; an update
217
+ * that re-points the row is checked as a removal of the pair it leaves; and an assignment of
218
+ * a role to the system user is refused when that role carries a stored `Deny`. A read that
219
+ * fails refuses the save.
220
+ */
221
+ async systemUserSaveRejection() {
222
+ const priorUserID = this.priorValue('UserID', this.UserID);
223
+ const concernsSystemUser = IsSystemUserID(this.UserID) || priorUserID === undefined || IsSystemUserID(priorUserID);
224
+ const groupRefusal = this.groupRefusal(concernsSystemUser);
225
+ if (groupRefusal || !concernsSystemUser) {
226
+ return groupRefusal;
227
+ }
228
+ try {
229
+ const removal = this.IsSaved ? await this.vacatedPairRemovalReason() : null;
230
+ return removal ?? (await this.storedAssignmentRejectionReason());
231
+ }
232
+ catch (e) {
233
+ return MJUserRoleEntityServer_1.unverifiableMessage(e);
234
+ }
235
+ }
236
+ /**
237
+ * Why assigning this row's role to the system user is refused on the rules as stored now, or
238
+ * null. Only a create or a re-point assigns; an update that keeps the pair assigns nothing new.
239
+ */
240
+ async storedAssignmentRejectionReason() {
241
+ if (!IsSystemUserID(this.UserID) || !this.RoleID || (this.IsSaved && !this.isRepoint())) {
242
+ return null;
243
+ }
244
+ const fieldIDs = await StoredRestrictingFieldIDsForRole(this.RunViewProviderToUse, this.RoleID);
245
+ const entities = MJUserRoleEntityServer_1.entityNamesForFieldIDs(fieldIDs, this.ProviderToUse);
246
+ return entities.length > 0 ? MJUserRoleEntityServer_1.assignmentRejectionMessage(entities) : null;
247
+ }
248
+ /** Whether this update moves the row to a different (user, role) pair. Unknown prior values count as a move. */
249
+ isRepoint() {
250
+ const priorUserID = this.priorValue('UserID', this.UserID);
251
+ const priorRoleID = this.priorValue('RoleID', this.RoleID);
252
+ if (priorUserID === undefined || priorRoleID === undefined) {
253
+ return true;
254
+ }
255
+ return !UUIDsEqual(priorUserID, this.UserID) || !UUIDsEqual(priorRoleID, this.RoleID);
256
+ }
257
+ /** Names of the entities owning the given fields, from loaded metadata, each once. */
258
+ static entityNamesForFieldIDs(fieldIDs, provider) {
259
+ const md = provider ?? new Metadata();
260
+ const ids = new UUIDSet(fieldIDs);
261
+ const names = new Set();
262
+ for (const entity of md.Entities) {
263
+ if (entity.Fields.some((f) => ids.Has(f.ID))) {
264
+ names.add(entity.Name);
265
+ }
266
+ }
267
+ return [...names];
268
+ }
269
+ /** The refusal when the system user's field access cannot be checked because a read failed. */
270
+ static unverifiableMessage(error) {
271
+ const detail = error instanceof Error ? error.message : String(error);
272
+ return `Could not check this change against the MJ system user's field access, so it was not saved. ${detail}`;
273
+ }
274
+ /**
275
+ * Why re-pointing this assignment away from its stored (user, role) pair would cost the MJ
276
+ * system user field access, or null when it would not.
277
+ *
278
+ * Evaluated as a removal of the OLD pair with nothing added in its place. When `RoleID` moves
279
+ * between two roles on the system user that is conservative — the incoming role might hold the
280
+ * very `Allow` the outgoing one is taking away — but assigning the new role first and then
281
+ * deleting the old one reaches the same state through checks that can each see the whole
282
+ * picture.
283
+ *
284
+ * A re-pointed column whose prior value cannot be established fails CLOSED while there is a
285
+ * system user to protect: the vacated pair might be one of its roles.
286
+ */
287
+ async vacatedPairRemovalReason() {
288
+ if (!this.isRepoint()) {
289
+ return null; // not a re-point — at most a change of casing
290
+ }
291
+ return this.storedPairRemovalReason();
292
+ }
293
+ /**
294
+ * Why removing this row's STORED (user, role) pair would cost the system user field access,
295
+ * or null. Shared by the delete path and the re-point path, which take the same pair apart.
296
+ */
297
+ async storedPairRemovalReason() {
298
+ const priorUserID = this.priorValue('UserID', this.UserID);
299
+ const priorRoleID = this.priorValue('RoleID', this.RoleID);
300
+ if (priorUserID === undefined || priorRoleID === undefined) {
301
+ return UserCache.Instance?.GetSystemUser?.() ? UNDETERMINED_PRIOR_ASSIGNMENT_MESSAGE : null;
302
+ }
303
+ return this.systemUserRoleRemovalReason(priorUserID, priorRoleID);
304
+ }
305
+ /** A column's stored value; undefined when it is dirty and its old value is not a usable ID. */
306
+ priorValue(fieldName, current) {
307
+ const field = this.GetFieldByName(fieldName);
308
+ if (!field?.Dirty) {
309
+ return current;
310
+ }
311
+ const old = field.OldValue;
312
+ return typeof old === 'string' && old.length > 0 ? old : undefined;
172
313
  }
173
314
  /**
174
315
  * Enforces both guards on the delete path.
@@ -197,11 +338,47 @@ let MJUserRoleEntityServer = MJUserRoleEntityServer_1 = class MJUserRoleEntitySe
197
338
  return this.refuse('delete', 'You may only revoke a role that you hold yourself. Revoking a role you do not hold would let you ' +
198
339
  'strip authority you were never granted. Ask an Owner to make this change.');
199
340
  }
200
- const rejection = this.systemUserRoleRemovalReason();
201
- if (rejection) {
202
- return this.refuse('delete', rejection);
341
+ // Judged against the STORED pair: a delete removes the row by ID, whatever unsaved edits
342
+ // this object carries.
343
+ let deleted = false;
344
+ try {
345
+ const rejection = await this.systemUserDeleteRejection();
346
+ if (rejection) {
347
+ return this.refuse('delete', rejection);
348
+ }
349
+ deleted = await super.Delete(options);
350
+ return deleted;
351
+ }
352
+ finally {
353
+ this.settleGroupWrite(deleted);
354
+ }
355
+ }
356
+ /**
357
+ * Guard B's transaction-group rule for this write. When it passes, the write's place in the
358
+ * group is reserved in the same step, so a second guarded write in flight at once sees it.
359
+ */
360
+ groupRefusal(concernsSystemUser) {
361
+ this.pendingGroupWrite = null;
362
+ const refusal = GuardedTransactionGroupRefusal(this.TransactionGroup, concernsSystemUser);
363
+ if (!refusal) {
364
+ this.pendingGroupWrite = ReserveGuardedTransactionGroupWrite(this.TransactionGroup, concernsSystemUser);
365
+ }
366
+ return refusal;
367
+ }
368
+ /** Guard B for a delete: the transaction-group rule, then the removal check on stored state. */
369
+ async systemUserDeleteRejection() {
370
+ const priorUserID = this.priorValue('UserID', this.UserID);
371
+ const concernsSystemUser = priorUserID === undefined || IsSystemUserID(priorUserID);
372
+ const groupRefusal = this.groupRefusal(concernsSystemUser);
373
+ if (groupRefusal) {
374
+ return groupRefusal;
375
+ }
376
+ try {
377
+ return await this.storedPairRemovalReason();
378
+ }
379
+ catch (e) {
380
+ return MJUserRoleEntityServer_1.unverifiableMessage(e);
203
381
  }
204
- return super.Delete(options);
205
382
  }
206
383
  /**
207
384
  * Invariants 1 and 2's forward half — the role being assigned must be one the caller holds.
@@ -285,16 +462,20 @@ let MJUserRoleEntityServer = MJUserRoleEntityServer_1 = class MJUserRoleEntitySe
285
462
  return caller.Type?.trim().toLowerCase() === 'owner';
286
463
  }
287
464
  /**
288
- * Why this role may not be taken off this user, or null when it may.
289
- * Only ever rejects for the system user; every other user is unaffected.
465
+ * Why taking `roleID` off `userID` would cost the system user field access, or null when it
466
+ * would not. Only ever rejects for the system user; every other user is unaffected.
467
+ *
468
+ * Parameterized because the delete path and the re-point path both ask about the pair as
469
+ * STORED, which on a re-point is only available from the dirty fields' old values.
290
470
  */
291
- systemUserRoleRemovalReason() {
292
- const systemUser = UserCache.Instance?.GetSystemUser?.();
293
- if (!systemUser || !this.UserID || !this.RoleID || !UUIDsEqual(systemUser.ID, this.UserID)) {
471
+ async systemUserRoleRemovalReason(userID, roleID) {
472
+ if (!roleID || !IsSystemUserID(userID)) {
294
473
  return null; // not the system user — nothing to guard
295
474
  }
475
+ // The role set and the rules as stored now: the caches may not yet show a role assigned or
476
+ // removed, or a rule edited, a moment ago.
296
477
  const provider = this.ProviderToUse;
297
- const lost = FindSystemUserFieldAccessViolations(provider, systemUser, { WithoutRoleID: this.RoleID });
478
+ const lost = await StoredRoleRemovalViolations(this.RunViewProviderToUse, provider, roleID);
298
479
  if (lost.length === 0) {
299
480
  return null;
300
481
  }
@@ -323,6 +504,10 @@ let MJUserRoleEntityServer = MJUserRoleEntityServer_1 = class MJUserRoleEntitySe
323
504
  if (restricted.length === 0) {
324
505
  return null;
325
506
  }
507
+ return MJUserRoleEntityServer_1.assignmentRejectionMessage(restricted);
508
+ }
509
+ /** The refusal for assigning the system user a role that denies a field on the named entities. */
510
+ static assignmentRejectionMessage(restricted) {
326
511
  const shown = restricted.slice(0, 3).join(', ');
327
512
  const more = restricted.length > 3 ? `, and ${restricted.length - 3} more` : '';
328
513
  return (`This role denies access to at least one field (on ${shown}${more}), so it cannot be assigned to the MJ system user. ` +
@@ -332,7 +517,8 @@ let MJUserRoleEntityServer = MJUserRoleEntityServer_1 = class MJUserRoleEntitySe
332
517
  }
333
518
  /**
334
519
  * Names of entities where this role carries at least one RESTRICTING field rule — a `Deny`
335
- * on any verb. Walks cached metadata only — no database access. Runs only when the system
520
+ * on any verb, under any spelling (the column's collation stores `'deny'` too, and enforcement
521
+ * honors it). Walks cached metadata only — no database access. Runs only when the system
336
522
  * user is the save target, which is rare.
337
523
  *
338
524
  * Grants and neutrals are ignored, and must be: the system user holds the standard roles
@@ -354,7 +540,7 @@ let MJUserRoleEntityServer = MJUserRoleEntityServer_1 = class MJUserRoleEntitySe
354
540
  const names = [];
355
541
  for (const entity of md.Entities) {
356
542
  const hit = entity.Fields.some(f => f.HasFieldPermissions &&
357
- f.FieldPermissions.some(fp => UUIDsEqual(fp.RoleID, roleID) && IsRestrictingFieldRule(fp)));
543
+ f.FieldPermissions.some(fp => UUIDsEqual(fp.RoleID, roleID) && IsRestrictingFieldRuleAnyCase(fp)));
358
544
  if (hit) {
359
545
  names.push(entity.Name);
360
546
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MJUserRoleEntityServer.server.js","sourceRoot":"","sources":["../../src/custom/MJUserRoleEntityServer.server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MJUserRoleEntityServer.server.js","sourceRoot":"","sources":["../../src/custom/MJUserRoleEntityServer.server.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"MJUserRoutineEntityServer.server.d.ts","sourceRoot":"","sources":["../../src/custom/MJUserRoutineEntityServer.server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,mBAAmB,EAAE,iBAAiB,EAAqD,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE/J,OAAO,EAAE,mBAAmB,EAAwD,MAAM,+BAA+B,CAAC;AAG1H;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBACa,yBAA0B,SAAQ,mBAAmB;IACxC,IAAI,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IAQzD,QAAQ,IAAI,gBAAgB;IAS5C;;;;;;OAMG;IACmB,MAAM,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ7E,uIAAuI;YACzH,gBAAgB;IAqB9B;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;IA8B9B,4GAA4G;IAC5G,OAAO,CAAC,gBAAgB;IAmCxB,oFAAoF;IACpF,OAAO,CAAC,cAAc;IAWtB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;CAe5B"}
1
+ {"version":3,"file":"MJUserRoutineEntityServer.server.d.ts","sourceRoot":"","sources":["../../src/custom/MJUserRoutineEntityServer.server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,mBAAmB,EAAE,iBAAiB,EAAqD,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE/J,OAAO,EAAE,mBAAmB,EAAwD,MAAM,+BAA+B,CAAC;AAG1H;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBACa,yBAA0B,SAAQ,mBAAmB;IACxC,IAAI,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IAQzD,QAAQ,IAAI,gBAAgB;IAS5C;;;;;;OAMG;IACmB,MAAM,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ7E,uIAAuI;YACzH,gBAAgB;IAqB9B;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;IAqC9B,4GAA4G;IAC5G,OAAO,CAAC,gBAAgB;IAmCxB,oFAAoF;IACpF,OAAO,CAAC,cAAc;IAWtB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;CAe5B"}
@@ -91,7 +91,14 @@ let MJUserRoutineEntityServer = class MJUserRoutineEntityServer extends MJUserRo
91
91
  // client's untouched null, so a null-dirty NextRunAt must not suppress the
92
92
  // initial computation (it previously left new UI-created routines unscheduled
93
93
  // until the dispatcher's seeding sweep).
94
- const explicitlySet = this.GetFieldByName('NextRunAt')?.Dirty === true && this.NextRunAt != null;
94
+ //
95
+ // On an unsaved record a non-null NextRunAt is always the caller's explicit time. Field Dirty
96
+ // cannot tell us so there: after NewRecord() a field's first write also becomes its OldValue,
97
+ // so a one-shot built with a default cron that is then cleared reads as "schedule changed,
98
+ // NextRunAt not dirty" and would be recomputed to null (no cron, no StartAt), after which the
99
+ // dispatcher's post-run roll-up disables it.
100
+ const explicitlySet = this.NextRunAt != null
101
+ && (!this.IsSaved || this.GetFieldByName('NextRunAt')?.Dirty === true);
95
102
  if (explicitlySet) {
96
103
  return;
97
104
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MJUserRoutineEntityServer.server.js","sourceRoot":"","sources":["../../src/custom/MJUserRoutineEntityServer.server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MJUserRoutineEntityServer.server.js","sourceRoot":"","sources":["../../src/custom/MJUserRoutineEntityServer.server.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAA0C,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAoB,MAAM,sBAAsB,CAAC;AAC/J,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAwD,MAAM,+BAA+B,CAAC;AAC1H,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAElG;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEI,IAAM,yBAAyB,GAA/B,MAAM,yBAA0B,SAAQ,mBAAmB;IAC9C,KAAK,CAAC,IAAI,CAAC,OAA2B;QAClD,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC3D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC7C,CAAC;QACD,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAEe,QAAQ;QACpB,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;QAChC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC9B,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC5B,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC/B,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;QAC9D,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;;;OAMG;IACa,KAAK,CAAC,MAAM,CAAC,OAA6B;QACtD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC3C,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,uIAAuI;IAC/H,KAAK,CAAC,gBAAgB;QAC1B,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAClD,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,QAAQ,CACxC;YACI,EAAE,UAAU,EAAE,6BAA6B,EAAE,WAAW,EAAE,cAAc,IAAI,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,eAAe,EAAE;YACjH,EAAE,UAAU,EAAE,uBAAuB,EAAE,WAAW,EAAE,cAAc,IAAI,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,eAAe,EAAE;SAC9G,EACD,IAAI,CAAC,kBAAkB,CAC1B,CAAC;QACF,MAAM,IAAI,GAAiB;YACvB,GAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAoC;YACrF,GAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAA8B;SACtE,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;gBACxB,OAAO,KAAK,CAAC;YACjB,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACK,sBAAsB;QAC1B,+EAA+E;QAC/E,iFAAiF;QACjF,2EAA2E;QAC3E,2EAA2E;QAC3E,8EAA8E;QAC9E,yCAAyC;QACzC,EAAE;QACF,8FAA8F;QAC9F,8FAA8F;QAC9F,2FAA2F;QAC3F,8FAA8F;QAC9F,6CAA6C;QAC7C,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI;eACrC,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC;QAC3E,IAAI,aAAa,EAAE,CAAC;YAChB,OAAO;QACX,CAAC;QACD,MAAM,eAAe,GAAG,CAAC,gBAAgB,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,CAAC;aAC5E,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC;QACvE,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAC7C,OAAO;QACX,CAAC;QACD,IAAI,CAAC;YACD,IAAI,CAAC,SAAS,GAAG,uBAAuB,CACpC,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,QAAQ,EACb,IAAI,IAAI,EAAE,EACV,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,YAAY,IAAI,WAAW,CACnC,CAAC;QACN,CAAC;QAAC,MAAM,CAAC;YACL,4EAA4E;YAC5E,wDAAwD;QAC5D,CAAC;IACL,CAAC;IAED,4GAA4G;IACpG,gBAAgB,CAAC,MAAwB;QAC7C,MAAM,IAAI,GAAwC,IAAI,CAAC,YAAY,IAAI,WAAW,CAAC;QACnF,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,IAAI,IAAI,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;QAErF,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,WAAW,KAAK,WAAW,CAAC,EAAE,CAAC;gBAClF,OAAO;YACX,CAAC;YACD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,CACtC,gBAAgB,EAChB,oDAAoD,IAAI,IAAI,EAC5D,IAAI,CAAC,cAAc,EACnB,mBAAmB,CAAC,OAAO,CAC9B,CAAC,CAAC;YACH,OAAO;QACX,CAAC;QAED,MAAM,UAAU,GAAG,oBAAoB,CAAC,kBAAkB,CAAC,IAAI,CAAC,cAAe,CAAC,CAAC;QACjF,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YACtB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;YACzC,OAAO;QACX,CAAC;QACD,IAAI,CAAC;YACD,uBAAuB,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAChG,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,CACtC,gBAAgB,EAChB,uDAAuD,IAAI,CAAC,cAAc,oBAAoB,IAAI,CAAC,QAAQ,KAAK;gBAChH,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAC3D,IAAI,CAAC,cAAc,EACnB,mBAAmB,CAAC,OAAO,CAC9B,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,oFAAoF;IAC5E,cAAc,CAAC,MAAwB;QAC3C,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,CACtC,UAAU,EACV,qDAAqD,IAAI,CAAC,UAAU,sBAAsB,IAAI,CAAC,UAAU,UAAU,EACnH,IAAI,CAAC,QAAQ,EACb,mBAAmB,CAAC,OAAO,CAC9B,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED;;;;OAIG;IACK,iBAAiB,CAAC,MAAwB;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC;QACrC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE,CAAC;YACvD,OAAO;QACX,CAAC;QACD,MAAM,cAAc,GAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,QAAsC,IAAI,IAAI,CAAC,MAAM,CAAC;QAC7G,IAAI,cAAc,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,CACtC,QAAQ,EACR,6EAA6E,EAC7E,IAAI,CAAC,MAAM,EACX,mBAAmB,CAAC,OAAO,CAC9B,CAAC,CAAC;QACP,CAAC;IACL,CAAC;CACJ,CAAA;AArKY,yBAAyB;IADrC,aAAa,CAAC,UAAU,EAAE,mBAAmB,CAAC;GAClC,yBAAyB,CAqKrC"}
@@ -1,4 +1,4 @@
1
- import { EntityInfo, IMetadataProvider, ValidationResult } from "@memberjunction/core";
1
+ import { EntityInfo, EntitySaveOptions, IMetadataProvider, ValidationResult } from "@memberjunction/core";
2
2
  import { MJUserViewEntityExtended } from '@memberjunction/core-entities';
3
3
  /**
4
4
  * Template data passed to the Smart Filter Generation Nunjucks prompt.
@@ -12,13 +12,29 @@ interface SmartFilterTemplateData extends Record<string, unknown> {
12
12
  listsSchema: string;
13
13
  listsFields: string;
14
14
  listDetailsFields: string;
15
+ alternateBaseViewName?: string;
16
+ alternateBaseViewDescription?: string;
15
17
  }
16
18
  export declare class MJUserViewEntityServer extends MJUserViewEntityExtended {
17
19
  /**
18
20
  * This property is hard-coded to true in this class because we DO support smart filters in this class. If you want to disable smart filters for a specific view you can override this property in your subclass and set it to false.
19
21
  */
20
22
  protected get SmartFilterImplemented(): boolean;
23
+ /**
24
+ * Applies the approval rules (see `ApplyApprovalRulesAsync`). The base save regenerates the
25
+ * WhereClause before it writes, so an approving save stamps the fingerprint after the write,
26
+ * from the definition as stored, with one more write.
27
+ */
28
+ Save(options?: EntitySaveOptions): Promise<boolean>;
21
29
  Validate(): ValidationResult;
30
+ /**
31
+ * Validates that a pinned `DisplayState.alternateBaseView` (if newly set or changed)
32
+ * corresponds to a registered, usable alternate base view on the view's target entity.
33
+ * Existing saved views whose pinned alternate base view did not change are allowed to save
34
+ * other edits (e.g. renaming or clearing the pin after an admin disabled the alternate view).
35
+ */
36
+ private validatePinnedAlternateBaseView;
37
+ private hasAlternateBaseViewChanged;
22
38
  /**
23
39
  * SECURITY: screens the SQL this view stores with the clause screen the RunView API applies to
24
40
  * client filters — its WhereClause (set directly, compiled from FilterState, or made by a Smart
@@ -1 +1 @@
1
- {"version":3,"file":"MJUserViewEntityServer.server.d.ts","sourceRoot":"","sources":["../../src/custom/MJUserViewEntityServer.server.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,UAAU,EAAY,iBAAiB,EAAsD,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACjK,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AAexE;;GAEG;AACH,UAAU,uBAAwB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,uBAAuB,EAAE,MAAM,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;CAC7B;AAED,qBACa,sBAAuB,SAAQ,wBAAwB;IAChE;;OAEG;IACH,cAAuB,sBAAsB,IAAI,OAAO,CAEvD;IAEe,QAAQ,IAAI,gBAAgB;IAQ5C;;;;;;;;OAQG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;;OAGG;IACH,OAAO,CAAC,aAAa;IAQrB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAoB1B;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAItC;;;;;;;;OAQG;IACH,OAAO,CAAC,sCAAsC;IAyB9C;;;;OAIG;IACU,8BAA8B,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAC,CAAC;IAkF5I;;;OAGG;IACH,SAAS,CAAC,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,uBAAuB;IAwC5E;;OAEG;IACH,SAAS,CAAC,4BAA4B,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,MAAM;CAoC1H"}
1
+ {"version":3,"file":"MJUserViewEntityServer.server.d.ts","sourceRoot":"","sources":["../../src/custom/MJUserViewEntityServer.server.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,UAAU,EAAE,iBAAiB,EAAsD,iBAAiB,EAAsD,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC9N,OAAO,EAAmC,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AAgBzG;;GAEG;AACH,UAAU,uBAAwB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,uBAAuB,EAAE,MAAM,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,4BAA4B,CAAC,EAAE,MAAM,CAAC;CACzC;AAED,qBACa,sBAAuB,SAAQ,wBAAwB;IAChE;;OAEG;IACH,cAAuB,sBAAsB,IAAI,OAAO,CAEvD;IAED;;;;OAIG;IACmB,IAAI,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IAwBzD,QAAQ,IAAI,gBAAgB;IAS5C;;;;;OAKG;IACH,OAAO,CAAC,+BAA+B;IAmCvC,OAAO,CAAC,2BAA2B;IAWnC;;;;;;;;OAQG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;;OAGG;IACH,OAAO,CAAC,aAAa;IAQrB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAoB1B;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAItC;;;;;;;;OAQG;IACH,OAAO,CAAC,sCAAsC;IAyB9C;;;;OAIG;IACU,8BAA8B,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAC,CAAC;IAwF5I;;;OAGG;IACH,SAAS,CAAC,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,uBAAuB;IA2D5E;;OAEG;IACH,SAAS,CAAC,4BAA4B,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,MAAM;CAoC1H"}
@@ -6,11 +6,12 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
6
6
  };
7
7
  var MJUserViewEntityServer_1;
8
8
  import { RegisterClass, CleanAndParseJSON } from "@memberjunction/global";
9
- import { BaseEntity, LogError, ValidationErrorInfo, ValidationErrorType } from "@memberjunction/core";
10
- import { MJUserViewEntityExtended } from '@memberjunction/core-entities';
9
+ import { BaseEntity, ExtractAlternateBaseViewFromDisplayState, LogError, ValidationErrorInfo, ValidationErrorType } from "@memberjunction/core";
10
+ import { ComputeUserViewFingerprintAsync, MJUserViewEntityExtended } from '@memberjunction/core-entities';
11
11
  import { AIPromptParams } from "@memberjunction/ai-core-plus";
12
12
  import { AIEngine } from "@memberjunction/aiengine";
13
13
  import { AIPromptRunner } from "@memberjunction/ai-prompts";
14
+ import { ApplyApprovalRulesAsync, ApprovalRefusalResult } from "./approvalStamp.js";
14
15
  import { IsClientClauseScreeningProvider } from "@memberjunction/generic-database-provider";
15
16
  let MJUserViewEntityServer = MJUserViewEntityServer_1 = class MJUserViewEntityServer extends MJUserViewEntityExtended {
16
17
  /**
@@ -19,13 +20,77 @@ let MJUserViewEntityServer = MJUserViewEntityServer_1 = class MJUserViewEntitySe
19
20
  get SmartFilterImplemented() {
20
21
  return true;
21
22
  }
23
+ /**
24
+ * Applies the approval rules (see `ApplyApprovalRulesAsync`). The base save regenerates the
25
+ * WhereClause before it writes, so an approving save stamps the fingerprint after the write,
26
+ * from the definition as stored, with one more write.
27
+ */
28
+ async Save(options) {
29
+ let approving;
30
+ try {
31
+ approving = !options?.ReplayOnly && await ApplyApprovalRulesAsync(this, 'ApprovalStatus', this.ApprovalStatus);
32
+ }
33
+ catch (e) {
34
+ this.RegisterResultHistoryEntry(ApprovalRefusalResult(this, e));
35
+ return false;
36
+ }
37
+ if (!await super.Save(options)) {
38
+ return false;
39
+ }
40
+ if (approving) {
41
+ try {
42
+ this.ApprovedFingerprint = await ComputeUserViewFingerprintAsync(this);
43
+ if (!await super.Save(options)) {
44
+ LogError(`[MJUserViewEntityServer] View "${this.Name}" was approved but its fingerprint was not saved: ${this.LatestResult?.CompleteMessage}`);
45
+ }
46
+ }
47
+ catch (e) {
48
+ LogError(`[MJUserViewEntityServer] View "${this.Name}" was approved but its fingerprint could not be computed: ${e instanceof Error ? e.message : String(e)}`);
49
+ }
50
+ }
51
+ return true;
52
+ }
22
53
  Validate() {
23
54
  const result = super.Validate();
24
55
  this.validateCustomWhereClauseAuthorization(result);
56
+ this.validatePinnedAlternateBaseView(result);
25
57
  this.validateStoredClauses(result);
26
58
  result.Success = result.Success && result.Errors.length === 0;
27
59
  return result;
28
60
  }
61
+ /**
62
+ * Validates that a pinned `DisplayState.alternateBaseView` (if newly set or changed)
63
+ * corresponds to a registered, usable alternate base view on the view's target entity.
64
+ * Existing saved views whose pinned alternate base view did not change are allowed to save
65
+ * other edits (e.g. renaming or clearing the pin after an admin disabled the alternate view).
66
+ */
67
+ validatePinnedAlternateBaseView(result) {
68
+ const pinnedName = this.AlternateBaseView;
69
+ if (!pinnedName || !this.ViewEntityInfo) {
70
+ return;
71
+ }
72
+ const smartPromptModified = Boolean(this.SmartFilterEnabled &&
73
+ (this.GetFieldByName('SmartFilterPrompt')?.Dirty === true ||
74
+ this.GetFieldByName('SmartFilterEnabled')?.Dirty === true));
75
+ if (this.IsSaved && !this.hasAlternateBaseViewChanged() && !smartPromptModified) {
76
+ return;
77
+ }
78
+ const abv = this.ViewEntityInfo.GetAlternateBaseView(pinnedName);
79
+ if (!abv) {
80
+ result.Errors.push(new ValidationErrorInfo('DisplayState', `Alternate Base View '${pinnedName}' is not registered on entity '${this.ViewEntityInfo.Name}'.`, pinnedName, ValidationErrorType.Failure));
81
+ }
82
+ else if (!abv.IsUsable) {
83
+ result.Errors.push(new ValidationErrorInfo('DisplayState', `Alternate Base View '${pinnedName}' on entity '${this.ViewEntityInfo.Name}' has status '${abv.Status}' and cannot be used.`, pinnedName, ValidationErrorType.Failure));
84
+ }
85
+ }
86
+ hasAlternateBaseViewChanged() {
87
+ const displayStateField = this.GetFieldByName('DisplayState');
88
+ if (!displayStateField?.Dirty) {
89
+ return false;
90
+ }
91
+ const oldPinned = ExtractAlternateBaseViewFromDisplayState(typeof displayStateField.OldValue === 'string' ? displayStateField.OldValue : null);
92
+ return (oldPinned ?? null) !== (this.AlternateBaseView ?? null);
93
+ }
29
94
  /**
30
95
  * SECURITY: screens the SQL this view stores with the clause screen the RunView API applies to
31
96
  * client filters — its WhereClause (set directly, compiled from FilterState, or made by a Smart
@@ -126,6 +191,12 @@ let MJUserViewEntityServer = MJUserViewEntityServer_1 = class MJUserViewEntitySe
126
191
  */
127
192
  async GenerateSmartFilterWhereClause(prompt, entityInfo) {
128
193
  try {
194
+ if (this.AlternateBaseView && entityInfo) {
195
+ const pinnedAbv = entityInfo.GetAlternateBaseView(this.AlternateBaseView);
196
+ if (!pinnedAbv || !pinnedAbv.IsUsable) {
197
+ return { whereClause: '', userExplanation: '' };
198
+ }
199
+ }
129
200
  // Ensure AIEngine is configured
130
201
  await AIEngine.Instance.Config(false, this.ContextCurrentUser);
131
202
  // Find the Smart Filter Generation prompt
@@ -199,18 +270,30 @@ let MJUserViewEntityServer = MJUserViewEntityServer_1 = class MJUserViewEntitySe
199
270
  * This data is used to populate the Nunjucks template variables.
200
271
  */
201
272
  BuildTemplateData(entityInfo) {
273
+ const pinnedAbv = this.AlternateBaseView
274
+ ? entityInfo.GetAlternateBaseView(this.AlternateBaseView)
275
+ : undefined;
276
+ const effectiveBaseView = pinnedAbv && pinnedAbv.IsUsable ? pinnedAbv.ViewName : entityInfo.BaseView;
202
277
  const processedViews = [entityInfo.BaseView];
278
+ if (effectiveBaseView !== entityInfo.BaseView) {
279
+ processedViews.push(effectiveBaseView);
280
+ }
203
281
  const md = this.ProviderToUse;
204
282
  const listsEntity = md.EntityByName("MJ: Lists");
205
283
  const listDetailsEntity = md.EntityByName("MJ: List Details");
206
284
  // Build fields description
207
- const fieldsDescription = entityInfo.Fields.map(f => {
285
+ let fieldsDescription = entityInfo.Fields.map(f => {
208
286
  let ret = `${f.Name} (${f.Type})`;
209
287
  if (f.RelatedEntity) {
210
288
  ret += ` (fkey to ${f.RelatedEntityBaseView})`;
211
289
  }
212
290
  return ret;
213
291
  }).join(',');
292
+ if (pinnedAbv && pinnedAbv.IsUsable) {
293
+ fieldsDescription +=
294
+ `\n[Base View Context: Reading from alternate base view '${pinnedAbv.EffectiveDisplayName}' (${pinnedAbv.ViewName}): ${pinnedAbv.Description}. ` +
295
+ `Do NOT duplicate conditions already enforced by this base view unless the user explicitly asks to refine them.]`;
296
+ }
214
297
  // Build related views description
215
298
  const relatedViewsDescription = this.BuildRelatedViewsDescription(entityInfo, md, processedViews);
216
299
  // Build lists fields
@@ -221,16 +304,21 @@ let MJUserViewEntityServer = MJUserViewEntityServer_1 = class MJUserViewEntitySe
221
304
  const listDetailsFields = listDetailsEntity ? listDetailsEntity.Fields.map(f => {
222
305
  return f.Name + ' (' + f.SQLFullType + ')';
223
306
  }).join(', ') : '';
224
- return {
307
+ const templateData = {
225
308
  entityName: entityInfo.Name,
226
309
  entityId: entityInfo.ID,
227
- baseView: entityInfo.BaseView,
310
+ baseView: effectiveBaseView,
228
311
  fieldsDescription,
229
- relatedViewsDescription: processedViews.length > 1 ? relatedViewsDescription : '',
312
+ relatedViewsDescription: relatedViewsDescription.length > 0 ? relatedViewsDescription : '',
230
313
  listsSchema: listsEntity?.SchemaName || '__mj',
231
314
  listsFields,
232
- listDetailsFields
315
+ listDetailsFields,
233
316
  };
317
+ if (pinnedAbv && pinnedAbv.IsUsable) {
318
+ templateData.alternateBaseViewName = pinnedAbv.Name;
319
+ templateData.alternateBaseViewDescription = pinnedAbv.Description;
320
+ }
321
+ return templateData;
234
322
  }
235
323
  /**
236
324
  * Builds the description of related views for the prompt template.