@memberjunction/server 5.29.0 → 5.30.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.
@@ -1 +1 @@
1
- {"version":3,"file":"SyncDataResolver.d.ts","sourceRoot":"","sources":["../../src/resolvers/SyncDataResolver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SyncDataResolver.d.ts","sourceRoot":"","sources":["../../src/resolvers/SyncDataResolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,YAAY,EAA0E,QAAQ,EAAW,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErK,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAKlG;;;;GAIG;AACH,oBAAY,kBAAkB;IAC1B,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,cAAc,mBAAmB;IACjC,MAAM,WAAW;IACjB,gBAAgB,qBAAqB;CACtC;AAQD,qBACa,mBAAmB;IAE5B,UAAU,EAAG,MAAM,CAAC;IAGpB,UAAU,CAAC,EAAE,qBAAqB,CAAC;IAGnC,YAAY,CAAC,EAAE,qBAAqB,CAAC;IAGrC,IAAI,EAAG,kBAAkB,CAAC;IAE1B;;OAEG;IAEH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IAEH,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAGH,qBACa,oBAAoB;IAE7B,OAAO,EAAE,OAAO,CAAC;IAGjB,YAAY,EAAE,MAAM,CAAC;IAGrB,UAAU,EAAG,MAAM,CAAC;IAGpB,UAAU,CAAC,EAAE,sBAAsB,CAAC;IAGpC,YAAY,CAAC,EAAE,sBAAsB,CAAC;IAGtC,IAAI,EAAG,kBAAkB,CAAC;IAE1B;;OAEG;IAEH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IAEH,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBACa,kBAAkB;IAE7B,OAAO,EAAE,OAAO,CAAC;IAGjB,OAAO,EAAE,oBAAoB,EAAE,CAAM;CACtC;AAKD,qBAAa,gBAAgB;IACzB;;;OAGG;IAGG,QAAQ,CAC8B,KAAK,EAAE,mBAAmB,EAAE,EACjE,OAAO,EAAE,UAAU;;;;cAuBV,gCAAgC,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,GAAE,OAAe,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;cAkBlG,yBAAyB,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;cAWzF,cAAc,CAAC,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC;cAmDrI,8BAA8B,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW;cA2CzI,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC;cA6BzG,4BAA4B,CAAC,YAAY,EAAE,UAAU,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,oBAAoB,EAAE,WAAW,EAAE,WAAW;cAuBnK,oBAAoB,CAAC,YAAY,EAAE,UAAU,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,oBAAoB,EAAE,WAAW,EAAE,WAAW;cA8CzI,oBAAoB,CAAC,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,oBAAoB,EAAE,WAAW,EAAE,WAAW;cAyBvH,oBAAoB,CAAC,YAAY,EAAE,UAAU,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,oBAAoB,EAAE,WAAW,EAAE,WAAW;cAqB3J,yBAAyB,CAAC,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,oBAAoB,EAAE,WAAW,EAAE,WAAW;CAqB/I"}
@@ -220,30 +220,38 @@ export class SyncDataResolver {
220
220
  }
221
221
  async SyncSingleItemDeleteWithFilter(entityName, filter, result, user, userPayload) {
222
222
  try {
223
- // here we will iterate through the result of a RunView on the entityname/filter and delete each matching record
224
- let overallSuccess = true;
225
- let combinedErrorMessage = "";
223
+ // Run the view to find matching records, then delete them all atomically
224
+ // any single failure rolls back the entire batch so the dataset stays consistent.
226
225
  const rv = new RunView();
227
226
  const data = await rv.RunView({
228
227
  EntityName: entityName,
229
228
  ExtraFilter: filter,
230
229
  ResultType: 'entity_object'
231
230
  }, user);
232
- if (data && data.Success) {
231
+ if (!data || !data.Success) {
232
+ result.Success = false;
233
+ result.ErrorMessage = 'Failed to run the view to get the list of items to delete for entity: ' + entityName + ' with filter: ' + filter + '\n';
234
+ return;
235
+ }
236
+ if (data.Results.length === 0) {
237
+ result.Success = true;
238
+ return;
239
+ }
240
+ const provider = Metadata.Provider;
241
+ await provider.BeginTransaction();
242
+ try {
233
243
  for (const entityObject of data.Results) {
234
244
  if (!await entityObject.Delete()) {
235
- overallSuccess = false;
236
- combinedErrorMessage += 'Failed to delete the item :' + entityObject.LatestResult.CompleteMessage + '\n';
245
+ throw new Error('Failed to delete the item: ' + entityObject.LatestResult.CompleteMessage);
237
246
  }
238
247
  }
239
- result.Success = overallSuccess;
240
- if (!overallSuccess) {
241
- result.ErrorMessage = combinedErrorMessage;
242
- }
248
+ await provider.CommitTransaction();
249
+ result.Success = true;
243
250
  }
244
- else {
251
+ catch (txErr) {
252
+ await provider.RollbackTransaction();
245
253
  result.Success = false;
246
- result.ErrorMessage = 'Failed to run the view to get the list of items to delete for entity: ' + entityName + ' with filter: ' + filter + '\n';
254
+ result.ErrorMessage = typeof txErr === 'string' ? txErr : txErr.message;
247
255
  }
248
256
  }
249
257
  catch (e) {
@@ -1 +1 @@
1
- {"version":3,"file":"SyncDataResolver.js","sourceRoot":"","sources":["../../src/resolvers/SyncDataResolver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SyncDataResolver.js","sourceRoot":"","sources":["../../src/resolvers/SyncDataResolver.ts"],"names":[],"mappings":"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"}
@@ -39,22 +39,33 @@ export declare class SyncRolesAndUsersResolver {
39
39
  * @param data
40
40
  */
41
41
  SyncRoles(roles: RoleInputType[], context: AppContext): Promise<SyncRolesAndUsersResultType>;
42
- protected UpdateExistingRoles(currentRoles: MJRoleEntity[], futureRoles: RoleInputType[], userPayload: UserPayload): Promise<SyncRolesAndUsersResultType>;
43
- protected AddNewRoles(currentRoles: MJRoleEntity[], futureRoles: RoleInputType[], user: UserInfo, userPayload: UserPayload): Promise<boolean>;
44
- protected DeleteRemovedRoles(currentRoles: MJRoleEntity[], futureRoles: RoleInputType[], user: UserInfo, userPayload: UserPayload): Promise<boolean>;
42
+ /**
43
+ * Transaction-free core of SyncRoles expected to be invoked inside an outer transaction.
44
+ * Throws on any Save/Delete failure so the outer transaction rolls back. A returned
45
+ * `{ Success: true }` means every operation succeeded.
46
+ */
47
+ protected DoSyncRoles(roles: RoleInputType[], user: UserInfo, userPayload: UserPayload): Promise<SyncRolesAndUsersResultType>;
48
+ protected UpdateExistingRoles(currentRoles: MJRoleEntity[], futureRoles: RoleInputType[], userPayload: UserPayload): Promise<void>;
49
+ protected AddNewRoles(currentRoles: MJRoleEntity[], futureRoles: RoleInputType[], user: UserInfo, userPayload: UserPayload): Promise<void>;
50
+ protected DeleteRemovedRoles(currentRoles: MJRoleEntity[], futureRoles: RoleInputType[], user: UserInfo, userPayload: UserPayload): Promise<void>;
45
51
  get StandardRoles(): string[];
46
52
  IsStandardRole(roleName: string): boolean;
47
- protected DeleteSingleRole(role: MJRoleEntity, rv: RunView, user: UserInfo, userPayload: UserPayload): Promise<boolean>;
53
+ protected DeleteSingleRole(role: MJRoleEntity, rv: RunView, user: UserInfo, userPayload: UserPayload): Promise<void>;
48
54
  /**
49
55
  * This mutation will sync the just the users in the system with the data provided in the input, matches existing users by email
50
56
  * @important This method will NOT work if the roles are not already in sync, meaning if User/Role relationships exist in the input data where the Role doesn't already exist in this system the sync will fail
51
57
  * @param data
52
58
  */
53
59
  SyncUsers(users: UserInputType[], context: AppContext): Promise<SyncRolesAndUsersResultType>;
54
- protected UpdateExistingUsers(currentUsers: MJUserEntity[], futureUsers: UserInputType[], userPayload: UserPayload): Promise<boolean>;
55
- protected AddNewUsers(currentUsers: MJUserEntity[], futureUsers: UserInputType[], userPayload: UserPayload): Promise<boolean>;
56
- protected DeleteRemovedUsers(currentUsers: MJUserEntity[], futureUsers: UserInputType[], u: UserInfo, userPayload: UserPayload): Promise<boolean>;
57
- protected DeleteSingleUser(user: MJUserEntity, rv: RunView, u: UserInfo, userPayload: UserPayload): Promise<boolean>;
58
- protected SyncUserRoles(users: UserInputType[], u: UserInfo, userPayload: UserPayload): Promise<boolean>;
60
+ /**
61
+ * Transaction-free core of SyncUsers expected to be invoked inside an outer transaction.
62
+ * Throws on any Save/Delete failure so the outer transaction rolls back.
63
+ */
64
+ protected DoSyncUsers(users: UserInputType[], user: UserInfo, userPayload: UserPayload): Promise<SyncRolesAndUsersResultType>;
65
+ protected UpdateExistingUsers(currentUsers: MJUserEntity[], futureUsers: UserInputType[], userPayload: UserPayload): Promise<void>;
66
+ protected AddNewUsers(currentUsers: MJUserEntity[], futureUsers: UserInputType[], userPayload: UserPayload): Promise<void>;
67
+ protected DeleteRemovedUsers(currentUsers: MJUserEntity[], futureUsers: UserInputType[], u: UserInfo, userPayload: UserPayload): Promise<void>;
68
+ protected DeleteSingleUser(user: MJUserEntity, rv: RunView, u: UserInfo, userPayload: UserPayload): Promise<void>;
69
+ protected SyncUserRoles(users: UserInputType[], u: UserInfo, userPayload: UserPayload): Promise<void>;
59
70
  }
60
71
  //# sourceMappingURL=SyncRolesUsersResolver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SyncRolesUsersResolver.d.ts","sourceRoot":"","sources":["../../src/resolvers/SyncRolesUsersResolver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SyncRolesUsersResolver.d.ts","sourceRoot":"","sources":["../../src/resolvers/SyncRolesUsersResolver.ts"],"names":[],"mappings":"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"}
@@ -111,22 +111,32 @@ export class SyncRolesAndUsersResolver {
111
111
  * @param data
112
112
  */
113
113
  async SyncRolesAndUsers(data, context) {
114
+ // Wrap roles + users in one DB transaction so a user-sync failure
115
+ // rolls back any role changes made earlier in this call. Prior code
116
+ // attempted this with a TransactionGroup but ran into nesting issues —
117
+ // direct DB transactions per the plan doc avoid that.
114
118
  try {
115
- // first we sync the roles, then the users
116
- const roleResult = await this.SyncRoles(data.Roles, context);
117
- if (roleResult?.Success) {
118
- const usersResult = await this.SyncUsers(data.Users, context);
119
- if (usersResult?.Success) {
120
- // refresh the user cache, don't set an auto-refresh
121
- // interval here becuase that is alreayd done at startup
122
- // and will keep going on its own as per the config. This is a
123
- // special one-time refresh since we made changes here.
124
- await UserCache.Instance.Refresh(context.dataSource);
119
+ const provider = Metadata.Provider;
120
+ await provider.BeginTransaction();
121
+ try {
122
+ const roleResult = await this.DoSyncRoles(data.Roles, context.userPayload.userRecord, context.userPayload);
123
+ if (!roleResult.Success) {
124
+ await provider.RollbackTransaction();
125
+ return roleResult;
125
126
  }
127
+ const usersResult = await this.DoSyncUsers(data.Users, context.userPayload.userRecord, context.userPayload);
128
+ if (!usersResult.Success) {
129
+ await provider.RollbackTransaction();
130
+ return usersResult;
131
+ }
132
+ await provider.CommitTransaction();
133
+ // refresh the user cache — one-time, since the normal auto-refresh is already scheduled
134
+ await UserCache.Instance.Refresh(context.dataSource);
126
135
  return usersResult;
127
136
  }
128
- else {
129
- return roleResult;
137
+ catch (txErr) {
138
+ await provider.RollbackTransaction();
139
+ throw txErr;
130
140
  }
131
141
  }
132
142
  catch (err) {
@@ -139,68 +149,87 @@ export class SyncRolesAndUsersResolver {
139
149
  * @param data
140
150
  */
141
151
  async SyncRoles(roles, context) {
152
+ // Wrap delete + add + update of roles in one DB transaction so any failure
153
+ // rolls back the whole batch. Keeps the sync idempotent across retries.
142
154
  try {
143
- // we iterate through the provided roles and we remove roles that are not in the input and add roles that are new
144
- // and update roles that already exist
145
- const rv = new RunView();
146
- const result = await rv.RunView({
147
- EntityName: "MJ: Roles",
148
- ResultType: 'entity_object'
149
- }, context.userPayload.userRecord);
150
- if (result && result.Success) {
151
- const currentRoles = result.Results;
152
- if (await this.DeleteRemovedRoles(currentRoles, roles, context.userPayload.userRecord, context.userPayload)) {
153
- if (await this.AddNewRoles(currentRoles, roles, context.userPayload.userRecord, context.userPayload)) {
154
- return await this.UpdateExistingRoles(currentRoles, roles, context.userPayload);
155
- }
155
+ const provider = Metadata.Provider;
156
+ await provider.BeginTransaction();
157
+ try {
158
+ const result = await this.DoSyncRoles(roles, context.userPayload.userRecord, context.userPayload);
159
+ if (result.Success) {
160
+ await provider.CommitTransaction();
156
161
  }
162
+ else {
163
+ await provider.RollbackTransaction();
164
+ }
165
+ return result;
166
+ }
167
+ catch (txErr) {
168
+ await provider.RollbackTransaction();
169
+ throw txErr;
157
170
  }
158
- return { Success: false }; // if we get here, something went wrong
159
171
  }
160
172
  catch (err) {
161
173
  LogError(err);
162
174
  throw new Error('Error syncing roles and users\n\n' + err);
163
175
  }
164
176
  }
177
+ /**
178
+ * Transaction-free core of SyncRoles — expected to be invoked inside an outer transaction.
179
+ * Throws on any Save/Delete failure so the outer transaction rolls back. A returned
180
+ * `{ Success: true }` means every operation succeeded.
181
+ */
182
+ async DoSyncRoles(roles, user, userPayload) {
183
+ const rv = new RunView();
184
+ const result = await rv.RunView({
185
+ EntityName: "MJ: Roles",
186
+ ResultType: 'entity_object'
187
+ }, user);
188
+ if (!result || !result.Success) {
189
+ return { Success: false };
190
+ }
191
+ const currentRoles = result.Results;
192
+ await this.DeleteRemovedRoles(currentRoles, roles, user, userPayload);
193
+ await this.AddNewRoles(currentRoles, roles, user, userPayload);
194
+ await this.UpdateExistingRoles(currentRoles, roles, userPayload);
195
+ return { Success: true };
196
+ }
165
197
  async UpdateExistingRoles(currentRoles, futureRoles, userPayload) {
166
198
  // go through the future roles and update any that are in the current roles
167
- const md = new Metadata();
168
- let ok = true;
169
199
  for (const update of futureRoles) {
170
200
  const currentRole = currentRoles.find(r => r.Name.trim().toLowerCase() === update.Name.trim().toLowerCase());
171
201
  if (currentRole) {
172
202
  currentRole.Description = update.Description;
173
- ok = ok && await currentRole.Save();
203
+ if (!await currentRole.Save()) {
204
+ throw new Error(`Failed to update role '${currentRole.Name}': ${currentRole.LatestResult?.CompleteMessage ?? 'unknown error'}`);
205
+ }
174
206
  }
175
207
  }
176
- return { Success: ok };
177
208
  }
178
209
  async AddNewRoles(currentRoles, futureRoles, user, userPayload) {
179
210
  // go through the future roles and add any that are not in the current roles
180
211
  const md = new Metadata();
181
- let ok = true;
182
212
  for (const add of futureRoles) {
183
213
  if (!currentRoles.find(r => r.Name.trim().toLowerCase() === add.Name.trim().toLowerCase())) {
184
214
  const role = await md.GetEntityObject("MJ: Roles", user);
185
215
  role.Name = add.Name;
186
216
  role.Description = add.Description;
187
- ok = ok && await role.Save();
217
+ if (!await role.Save()) {
218
+ throw new Error(`Failed to create role '${add.Name}': ${role.LatestResult?.CompleteMessage ?? 'unknown error'}`);
219
+ }
188
220
  }
189
221
  }
190
- return ok;
191
222
  }
192
223
  async DeleteRemovedRoles(currentRoles, futureRoles, user, userPayload) {
193
224
  const rv = new RunView();
194
- let ok = true;
195
225
  // iterate through the existing roles and remove any that are not in the input
196
226
  for (const remove of currentRoles) {
197
227
  if (!this.IsStandardRole(remove.Name)) {
198
228
  if (!futureRoles.find(r => r.Name.trim().toLowerCase() === remove.Name.trim().toLowerCase())) {
199
- ok = ok && await this.DeleteSingleRole(remove, rv, user, userPayload);
229
+ await this.DeleteSingleRole(remove, rv, user, userPayload);
200
230
  }
201
231
  }
202
232
  }
203
- return ok;
204
233
  }
205
234
  get StandardRoles() {
206
235
  return ['Developer', 'Integration', 'UI'];
@@ -210,7 +239,6 @@ export class SyncRolesAndUsersResolver {
210
239
  }
211
240
  async DeleteSingleRole(role, rv, user, userPayload) {
212
241
  // first, remove all the UserRole records that match this role
213
- let ok = true;
214
242
  const r2 = await rv.RunView({
215
243
  EntityName: "MJ: User Roles",
216
244
  ExtraFilter: "RoleID = '" + role.ID + "'",
@@ -218,10 +246,14 @@ export class SyncRolesAndUsersResolver {
218
246
  }, user);
219
247
  if (r2.Success) {
220
248
  for (const ur of r2.Results) {
221
- ok = ok && await ur.Delete(); // remove the user role
249
+ if (!await ur.Delete()) {
250
+ throw new Error(`Failed to delete user-role link for role '${role.Name}': ${ur.LatestResult?.CompleteMessage ?? 'unknown error'}`);
251
+ }
222
252
  }
223
253
  }
224
- return ok && role.Delete(); // remove the role
254
+ if (!await role.Delete()) {
255
+ throw new Error(`Failed to delete role '${role.Name}': ${role.LatestResult?.CompleteMessage ?? 'unknown error'}`);
256
+ }
225
257
  }
226
258
  /**
227
259
  * This mutation will sync the just the users in the system with the data provided in the input, matches existing users by email
@@ -229,37 +261,52 @@ export class SyncRolesAndUsersResolver {
229
261
  * @param data
230
262
  */
231
263
  async SyncUsers(users, context) {
264
+ // Wrap delete + add + update + role-sync of users in one DB transaction.
232
265
  try {
233
- // first, we sync up the users and then the user roles.
234
- // for syncing users we first remove users that are no longer in the input, then we add new users and update existing users
235
- const rv = new RunView();
236
- const result = await rv.RunView({
237
- EntityName: "MJ: Users",
238
- ResultType: 'entity_object'
239
- }, context.userPayload.userRecord);
240
- if (result && result.Success) {
241
- // go through current users and remove those that are not in the input
242
- const currentUsers = result.Results;
243
- if (await this.DeleteRemovedUsers(currentUsers, users, context.userPayload.userRecord, context.userPayload)) {
244
- if (await this.AddNewUsers(currentUsers, users, context.userPayload)) {
245
- if (await this.UpdateExistingUsers(currentUsers, users, context.userPayload)) {
246
- if (await this.SyncUserRoles(users, context.userPayload.userRecord, context.userPayload)) {
247
- return { Success: true };
248
- }
249
- }
250
- }
266
+ const provider = Metadata.Provider;
267
+ await provider.BeginTransaction();
268
+ try {
269
+ const result = await this.DoSyncUsers(users, context.userPayload.userRecord, context.userPayload);
270
+ if (result.Success) {
271
+ await provider.CommitTransaction();
251
272
  }
273
+ else {
274
+ await provider.RollbackTransaction();
275
+ }
276
+ return result;
277
+ }
278
+ catch (txErr) {
279
+ await provider.RollbackTransaction();
280
+ throw txErr;
252
281
  }
253
- return { Success: false }; // if we get here, something went wrong
254
282
  }
255
283
  catch (err) {
256
284
  LogError(err);
257
285
  throw new Error('Error syncing roles and users\n\n' + err);
258
286
  }
259
287
  }
288
+ /**
289
+ * Transaction-free core of SyncUsers — expected to be invoked inside an outer transaction.
290
+ * Throws on any Save/Delete failure so the outer transaction rolls back.
291
+ */
292
+ async DoSyncUsers(users, user, userPayload) {
293
+ const rv = new RunView();
294
+ const result = await rv.RunView({
295
+ EntityName: "MJ: Users",
296
+ ResultType: 'entity_object'
297
+ }, user);
298
+ if (!result || !result.Success) {
299
+ return { Success: false };
300
+ }
301
+ const currentUsers = result.Results;
302
+ await this.DeleteRemovedUsers(currentUsers, users, user, userPayload);
303
+ await this.AddNewUsers(currentUsers, users, userPayload);
304
+ await this.UpdateExistingUsers(currentUsers, users, userPayload);
305
+ await this.SyncUserRoles(users, user, userPayload);
306
+ return { Success: true };
307
+ }
260
308
  async UpdateExistingUsers(currentUsers, futureUsers, userPayload) {
261
309
  // go through the future users and update any that are in the current users
262
- let ok = true;
263
310
  for (const update of futureUsers) {
264
311
  const current = currentUsers.find(c => c.Email?.trim().toLowerCase() === update.Email?.trim().toLowerCase());
265
312
  if (current) {
@@ -268,21 +315,23 @@ export class SyncRolesAndUsersResolver {
268
315
  current.FirstName = update.FirstName;
269
316
  current.LastName = update.LastName;
270
317
  current.Title = update.Title;
271
- ok = ok && await current.Save();
318
+ if (!await current.Save()) {
319
+ throw new Error(`Failed to update user '${current.Email}': ${current.LatestResult?.CompleteMessage ?? 'unknown error'}`);
320
+ }
272
321
  }
273
322
  }
274
- return ok;
275
323
  }
276
324
  async AddNewUsers(currentUsers, futureUsers, userPayload) {
277
325
  // add users that are not in the current users
278
326
  const md = new Metadata();
279
- let ok = true;
280
327
  for (const add of futureUsers) {
281
328
  const match = currentUsers.find(currentUser => currentUser.Email?.trim().toLowerCase() === add.Email?.trim().toLowerCase());
282
329
  if (match) {
283
330
  // make sure the IsActive bit is set to true
284
331
  match.IsActive = true;
285
- ok = ok && await match.Save();
332
+ if (!await match.Save()) {
333
+ throw new Error(`Failed to reactivate user '${match.Email}': ${match.LatestResult?.CompleteMessage ?? 'unknown error'}`);
334
+ }
286
335
  }
287
336
  else {
288
337
  const user = await md.GetEntityObject("MJ: Users", userPayload.userRecord);
@@ -293,29 +342,25 @@ export class SyncRolesAndUsersResolver {
293
342
  user.LastName = add.LastName;
294
343
  user.Title = add.Title;
295
344
  user.IsActive = true;
296
- ok = ok && await user.Save();
345
+ if (!await user.Save()) {
346
+ throw new Error(`Failed to create user '${add.Email}': ${user.LatestResult?.CompleteMessage ?? 'unknown error'}`);
347
+ }
297
348
  }
298
349
  }
299
- return ok;
300
350
  }
301
351
  async DeleteRemovedUsers(currentUsers, futureUsers, u, userPayload) {
302
352
  // remove users that are not in the future users
303
353
  const rv = new RunView();
304
- const md = new Metadata();
305
- let ok = true;
306
- //const tg = await md.CreateTransactionGroup(); HAVING PROBLEMS with this, so skipping for now, I think the entire thing is wrapped in a transaction and that's causing issues with two styles of trans wrappers
307
354
  for (const remove of currentUsers) {
308
355
  if (remove.Type.trim().toLowerCase() !== 'owner') {
309
356
  if (!futureUsers.find(r => r.Email.trim().toLowerCase() === remove.Email.trim().toLowerCase())) {
310
- ok = ok && await this.DeleteSingleUser(remove, rv, u, userPayload);
357
+ await this.DeleteSingleUser(remove, rv, u, userPayload);
311
358
  }
312
359
  }
313
360
  }
314
- return ok;
315
361
  }
316
362
  async DeleteSingleUser(user, rv, u, userPayload) {
317
363
  // first, remove all the UserRole records that match this user
318
- let ok = true;
319
364
  const r2 = await rv.RunView({
320
365
  EntityName: "MJ: User Roles",
321
366
  ExtraFilter: "UserID = '" + user.ID + "'",
@@ -323,17 +368,19 @@ export class SyncRolesAndUsersResolver {
323
368
  }, u);
324
369
  if (r2.Success) {
325
370
  for (const ur of r2.Results) {
326
- //ur.TransactionGroup = tg;
327
- ok = ok && await ur.Delete(); // remove the user role
371
+ if (!await ur.Delete()) {
372
+ throw new Error(`Failed to delete user-role link for user '${user.Email}': ${ur.LatestResult?.CompleteMessage ?? 'unknown error'}`);
373
+ }
328
374
  }
329
375
  }
330
376
  if (await user.Delete()) {
331
- return ok;
377
+ return;
332
378
  }
333
- else {
334
- // in some cases there are a lot of fkey constraints that prevent the user from being deleted, so we mark the user as inactive instead
335
- user.IsActive = false;
336
- return await user.Save() && ok;
379
+ // FK constraint fallback: when the user has dependent records that block hard delete,
380
+ // we mark the user inactive instead. A failure to soft-delete IS a real error and rolls back.
381
+ user.IsActive = false;
382
+ if (!await user.Save()) {
383
+ throw new Error(`Failed to delete or deactivate user '${user.Email}': ${user.LatestResult?.CompleteMessage ?? 'unknown error'}`);
337
384
  }
338
385
  }
339
386
  async SyncUserRoles(users, u, userPayload) {
@@ -352,49 +399,39 @@ export class SyncRolesAndUsersResolver {
352
399
  EntityName: "MJ: User Roles",
353
400
  ResultType: 'entity_object'
354
401
  }, u);
355
- // await both
356
402
  const [uResult, rResult, urResult] = await Promise.all([p1, p2, p3]);
357
- if (uResult.Success && rResult.Success && urResult.Success) {
358
- // we have the DB users and roles, and user roles
359
- const dbUsers = uResult.Results;
360
- const dbRoles = rResult.Results;
361
- const dbUserRoles = urResult.Results;
362
- let ok = true;
363
- // now, we can do lookups in memory from those DB roles and Users for their ID values
364
- // now we will iterate through the users input type and for each role, make sure it is in there
365
- //const tg = await md.CreateTransactionGroup();
366
- for (const user of users) {
367
- const dbUser = dbUsers.find(u => u.Email.trim().toLowerCase() === user.Email.trim().toLowerCase());
368
- if (dbUser) {
369
- for (const role of user.Roles) {
370
- const dbRole = dbRoles.find(r => r.Name.trim().toLowerCase() === role.Name.trim().toLowerCase());
371
- if (dbRole) {
372
- // now we need to make sure there is a user role that matches this user and role
373
- if (!dbUserRoles.find(ur => UUIDsEqual(ur.UserID, dbUser.ID) && UUIDsEqual(ur.RoleID, dbRole.ID))) {
374
- // we need to add a user role
375
- const ur = await md.GetEntityObject("MJ: User Roles", u);
376
- ur.UserID = dbUser.ID;
377
- ur.RoleID = dbRole.ID;
378
- ok = ok && await ur.Save();
379
- }
380
- }
403
+ if (!uResult.Success || !rResult.Success || !urResult.Success) {
404
+ throw new Error(`Failed to load users/roles/user-roles for SyncUserRoles`);
405
+ }
406
+ const dbUsers = uResult.Results;
407
+ const dbRoles = rResult.Results;
408
+ const dbUserRoles = urResult.Results;
409
+ // Saves/Deletes below run inside the outer SyncUsers/SyncRolesAndUsers transaction.
410
+ for (const user of users) {
411
+ const dbUser = dbUsers.find(u => u.Email.trim().toLowerCase() === user.Email.trim().toLowerCase());
412
+ if (!dbUser)
413
+ continue;
414
+ for (const role of user.Roles) {
415
+ const dbRole = dbRoles.find(r => r.Name.trim().toLowerCase() === role.Name.trim().toLowerCase());
416
+ if (dbRole && !dbUserRoles.find(ur => UUIDsEqual(ur.UserID, dbUser.ID) && UUIDsEqual(ur.RoleID, dbRole.ID))) {
417
+ const ur = await md.GetEntityObject("MJ: User Roles", u);
418
+ ur.UserID = dbUser.ID;
419
+ ur.RoleID = dbRole.ID;
420
+ if (!await ur.Save()) {
421
+ throw new Error(`Failed to assign role '${dbRole.Name}' to user '${dbUser.Email}': ${ur.LatestResult?.CompleteMessage ?? 'unknown error'}`);
381
422
  }
382
- // now, we check for DB user roles that are NOT in the user.Roles property as they are no longer part of the user's roles
383
- const thisUserDBRoles = dbUserRoles.filter(ur => UUIDsEqual(ur.UserID, dbUser.ID));
384
- for (const dbUserRole of thisUserDBRoles) {
385
- const role = user.Roles.find(r => r.Name.trim().toLowerCase() === dbRoles.find(rr => UUIDsEqual(rr.ID, dbUserRole.RoleID))?.Name.trim().toLowerCase());
386
- if (!role && !this.IsStandardRole(dbUserRole.Role)) {
387
- // this user role is no longer in the user's roles, we need to remove it
388
- //dbUserRole.TransactionGroup = tg;
389
- ok = ok && await dbUserRole.Delete(); // remove the user role - we use await for the DELETE, not the save
390
- }
423
+ }
424
+ }
425
+ // Check for DB user roles that are NOT in the user.Roles input — those need to be removed
426
+ const thisUserDBRoles = dbUserRoles.filter(ur => UUIDsEqual(ur.UserID, dbUser.ID));
427
+ for (const dbUserRole of thisUserDBRoles) {
428
+ const role = user.Roles.find(r => r.Name.trim().toLowerCase() === dbRoles.find(rr => UUIDsEqual(rr.ID, dbUserRole.RoleID))?.Name.trim().toLowerCase());
429
+ if (!role && !this.IsStandardRole(dbUserRole.Role)) {
430
+ if (!await dbUserRole.Delete()) {
431
+ throw new Error(`Failed to remove role from user '${dbUser.Email}': ${dbUserRole.LatestResult?.CompleteMessage ?? 'unknown error'}`);
391
432
  }
392
433
  }
393
434
  }
394
- return ok;
395
- }
396
- else {
397
- return false;
398
435
  }
399
436
  }
400
437
  }