@tellescope/schema 1.253.0 → 1.254.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.
package/lib/cjs/schema.js CHANGED
@@ -10,6 +10,15 @@ var __assign = (this && this.__assign) || function () {
10
10
  };
11
11
  return __assign.apply(this, arguments);
12
12
  };
13
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
14
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
15
+ if (ar || !(i in from)) {
16
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
17
+ ar[i] = from[i];
18
+ }
19
+ }
20
+ return to.concat(ar || Array.prototype.slice.call(from));
21
+ };
13
22
  Object.defineProperty(exports, "__esModule", { value: true });
14
23
  exports.schema = exports.build_schema = exports.UNIQUE_LIST_FIELDS = exports.get_next_reminder_timestamp_for_ticket = void 0;
15
24
  var types_models_1 = require("@tellescope/types-models");
@@ -189,9 +198,10 @@ exports.schema = (0, exports.build_schema)({
189
198
  add_to_journey: {}, remove_from_journey: {}, begin_login_flow: {}, set_password: {},
190
199
  unsubscribe: {},
191
200
  },
192
- fields: __assign(__assign({}, BuiltInFields), { recentViewers: { validator: validation_1.recentViewersValidator }, healthie_dietitian_id: { validator: validation_1.stringValidator100 }, mergedIds: { validator: validation_1.listOfMongoIdStringValidatorOptionalOrEmptyOk, readonly: true, redactions: ['enduser'] }, externalId: {
201
+ fields: __assign(__assign({}, BuiltInFields), { sharedWithOrganizations: __assign(__assign({}, BuiltInFields.sharedWithOrganizations), { enduserUpdatesDisabled: true }), recentViewers: { validator: validation_1.recentViewersValidator }, healthie_dietitian_id: { validator: validation_1.stringValidator100, enduserUpdatesDisabled: true }, mergedIds: { validator: validation_1.listOfMongoIdStringValidatorOptionalOrEmptyOk, readonly: true, redactions: ['enduser'] }, externalId: {
193
202
  validator: validation_1.stringValidator250,
194
203
  examples: ['addfed3e-ddea-415b-b52b-df820c944dbb'],
204
+ enduserUpdatesDisabled: true,
195
205
  }, email: {
196
206
  validator: validation_1.emailValidatorEmptyOkay,
197
207
  examples: ['test@tellescope.com'],
@@ -233,6 +243,7 @@ exports.schema = (0, exports.build_schema)({
233
243
  }, journeys: {
234
244
  validator: validation_1.journeysValidator,
235
245
  redactions: ['enduser'],
246
+ enduserUpdatesDisabled: true,
236
247
  dependencies: [
237
248
  {
238
249
  dependsOn: ['journeys'],
@@ -249,14 +260,17 @@ exports.schema = (0, exports.build_schema)({
249
260
  }, scheduledJourneys: { validator: validation_1.scheduledJourneysValidator }, tags: {
250
261
  redactions: ['enduser'],
251
262
  validator: validation_1.listOfStringsValidatorUniqueOptionalOrEmptyOkay,
263
+ enduserUpdatesDisabled: true,
252
264
  }, accessTags: {
253
265
  redactions: ['enduser'],
254
266
  validator: validation_1.listOfStringsValidatorEmptyOk,
267
+ enduserUpdatesDisabled: true,
255
268
  }, unredactedTags: {
256
269
  validator: validation_1.listOfStringsValidatorEmptyOk,
257
270
  }, fields: {
258
271
  redactions: ['enduser'],
259
272
  validator: validation_1.fieldsValidator,
273
+ enduserUpdatesDisabled: true, // intake forms write fields server-side; direct enduser PATCH is not a supported path
260
274
  }, unredactedFields: {
261
275
  validator: validation_1.fieldsValidator,
262
276
  }, preference: {
@@ -265,12 +279,15 @@ exports.schema = (0, exports.build_schema)({
265
279
  }, assignedTo: {
266
280
  redactions: ['enduser'],
267
281
  validator: validation_1.listOfUniqueStringsValidatorEmptyOk,
282
+ enduserUpdatesDisabled: true,
268
283
  }, primaryAssignee: {
269
284
  validator: validation_1.mongoIdStringRequired,
270
285
  redactions: ['enduser'],
286
+ enduserUpdatesDisabled: true,
271
287
  }, unread: {
272
288
  redactions: ['enduser'],
273
289
  validator: validation_1.booleanValidator,
290
+ enduserUpdatesDisabled: true,
274
291
  }, lastActive: {
275
292
  validator: validation_1.dateValidator,
276
293
  }, lastLogout: { validator: validation_1.dateValidator }, invalidateSessionsBefore: { validator: validation_1.dateValidator }, termsSigned: { validator: validation_1.dateValidator }, termsVersion: { validator: validation_1.stringValidator100 }, lastCommunication: {
@@ -293,12 +310,12 @@ exports.schema = (0, exports.build_schema)({
293
310
  // ]
294
311
  },
295
312
  // should allow any gender via API but our UI can limit to Tellescope types by default
296
- gender: { validator: validation_1.stringValidator, redactions: ['enduser'] }, genderIdentity: { validator: validation_1.stringValidator100, redactions: ['enduser'] }, pronouns: { validator: validation_1.stringValidator100, redactions: ['enduser'] }, height: { validator: validation_1.genericUnitWithQuantityValidator, redactions: ['enduser'] }, weight: { validator: validation_1.genericUnitWithQuantityValidator, redactions: ['enduser'] }, source: { validator: validation_1.stringValidator1000Optional }, addressLineOne: { validator: validation_1.stringValidator5000EmptyOkay, redactions: ['enduser'] }, addressLineTwo: { validator: validation_1.stringValidator5000EmptyOkay, redactions: ['enduser'] }, city: { validator: validation_1.stringValidator5000EmptyOkay, redactions: ['enduser'] }, state: { validator: validation_1.stateValidator, redactions: ['enduser'] }, zipCode: { validator: validation_1.stringValidator25000EmptyOkay, redactions: ['enduser'] }, zipPlusFour: { validator: validation_1.stringValidator100, redactions: ['enduser'] }, timezone: { validator: validation_1.timezoneValidator }, humanReadableId: { validator: validation_1.stringValidator100 }, displayName: { validator: validation_1.stringValidator250 }, unsubscribedFromPortalChatNotifications: { validator: validation_1.booleanValidator }, triggeredEvents: { validator: (0, validation_1.objectAnyFieldsValidator)(validation_1.numberValidator) }, customTypeId: { validator: validation_1.mongoIdStringRequired }, language: { validator: validation_1.languageValidator }, relationships: {
313
+ gender: { validator: validation_1.stringValidator, redactions: ['enduser'] }, genderIdentity: { validator: validation_1.stringValidator100, redactions: ['enduser'] }, pronouns: { validator: validation_1.stringValidator100, redactions: ['enduser'] }, height: { validator: validation_1.genericUnitWithQuantityValidator, redactions: ['enduser'] }, weight: { validator: validation_1.genericUnitWithQuantityValidator, redactions: ['enduser'] }, source: { validator: validation_1.stringValidator1000Optional, enduserUpdatesDisabled: true }, addressLineOne: { validator: validation_1.stringValidator5000EmptyOkay, redactions: ['enduser'] }, addressLineTwo: { validator: validation_1.stringValidator5000EmptyOkay, redactions: ['enduser'] }, city: { validator: validation_1.stringValidator5000EmptyOkay, redactions: ['enduser'] }, state: { validator: validation_1.stateValidator, redactions: ['enduser'] }, zipCode: { validator: validation_1.stringValidator25000EmptyOkay, redactions: ['enduser'] }, zipPlusFour: { validator: validation_1.stringValidator100, redactions: ['enduser'] }, timezone: { validator: validation_1.timezoneValidator }, humanReadableId: { validator: validation_1.stringValidator100 }, displayName: { validator: validation_1.stringValidator250 }, unsubscribedFromPortalChatNotifications: { validator: validation_1.booleanValidator }, triggeredEvents: { validator: (0, validation_1.objectAnyFieldsValidator)(validation_1.numberValidator) }, customTypeId: { validator: validation_1.mongoIdStringRequired, enduserUpdatesDisabled: true }, language: { validator: validation_1.languageValidator }, relationships: {
297
314
  validator: (0, validation_1.listValidatorOptionalOrEmptyOk)((0, validation_1.objectValidator)({
298
315
  id: validation_1.mongoIdStringRequired,
299
316
  type: validation_1.stringValidator100,
300
317
  }))
301
- }, markedReadAt: { validator: validation_1.dateOptionalOrEmptyStringValidator }, markedUnreadAt: { validator: validation_1.dateOptionalOrEmptyStringValidator }, note: { validator: validation_1.stringValidator25000EmptyOkay, redactions: ['enduser'] }, noteIsFlagged: { validator: validation_1.booleanValidator }, insurance: { validator: validation_1.insuranceOptionalValidator, redactions: ['enduser'] }, insuranceSecondary: { validator: validation_1.insuranceOptionalValidator, redactions: ['enduser'] }, bookingNotes: {
318
+ }, markedReadAt: { validator: validation_1.dateOptionalOrEmptyStringValidator }, markedUnreadAt: { validator: validation_1.dateOptionalOrEmptyStringValidator }, note: { validator: validation_1.stringValidator25000EmptyOkay, redactions: ['enduser'], enduserUpdatesDisabled: true }, noteIsFlagged: { validator: validation_1.booleanValidator }, insurance: { validator: validation_1.insuranceOptionalValidator, redactions: ['enduser'], enduserUpdatesDisabled: true }, insuranceSecondary: { validator: validation_1.insuranceOptionalValidator, redactions: ['enduser'], enduserUpdatesDisabled: true }, bookingNotes: {
302
319
  validator: (0, validation_1.listValidatorOptionalOrEmptyOk)((0, validation_1.objectValidator)({
303
320
  bookingPageId: validation_1.mongoIdStringRequired,
304
321
  note: validation_1.stringValidator5000EmptyOkay,
@@ -313,10 +330,11 @@ exports.schema = (0, exports.build_schema)({
313
330
  archivedAt: validation_1.dateValidatorOptional,
314
331
  })),
315
332
  redactions: ['enduser'],
316
- }, references: { validator: validation_1.listOfRelatedRecordsValidator, redactions: ['enduser'] }, athenaDepartmentId: { validator: validation_1.stringValidator100, redactions: ['enduser'] }, athenaPracticeId: { validator: validation_1.stringValidator100, redactions: ['enduser'] }, salesforceId: { validator: validation_1.stringValidator100, redactions: ['enduser'] }, vitalTriggersDisabled: { validator: validation_1.booleanValidator }, defaultFromPhone: { validator: validation_1.phoneValidator, redactions: ['enduser'] }, defaultFromEmail: { validator: validation_1.emailValidator, redactions: ['enduser'] }, useDefaultFromEmailInAutomations: { validator: validation_1.booleanValidator }, useDefaultFromPhoneInAutomations: { validator: validation_1.booleanValidator }, stripeCustomerId: { validator: validation_1.stringValidator100, redactions: ['enduser'] }, stripeKey: { validator: validation_1.stringValidator250, redactions: ['enduser'] }, diagnoses: {
333
+ }, references: { validator: validation_1.listOfRelatedRecordsValidator, redactions: ['enduser'], enduserUpdatesDisabled: true }, athenaDepartmentId: { validator: validation_1.stringValidator100, redactions: ['enduser'], enduserUpdatesDisabled: true }, athenaPracticeId: { validator: validation_1.stringValidator100, redactions: ['enduser'], enduserUpdatesDisabled: true }, salesforceId: { validator: validation_1.stringValidator100, redactions: ['enduser'], enduserUpdatesDisabled: true }, vitalTriggersDisabled: { validator: validation_1.booleanValidator }, defaultFromPhone: { validator: validation_1.phoneValidator, redactions: ['enduser'] }, defaultFromEmail: { validator: validation_1.emailValidator, redactions: ['enduser'] }, useDefaultFromEmailInAutomations: { validator: validation_1.booleanValidator }, useDefaultFromPhoneInAutomations: { validator: validation_1.booleanValidator }, stripeCustomerId: { validator: validation_1.stringValidator100, redactions: ['enduser'], enduserUpdatesDisabled: true }, stripeKey: { validator: validation_1.stringValidator250, redactions: ['enduser'], enduserUpdatesDisabled: true }, diagnoses: {
317
334
  validator: (0, validation_1.listValidatorOptionalOrEmptyOk)(validation_1.enduserDiagnosisValidator),
318
- redactions: ['enduser']
319
- }, unsubscribedFromPhones: { validator: validation_1.listOfStringsValidatorUniqueOptionalOrEmptyOkay, redactions: ['enduser'] }, lockedFromPortal: { validator: validation_1.booleanValidator }, eligibleForAutoMerge: { validator: validation_1.booleanValidator }, preferredPharmacy: { validator: validation_1.pharmacyValidator, redactions: ['enduser'] } }),
335
+ redactions: ['enduser'],
336
+ enduserUpdatesDisabled: true,
337
+ }, unsubscribedFromPhones: { validator: validation_1.listOfStringsValidatorUniqueOptionalOrEmptyOkay, redactions: ['enduser'] }, lockedFromPortal: { validator: validation_1.booleanValidator, enduserUpdatesDisabled: true }, eligibleForAutoMerge: { validator: validation_1.booleanValidator, enduserUpdatesDisabled: true }, preferredPharmacy: { validator: validation_1.pharmacyValidator, redactions: ['enduser'] } }),
320
338
  customActions: {
321
339
  rename_stored_custom_fields: {
322
340
  op: "custom", access: 'update', method: "patch",
@@ -1180,7 +1198,7 @@ exports.schema = (0, exports.build_schema)({
1180
1198
  },
1181
1199
  journeys: {
1182
1200
  info: {},
1183
- fields: __assign(__assign({}, BuiltInFields), { archivedAt: { validator: validation_1.dateOptionalOrEmptyStringValidator }, title: {
1201
+ fields: __assign(__assign({}, BuiltInFields), { accessTags: { redactions: ['enduser'], validator: validation_1.listOfStringsValidatorEmptyOk }, archivedAt: { validator: validation_1.dateOptionalOrEmptyStringValidator }, title: {
1184
1202
  validator: validation_1.stringValidator100,
1185
1203
  required: true,
1186
1204
  examples: ['Test']
@@ -1872,8 +1890,10 @@ exports.schema = (0, exports.build_schema)({
1872
1890
  var _c;
1873
1891
  var _id = _a._id;
1874
1892
  var updates = _b.updates;
1875
- if (session.type === 'user' && !session.eat)
1876
- return; // accessTags is not enabled
1893
+ // editing a user's tags is a privilege-escalation vector whenever tags gate visibility:
1894
+ // enduser access tags (eat) OR resource access tags (erat). Skip only when neither is enabled.
1895
+ if (session.type === 'user' && !session.eat && !(session === null || session === void 0 ? void 0 : session.erat))
1896
+ return; // neither access-tags feature enabled
1877
1897
  if ((_c = session === null || session === void 0 ? void 0 : session.roles) === null || _c === void 0 ? void 0 : _c.includes('Admin'))
1878
1898
  return;
1879
1899
  if (method === 'create')
@@ -2554,7 +2574,7 @@ exports.schema = (0, exports.build_schema)({
2554
2574
  },
2555
2575
  },
2556
2576
  },
2557
- fields: __assign(__assign({}, BuiltInFields), { archivedAt: { validator: validation_1.dateOptionalOrEmptyStringValidator }, mmsAttachmentURLs: { validator: validation_1.listOfUniqueStringsValidatorEmptyOk }, title: {
2577
+ fields: __assign(__assign({}, BuiltInFields), { accessTags: { redactions: ['enduser'], validator: validation_1.listOfStringsValidatorEmptyOk }, archivedAt: { validator: validation_1.dateOptionalOrEmptyStringValidator }, mmsAttachmentURLs: { validator: validation_1.listOfUniqueStringsValidatorEmptyOk }, title: {
2558
2578
  validator: validation_1.stringValidator100,
2559
2579
  required: true,
2560
2580
  examples: ["Template Name"],
@@ -2584,7 +2604,7 @@ exports.schema = (0, exports.build_schema)({
2584
2604
  constraints: { unique: [], relationship: [] },
2585
2605
  defaultActions: { read: {}, readMany: {}, update: {}, delete: {} },
2586
2606
  enduserActions: { prepare_file_upload: {}, confirm_file_upload: {}, file_download_URL: {}, read: {}, readMany: {}, delete: {}, update: {} /* allow to hide from client side */ },
2587
- fields: __assign(__assign({}, BuiltInFields), { source: { validator: validation_1.stringValidator100 }, tags: { validator: validation_1.listOfStringsValidatorUniqueOptionalOrEmptyOkay }, name: {
2607
+ fields: __assign(__assign({}, BuiltInFields), { accessTags: { redactions: ['enduser'], validator: validation_1.listOfStringsValidatorEmptyOk }, source: { validator: validation_1.stringValidator100 }, tags: { validator: validation_1.listOfStringsValidatorUniqueOptionalOrEmptyOkay }, name: {
2588
2608
  validator: validation_1.stringValidator250,
2589
2609
  required: true,
2590
2610
  }, size: {
@@ -2595,6 +2615,8 @@ exports.schema = (0, exports.build_schema)({
2595
2615
  required: true
2596
2616
  }, enduserId: {
2597
2617
  validator: validation_1.mongoIdStringRequired,
2618
+ }, formResponseId: {
2619
+ validator: validation_1.mongoIdStringRequired,
2598
2620
  }, secureName: {
2599
2621
  validator: validation_1.stringValidator250,
2600
2622
  readonly: true,
@@ -3075,7 +3097,7 @@ exports.schema = (0, exports.build_schema)({
3075
3097
  },
3076
3098
  },
3077
3099
  },
3078
- fields: __assign(__assign({}, BuiltInFields), { showByUserTags: { validator: validation_1.listOfStringsValidatorOptionalOrEmptyOk }, belugaVisitType: { validator: validation_1.stringValidator }, belugaVerificationId: { validator: validation_1.stringValidator }, belugaPharmacyMappings: {
3100
+ fields: __assign(__assign({}, BuiltInFields), { accessTags: { redactions: ['enduser'], validator: validation_1.listOfStringsValidatorEmptyOk }, showByUserTags: { validator: validation_1.listOfStringsValidatorOptionalOrEmptyOk }, belugaVisitType: { validator: validation_1.stringValidator }, belugaVerificationId: { validator: validation_1.stringValidator }, belugaPharmacyMappings: {
3079
3101
  validator: (0, validation_1.listValidatorOptionalOrEmptyOk)((0, validation_1.objectValidator)({
3080
3102
  title: validation_1.stringValidatorOptionalEmptyOkay,
3081
3103
  pharmacyId: validation_1.stringValidator100,
@@ -3190,7 +3212,7 @@ exports.schema = (0, exports.build_schema)({
3190
3212
  unique: [],
3191
3213
  relationship: [],
3192
3214
  },
3193
- fields: __assign(__assign({}, BuiltInFields), { discussionRoomId: { validator: validation_1.mongoIdStringRequired }, hiddenFromTimeline: { validator: validation_1.booleanValidator }, lockedAt: { validator: validation_1.dateValidator }, formId: {
3215
+ fields: __assign(__assign({}, BuiltInFields), { discussionRoomId: { validator: validation_1.mongoIdStringRequired }, hiddenFromTimeline: { validator: validation_1.booleanValidator, enduserUpdatesDisabled: true }, lockedAt: { validator: validation_1.dateValidator, enduserUpdatesDisabled: true }, formId: {
3194
3216
  validator: validation_1.stringValidator100,
3195
3217
  required: true,
3196
3218
  dependencies: [
@@ -3215,12 +3237,13 @@ exports.schema = (0, exports.build_schema)({
3215
3237
  updatesDisabled: true,
3216
3238
  }, openedAt: {
3217
3239
  validator: validation_1.dateValidator,
3218
- }, copiedFrom: { validator: validation_1.mongoIdStringOptional }, copiedFromEnduserId: { validator: validation_1.mongoIdStringOptional }, publicSubmit: { validator: validation_1.booleanValidator }, submittedBy: { validator: validation_1.stringValidator250 }, submittedByIsPlaceholder: { validator: validation_1.booleanValidator }, markedAsSubmitted: { validator: validation_1.booleanValidator }, accessCode: { validator: validation_1.stringValidator250 }, userEmail: { validator: validation_1.emailValidator }, submittedAt: { validator: validation_1.dateValidator }, formTitle: { validator: validation_1.stringValidator250 }, responses: { validator: validation_1.formResponsesValidator }, draftSavedAt: { validator: validation_1.dateValidator }, draftSavedBy: { validator: validation_1.mongoIdStringRequired }, hideFromEnduserPortal: { validator: validation_1.booleanValidator }, sharedVia: { validator: validation_1.communicationsChannelValidator }, isInternalNote: { validator: validation_1.booleanValidator }, pinnedAt: { validator: validation_1.dateOptionalOrEmptyStringValidator }, publicIdentifier: { validator: validation_1.stringValidator250 }, source: { validator: validation_1.stringValidator250 }, externalId: { validator: validation_1.stringValidator250 }, rootResponseId: { validator: validation_1.mongoIdStringRequired }, parentResponseId: { validator: validation_1.mongoIdStringRequired }, tags: { validator: validation_1.listOfStringsValidatorOptionalOrEmptyOk }, carePlanId: { validator: validation_1.mongoIdStringRequired }, context: { validator: validation_1.stringValidator1000 }, logoURL: { validator: validation_1.stringValidator5000 }, logoHeight: { validator: validation_1.numberValidator }, calendarEventId: { validator: validation_1.mongoIdStringRequired }, references: { validator: validation_1.listOfRelatedRecordsValidator, readonly: true }, groupId: { validator: validation_1.mongoIdStringRequired }, groupInstance: { validator: validation_1.stringValidator100 }, groupPosition: { validator: validation_1.nonNegNumberValidator }, hideAfterUnsubmittedInMS: { validator: validation_1.numberValidator }, addenda: {
3240
+ }, copiedFrom: { validator: validation_1.mongoIdStringOptional }, copiedFromEnduserId: { validator: validation_1.mongoIdStringOptional }, publicSubmit: { validator: validation_1.booleanValidator }, submittedBy: { validator: validation_1.stringValidator250, enduserUpdatesDisabled: true }, submittedByIsPlaceholder: { validator: validation_1.booleanValidator, enduserUpdatesDisabled: true }, markedAsSubmitted: { validator: validation_1.booleanValidator, enduserUpdatesDisabled: true }, accessCode: { validator: validation_1.stringValidator250 }, userEmail: { validator: validation_1.emailValidator, enduserUpdatesDisabled: true }, submittedAt: { validator: validation_1.dateValidator, enduserUpdatesDisabled: true }, formTitle: { validator: validation_1.stringValidator250, enduserUpdatesDisabled: true }, responses: { validator: validation_1.formResponsesValidator }, draftSavedAt: { validator: validation_1.dateValidator }, draftSavedBy: { validator: validation_1.mongoIdStringRequired }, hideFromEnduserPortal: { validator: validation_1.booleanValidator }, sharedVia: { validator: validation_1.communicationsChannelValidator }, isInternalNote: { validator: validation_1.booleanValidator, enduserUpdatesDisabled: true }, pinnedAt: { validator: validation_1.dateOptionalOrEmptyStringValidator, enduserUpdatesDisabled: true }, publicIdentifier: { validator: validation_1.stringValidator250 }, source: { validator: validation_1.stringValidator250 }, externalId: { validator: validation_1.stringValidator250 }, rootResponseId: { validator: validation_1.mongoIdStringRequired }, parentResponseId: { validator: validation_1.mongoIdStringRequired }, tags: { validator: validation_1.listOfStringsValidatorOptionalOrEmptyOk, enduserUpdatesDisabled: true }, carePlanId: { validator: validation_1.mongoIdStringRequired }, context: { validator: validation_1.stringValidator1000 }, logoURL: { validator: validation_1.stringValidator5000, enduserUpdatesDisabled: true }, logoHeight: { validator: validation_1.numberValidator, enduserUpdatesDisabled: true }, calendarEventId: { validator: validation_1.mongoIdStringRequired }, references: { validator: validation_1.listOfRelatedRecordsValidator, readonly: true }, groupId: { validator: validation_1.mongoIdStringRequired }, groupInstance: { validator: validation_1.stringValidator100 }, groupPosition: { validator: validation_1.nonNegNumberValidator }, hideAfterUnsubmittedInMS: { validator: validation_1.numberValidator }, addenda: {
3219
3241
  validator: (0, validation_1.listValidatorOptionalOrEmptyOk)((0, validation_1.objectValidator)({
3220
3242
  text: validation_1.stringValidator25000EmptyOkay,
3221
3243
  timestamp: validation_1.dateValidator,
3222
3244
  userId: validation_1.mongoIdStringRequired,
3223
- }))
3245
+ })),
3246
+ enduserUpdatesDisabled: true,
3224
3247
  }, followups: {
3225
3248
  validator: (0, validation_1.listValidatorOptionalOrEmptyOk)((0, validation_1.objectValidator)({
3226
3249
  formId: validation_1.mongoIdStringRequired,
@@ -3233,7 +3256,7 @@ exports.schema = (0, exports.build_schema)({
3233
3256
  fieldTitle: validation_1.stringValidator250,
3234
3257
  timestamp: validation_1.dateValidator,
3235
3258
  }))
3236
- }, startedViaPinnedForm: { validator: validation_1.booleanValidator }, enduserAISummary: { validator: validation_1.stringValidator25000 }, procedureCodes: { validator: procedureCodesValidator }, diagnosisCodes: { validator: diagnosisCodesValidator } }),
3259
+ }, startedViaPinnedForm: { validator: validation_1.booleanValidator }, enduserAISummary: { validator: validation_1.stringValidator25000, enduserUpdatesDisabled: true }, procedureCodes: { validator: procedureCodesValidator, enduserUpdatesDisabled: true }, diagnosisCodes: { validator: diagnosisCodesValidator, enduserUpdatesDisabled: true } }),
3237
3260
  defaultActions: constants_1.DEFAULT_OPERATIONS,
3238
3261
  enduserActions: {
3239
3262
  prepare_form_response: {}, info_for_access_code: {}, submit_form_response: {}, stripe_details: {}, chargebee_details: {},
@@ -3965,7 +3988,7 @@ exports.schema = (0, exports.build_schema)({
3965
3988
  validator: validation_1.nonNegNumberValidator,
3966
3989
  examples: [100],
3967
3990
  required: true,
3968
- }, locationId: { validator: validation_1.mongoIdStringRequired }, locationIds: { validator: validation_1.listOfMongoIdStringValidatorOptionalOrEmptyOk }, type: { validator: validation_1.stringValidator100 }, description: { validator: validation_1.stringValidator5000 }, agreedToTerms: { validator: validation_1.appointmentTermsValidator }, meetingId: { validator: validation_1.mongoIdStringRequired, readonly: true }, bookingPageId: { validator: validation_1.mongoIdStringRequired }, meetingStatus: { validator: validation_1.meetingStatusValidator }, attachments: { validator: validation_1.listOfGenericAttachmentsValidator }, cancelledAt: { validator: validation_1.dateOptionalOrEmptyStringValidator }, rescheduledAt: { validator: validation_1.dateOptionalOrEmptyStringValidator }, noShowedAt: { validator: validation_1.dateOptionalOrEmptyStringValidator }, rescheduledTo: { validator: validation_1.mongoIdStringRequired }, chatRoomId: {
3991
+ }, locationId: { validator: validation_1.mongoIdStringRequired }, locationIds: { validator: validation_1.listOfMongoIdStringValidatorOptionalOrEmptyOk }, type: { validator: validation_1.stringValidator100 }, description: { validator: validation_1.stringValidator5000 }, agreedToTerms: { validator: validation_1.appointmentTermsValidator }, meetingId: { validator: validation_1.mongoIdStringRequired, readonly: true }, bookingPageId: { validator: validation_1.mongoIdStringRequired }, meetingStatus: { validator: validation_1.meetingStatusValidator }, videoCallAttendance: { validator: validation_1.listOfVideoCallParticipantEventsValidator, readonly: true }, attachments: { validator: validation_1.listOfGenericAttachmentsValidator }, cancelledAt: { validator: validation_1.dateOptionalOrEmptyStringValidator }, rescheduledAt: { validator: validation_1.dateOptionalOrEmptyStringValidator }, noShowedAt: { validator: validation_1.dateOptionalOrEmptyStringValidator }, rescheduledTo: { validator: validation_1.mongoIdStringRequired }, chatRoomId: {
3969
3992
  validator: validation_1.mongoIdStringRequired,
3970
3993
  dependencies: [{
3971
3994
  dependsOn: ['chat_rooms'],
@@ -4031,7 +4054,7 @@ exports.schema = (0, exports.build_schema)({
4031
4054
  defaultActions: constants_1.DEFAULT_OPERATIONS,
4032
4055
  customActions: {},
4033
4056
  enduserActions: { read: {}, readMany: {} },
4034
- fields: __assign(__assign({}, BuiltInFields), { dontSyncToElation: { validator: validation_1.booleanValidator }, sendIcsEmail: { validator: validation_1.booleanValidator }, createAndBookAthenaSlot: { validator: validation_1.booleanValidator }, athenaDepartmentId: { validator: validation_1.stringValidator1000 }, generateAthenaTelehealthLink: { validator: validation_1.booleanValidator }, athenaTypeId: { validator: validation_1.stringValidator1000 }, athenaBookingTypeId: { validator: validation_1.stringValidator1000 }, preventCancelMinutesInAdvance: { validator: validation_1.numberValidator }, preventRescheduleMinutesInAdvance: { validator: validation_1.numberValidator }, preventCancelInPortal: { validator: validation_1.booleanValidator }, preventRescheduleInPortal: { validator: validation_1.booleanValidator }, dontSyncToCanvas: { validator: validation_1.booleanValidator }, archivedAt: { validator: validation_1.dateOptionalOrEmptyStringValidator }, allowGroupReschedule: { validator: validation_1.booleanValidator }, dontAutoSyncPatientToHealthie: { validator: validation_1.booleanValidator }, title: {
4057
+ fields: __assign(__assign({}, BuiltInFields), { accessTags: { redactions: ['enduser'], validator: validation_1.listOfStringsValidatorEmptyOk }, dontSyncToElation: { validator: validation_1.booleanValidator }, sendIcsEmail: { validator: validation_1.booleanValidator }, createAndBookAthenaSlot: { validator: validation_1.booleanValidator }, athenaDepartmentId: { validator: validation_1.stringValidator1000 }, generateAthenaTelehealthLink: { validator: validation_1.booleanValidator }, athenaTypeId: { validator: validation_1.stringValidator1000 }, athenaBookingTypeId: { validator: validation_1.stringValidator1000 }, preventCancelMinutesInAdvance: { validator: validation_1.numberValidator }, preventRescheduleMinutesInAdvance: { validator: validation_1.numberValidator }, preventCancelInPortal: { validator: validation_1.booleanValidator }, preventRescheduleInPortal: { validator: validation_1.booleanValidator }, dontSyncToCanvas: { validator: validation_1.booleanValidator }, archivedAt: { validator: validation_1.dateOptionalOrEmptyStringValidator }, allowGroupReschedule: { validator: validation_1.booleanValidator }, dontAutoSyncPatientToHealthie: { validator: validation_1.booleanValidator }, title: {
4035
4058
  validator: validation_1.stringValidator250,
4036
4059
  required: true,
4037
4060
  examples: ["Text"],
@@ -4426,7 +4449,7 @@ exports.schema = (0, exports.build_schema)({
4426
4449
  create: {}, createMany: {}, read: {}, readMany: {},
4427
4450
  search: {},
4428
4451
  },
4429
- fields: __assign(__assign({}, BuiltInFields), { slug: { validator: validation_1.stringValidator250 }, title: {
4452
+ fields: __assign(__assign({}, BuiltInFields), { accessTags: { redactions: ['enduser'], validator: validation_1.listOfStringsValidatorEmptyOk }, slug: { validator: validation_1.stringValidator250 }, title: {
4430
4453
  validator: validation_1.stringValidator1000,
4431
4454
  required: true,
4432
4455
  examples: ["Template Name"],
@@ -4974,7 +4997,7 @@ exports.schema = (0, exports.build_schema)({
4974
4997
  validator: (0, validation_1.objectValidator)({
4975
4998
  type: validation_1.stringValidatorOptional,
4976
4999
  }),
4977
- }, onboardingStatus: { validator: validation_1.stringValidator100 }, creditCount: { validator: validation_1.numberValidator, readonly: true }, stripeKeyDetails: {
5000
+ }, onboardingStatus: { validator: validation_1.userPortalSettingsValidator }, creditCount: { validator: validation_1.numberValidator, readonly: true }, stripeKeyDetails: {
4978
5001
  validator: (0, validation_1.listValidatorOptionalOrEmptyOk)((0, validation_1.objectValidator)({
4979
5002
  key: validation_1.stringValidator5000EmptyOkay,
4980
5003
  title: validation_1.stringValidator5000EmptyOkay,
@@ -5251,7 +5274,10 @@ exports.schema = (0, exports.build_schema)({
5251
5274
  }
5252
5275
  },
5253
5276
  ]
5254
- }, uiRestrictions: { validator: validation_1.userUIRestrictionsValidator }, fieldRedactions: { validator: validation_1.userFieldRedactionsValidator } })
5277
+ }, uiRestrictions: { validator: validation_1.userUIRestrictionsValidator }, fieldRedactions: { validator: validation_1.userFieldRedactionsValidator }, portalSchemaRestrictions: {
5278
+ validator: validation_1.portalSchemaRestrictionsValidator,
5279
+ initializer: function () { return ({ disableEditContent: true, disableEditTheming: true, disableEditSnippets: true }); },
5280
+ }, color: { validator: validation_1.stringValidator1000 }, description: { validator: validation_1.stringValidator1000Optional } })
5255
5281
  },
5256
5282
  appointment_booking_pages: {
5257
5283
  info: {},
@@ -5293,7 +5319,7 @@ exports.schema = (0, exports.build_schema)({
5293
5319
  enduserActions: {
5294
5320
  read: {}, readMany: {}, validate_access_token: {},
5295
5321
  },
5296
- fields: __assign(__assign({}, BuiltInFields), { dontRestrictRescheduleToOriginalHost: { validator: validation_1.booleanValidator }, gtmTag: { validator: validation_1.stringValidator100EscapeHTML }, archivedAt: { validator: validation_1.dateOptionalOrEmptyStringValidator }, title: {
5322
+ fields: __assign(__assign({}, BuiltInFields), { accessTags: { redactions: ['enduser'], validator: validation_1.listOfStringsValidatorEmptyOk }, dontRestrictRescheduleToOriginalHost: { validator: validation_1.booleanValidator }, gtmTag: { validator: validation_1.stringValidator100EscapeHTML }, archivedAt: { validator: validation_1.dateOptionalOrEmptyStringValidator }, title: {
5297
5323
  validator: validation_1.stringValidator100,
5298
5324
  required: true,
5299
5325
  examples: ["Appointment Booking Title"]
@@ -5915,7 +5941,7 @@ exports.schema = (0, exports.build_schema)({
5915
5941
  },
5916
5942
  },
5917
5943
  enduserActions: {},
5918
- fields: __assign(__assign({}, BuiltInFields), { title: {
5944
+ fields: __assign(__assign({}, BuiltInFields), { accessTags: { redactions: ['enduser'], validator: validation_1.listOfStringsValidatorEmptyOk }, title: {
5919
5945
  validator: validation_1.stringValidator100,
5920
5946
  required: true,
5921
5947
  examples: ["Automation Trigger"]
@@ -6191,7 +6217,7 @@ exports.schema = (0, exports.build_schema)({
6191
6217
  defaultActions: constants_1.DEFAULT_OPERATIONS,
6192
6218
  customActions: {},
6193
6219
  enduserActions: {},
6194
- fields: __assign(__assign({}, BuiltInFields), { title: {
6220
+ fields: __assign(__assign({}, BuiltInFields), { accessTags: { redactions: ['enduser'], validator: validation_1.listOfStringsValidatorEmptyOk }, title: {
6195
6221
  validator: validation_1.stringValidator,
6196
6222
  required: true,
6197
6223
  examples: ["Title"]
@@ -6331,18 +6357,34 @@ exports.schema = (0, exports.build_schema)({
6331
6357
  }
6332
6358
  },
6333
6359
  {
6334
- explanation: "Locked time tracks only allow review field updates",
6335
- evaluate: function (_v, _deps, _session, method, _a) {
6360
+ explanation: "Locked time tracks only allow review field updates, or owner resubmission of rejected entries",
6361
+ evaluate: function (_v, _deps, session, method, _a) {
6336
6362
  var original = _a.original, updates = _a.updates;
6337
6363
  if (method !== 'update')
6338
6364
  return;
6339
6365
  var orig = original;
6340
6366
  if (!(orig === null || orig === void 0 ? void 0 : orig.lockedAt))
6341
6367
  return;
6368
+ var u = updates;
6342
6369
  var reviewFields = ['reviewedAt', 'reviewedByUserId', 'reviewApproved', 'reviewNote'];
6343
6370
  var nonReviewFields = Object.keys(updates || {}).filter(function (k) { return !reviewFields.includes(k); });
6344
- if (nonReviewFields.length > 0)
6345
- return "Time track is locked. Only review fields (".concat(reviewFields.join(', '), ") can be updated.");
6371
+ if (nonReviewFields.length === 0)
6372
+ return; // pure review update unchanged behavior
6373
+ var isRejected = !!orig.reviewedAt && orig.reviewApproved === false;
6374
+ var resubmitFields = __spreadArray(__spreadArray([], reviewFields, true), [
6375
+ 'correctedAt', 'correctedByUserId', 'correctionNote',
6376
+ 'originalTotalDurationInMS', 'totalDurationInMS',
6377
+ 'lockedAt', 'lockedByUserId',
6378
+ ], false);
6379
+ var disallowed = Object.keys(updates || {}).filter(function (k) { return !resubmitFields.includes(k); });
6380
+ if (isRejected && session.id === orig.userId && disallowed.length === 0) {
6381
+ if ((u === null || u === void 0 ? void 0 : u.reviewedAt) !== '')
6382
+ return "Resubmitting a rejected time track requires clearing reviewedAt (set to '')";
6383
+ if ((u === null || u === void 0 ? void 0 : u.reviewApproved) === true)
6384
+ return "Cannot approve your own time track during resubmission";
6385
+ return; // valid resubmit — entry returns to Pending
6386
+ }
6387
+ return "Time track is locked. Only review fields (".concat(reviewFields.join(', '), ") can be updated.");
6346
6388
  }
6347
6389
  },
6348
6390
  {
@@ -6417,7 +6459,20 @@ exports.schema = (0, exports.build_schema)({
6417
6459
  type: validation_1.stringValidator,
6418
6460
  id: validation_1.stringValidator,
6419
6461
  }, { isOptional: true, emptyOk: true }),
6420
- }, isHistorical: { validator: validation_1.booleanValidatorOptional, updatesDisabled: true }, correctedAt: { validator: validation_1.dateValidatorOptional }, correctedByUserId: { validator: validation_1.mongoIdStringOptional }, correctionNote: { validator: validation_1.stringValidator1000Optional }, originalTotalDurationInMS: { validator: validation_1.numberValidatorOptional }, reviewedAt: { validator: validation_1.dateValidatorOptional }, reviewedByUserId: { validator: validation_1.mongoIdStringOptional }, reviewApproved: { validator: validation_1.booleanValidatorOptional }, reviewNote: { validator: validation_1.stringValidator1000Optional }, lockedAt: { validator: validation_1.dateValidatorOptional }, lockedByUserId: { validator: validation_1.mongoIdStringOptional } }),
6462
+ }, isHistorical: { validator: validation_1.booleanValidatorOptional, updatesDisabled: true }, correctedAt: { validator: validation_1.dateValidatorOptional }, correctedByUserId: { validator: validation_1.mongoIdStringOptional }, correctionNote: { validator: validation_1.stringValidator1000Optional }, originalTotalDurationInMS: { validator: validation_1.numberValidatorOptional }, reviewedAt: { validator: validation_1.dateValidatorOptional }, reviewedByUserId: { validator: validation_1.mongoIdStringOptional }, reviewApproved: { validator: validation_1.booleanValidatorOptional }, reviewNote: { validator: validation_1.stringValidator1000Optional }, lockedAt: { validator: validation_1.dateValidatorOptional }, lockedByUserId: { validator: validation_1.mongoIdStringOptional },
6463
+ // server-appended on resubmission of a rejected entry (see routing.ts update handler)
6464
+ // note: reviewApproved remains false after resubmit (booleans can't be cleared to '') — status logic must key off reviewedAt
6465
+ reviewHistory: {
6466
+ validator: (0, validation_1.listValidatorOptionalOrEmptyOk)((0, validation_1.objectValidator)({
6467
+ reviewedAt: validation_1.dateValidator,
6468
+ reviewedByUserId: validation_1.mongoIdStringOptional,
6469
+ reviewApproved: validation_1.booleanValidatorOptional,
6470
+ reviewNote: validation_1.stringValidator1000Optional,
6471
+ resubmittedAt: validation_1.dateValidatorOptional,
6472
+ resubmittedByUserId: validation_1.mongoIdStringOptional,
6473
+ })),
6474
+ readonly: true, // server-appended only — clients can read, never write
6475
+ } }),
6421
6476
  },
6422
6477
  ticket_queues: {
6423
6478
  info: {},
@@ -6845,7 +6900,7 @@ exports.schema = (0, exports.build_schema)({
6845
6900
  defaultActions: { read: {}, readMany: {} },
6846
6901
  customActions: {},
6847
6902
  enduserActions: {},
6848
- fields: __assign(__assign({}, BuiltInFields), { integration: { validator: validation_1.stringValidator, readonly: true, examples: ['Canvas'] }, status: { validator: (0, validation_1.exactMatchValidator)(['Success', 'Error']), readonly: true, examples: ['Error'] }, type: { validator: validation_1.stringValidator, readonly: true, examples: ['Patient Create'] }, payload: { validator: validation_1.stringValidator, readonly: true, examples: ['{}'] }, response: { validator: validation_1.stringValidator, readonly: true, examples: ['{}'] }, url: { validator: validation_1.stringValidator, readonly: true, examples: ['https://www.tellescope.com'] }, enduserId: { validator: validation_1.mongoIdStringRequired, readonly: true } })
6903
+ fields: __assign(__assign({}, BuiltInFields), { integration: { validator: validation_1.stringValidator, readonly: true, examples: ['Canvas'] }, status: { validator: (0, validation_1.exactMatchValidator)(['Success', 'Error', 'Info']), readonly: true, examples: ['Error'] }, type: { validator: validation_1.stringValidator, readonly: true, examples: ['Patient Create'] }, payload: { validator: validation_1.stringValidator, readonly: true, examples: ['{}'] }, response: { validator: validation_1.stringValidator, readonly: true, examples: ['{}'] }, url: { validator: validation_1.stringValidator, readonly: true, examples: ['https://www.tellescope.com'] }, enduserId: { validator: validation_1.mongoIdStringRequired, readonly: true } })
6849
6904
  },
6850
6905
  organization_payments: {
6851
6906
  info: { description: 'Read Only - Organization Payment Transaction Logs' },