@oneuptime/common 9.3.22 → 9.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/Models/DatabaseModels/IncomingCallLog.ts +521 -0
  2. package/Models/DatabaseModels/IncomingCallLogItem.ts +463 -0
  3. package/Models/DatabaseModels/IncomingCallPolicy.ts +811 -0
  4. package/Models/DatabaseModels/IncomingCallPolicyEscalationRule.ts +597 -0
  5. package/Models/DatabaseModels/Index.ts +18 -0
  6. package/Models/DatabaseModels/ProjectSCIMLog.ts +422 -0
  7. package/Models/DatabaseModels/StatusPageSCIMLog.ts +455 -0
  8. package/Models/DatabaseModels/User.ts +0 -15
  9. package/Models/DatabaseModels/UserIncomingCallNumber.ts +296 -0
  10. package/Server/API/UserIncomingCallNumberAPI.ts +128 -0
  11. package/Server/Infrastructure/Postgres/SchemaMigrations/1768583966447-MigrationName.ts +121 -0
  12. package/Server/Infrastructure/Postgres/SchemaMigrations/1768647802022-RemoveAlertPhoneNumberFromUser.ts +22 -0
  13. package/Server/Infrastructure/Postgres/SchemaMigrations/1768649699509-MigrationName.ts +787 -0
  14. package/Server/Infrastructure/Postgres/SchemaMigrations/1768682071562-MigrationName.ts +29 -0
  15. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
  16. package/Server/Services/IncomingCallLogItemService.ts +10 -0
  17. package/Server/Services/IncomingCallLogService.ts +10 -0
  18. package/Server/Services/IncomingCallPolicyEscalationRuleService.ts +267 -0
  19. package/Server/Services/IncomingCallPolicyService.ts +10 -0
  20. package/Server/Services/Index.ts +7 -0
  21. package/Server/Services/ProjectSCIMLogService.ts +11 -0
  22. package/Server/Services/StatusPageSCIMLogService.ts +11 -0
  23. package/Server/Services/UserCallService.ts +31 -0
  24. package/Server/Services/UserIncomingCallNumberService.ts +258 -0
  25. package/Server/Services/UserSmsService.ts +31 -0
  26. package/Server/Utils/StartServer.ts +5 -0
  27. package/Types/Call/CallProvider.ts +99 -0
  28. package/Types/Call/CallProviderType.ts +6 -0
  29. package/Types/Icon/IconProp.ts +1 -0
  30. package/Types/IncomingCall/IncomingCallStatus.ts +13 -0
  31. package/Types/Permission.ts +126 -0
  32. package/Types/Phone.ts +53 -4
  33. package/Types/SCIM/SCIMLogStatus.ts +7 -0
  34. package/UI/Components/Diagram/ConceptCards.tsx +74 -0
  35. package/UI/Components/Diagram/HorizontalStepChain.tsx +92 -0
  36. package/UI/Components/Diagram/Index.ts +11 -0
  37. package/UI/Components/Diagram/NumberedSteps.tsx +77 -0
  38. package/UI/Components/Diagram/VerticalFlowSteps.tsx +59 -0
  39. package/UI/Components/Icon/Icon.tsx +10 -0
  40. package/UI/Components/SimpleLogViewer/SimpleLogViewer.tsx +86 -2
  41. package/build/dist/Models/DatabaseModels/IncomingCallLog.js +565 -0
  42. package/build/dist/Models/DatabaseModels/IncomingCallLog.js.map +1 -0
  43. package/build/dist/Models/DatabaseModels/IncomingCallLogItem.js +497 -0
  44. package/build/dist/Models/DatabaseModels/IncomingCallLogItem.js.map +1 -0
  45. package/build/dist/Models/DatabaseModels/IncomingCallPolicy.js +840 -0
  46. package/build/dist/Models/DatabaseModels/IncomingCallPolicy.js.map +1 -0
  47. package/build/dist/Models/DatabaseModels/IncomingCallPolicyEscalationRule.js +619 -0
  48. package/build/dist/Models/DatabaseModels/IncomingCallPolicyEscalationRule.js.map +1 -0
  49. package/build/dist/Models/DatabaseModels/Index.js +16 -0
  50. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  51. package/build/dist/Models/DatabaseModels/ProjectSCIMLog.js +455 -0
  52. package/build/dist/Models/DatabaseModels/ProjectSCIMLog.js.map +1 -0
  53. package/build/dist/Models/DatabaseModels/StatusPageSCIMLog.js +486 -0
  54. package/build/dist/Models/DatabaseModels/StatusPageSCIMLog.js.map +1 -0
  55. package/build/dist/Models/DatabaseModels/User.js +0 -16
  56. package/build/dist/Models/DatabaseModels/User.js.map +1 -1
  57. package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js +315 -0
  58. package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js.map +1 -0
  59. package/build/dist/Server/API/UserIncomingCallNumberAPI.js +72 -0
  60. package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -0
  61. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1768583966447-MigrationName.js +48 -0
  62. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1768583966447-MigrationName.js.map +1 -0
  63. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1768647802022-RemoveAlertPhoneNumberFromUser.js +34 -0
  64. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1768647802022-RemoveAlertPhoneNumberFromUser.js.map +1 -0
  65. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1768649699509-MigrationName.js +270 -0
  66. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1768649699509-MigrationName.js.map +1 -0
  67. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1768682071562-MigrationName.js +16 -0
  68. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1768682071562-MigrationName.js.map +1 -0
  69. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
  70. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  71. package/build/dist/Server/Services/IncomingCallLogItemService.js +9 -0
  72. package/build/dist/Server/Services/IncomingCallLogItemService.js.map +1 -0
  73. package/build/dist/Server/Services/IncomingCallLogService.js +9 -0
  74. package/build/dist/Server/Services/IncomingCallLogService.js.map +1 -0
  75. package/build/dist/Server/Services/IncomingCallPolicyEscalationRuleService.js +197 -0
  76. package/build/dist/Server/Services/IncomingCallPolicyEscalationRuleService.js.map +1 -0
  77. package/build/dist/Server/Services/IncomingCallPolicyService.js +9 -0
  78. package/build/dist/Server/Services/IncomingCallPolicyService.js.map +1 -0
  79. package/build/dist/Server/Services/Index.js +6 -0
  80. package/build/dist/Server/Services/Index.js.map +1 -1
  81. package/build/dist/Server/Services/ProjectSCIMLogService.js +10 -0
  82. package/build/dist/Server/Services/ProjectSCIMLogService.js.map +1 -0
  83. package/build/dist/Server/Services/StatusPageSCIMLogService.js +10 -0
  84. package/build/dist/Server/Services/StatusPageSCIMLogService.js.map +1 -0
  85. package/build/dist/Server/Services/UserCallService.js +21 -0
  86. package/build/dist/Server/Services/UserCallService.js.map +1 -1
  87. package/build/dist/Server/Services/UserIncomingCallNumberService.js +225 -0
  88. package/build/dist/Server/Services/UserIncomingCallNumberService.js.map +1 -0
  89. package/build/dist/Server/Services/UserSmsService.js +21 -0
  90. package/build/dist/Server/Services/UserSmsService.js.map +1 -1
  91. package/build/dist/Server/Utils/StartServer.js +5 -0
  92. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  93. package/build/dist/Types/Call/CallProvider.js +2 -0
  94. package/build/dist/Types/Call/CallProvider.js.map +1 -0
  95. package/build/dist/Types/Call/CallProviderType.js +7 -0
  96. package/build/dist/Types/Call/CallProviderType.js.map +1 -0
  97. package/build/dist/Types/Icon/IconProp.js +1 -0
  98. package/build/dist/Types/Icon/IconProp.js.map +1 -1
  99. package/build/dist/Types/IncomingCall/IncomingCallStatus.js +14 -0
  100. package/build/dist/Types/IncomingCall/IncomingCallStatus.js.map +1 -0
  101. package/build/dist/Types/Permission.js +104 -0
  102. package/build/dist/Types/Permission.js.map +1 -1
  103. package/build/dist/Types/Phone.js +47 -3
  104. package/build/dist/Types/Phone.js.map +1 -1
  105. package/build/dist/Types/SCIM/SCIMLogStatus.js +8 -0
  106. package/build/dist/Types/SCIM/SCIMLogStatus.js.map +1 -0
  107. package/build/dist/UI/Components/Diagram/ConceptCards.js +30 -0
  108. package/build/dist/UI/Components/Diagram/ConceptCards.js.map +1 -0
  109. package/build/dist/UI/Components/Diagram/HorizontalStepChain.js +30 -0
  110. package/build/dist/UI/Components/Diagram/HorizontalStepChain.js.map +1 -0
  111. package/build/dist/UI/Components/Diagram/Index.js +5 -0
  112. package/build/dist/UI/Components/Diagram/Index.js.map +1 -0
  113. package/build/dist/UI/Components/Diagram/NumberedSteps.js +18 -0
  114. package/build/dist/UI/Components/Diagram/NumberedSteps.js.map +1 -0
  115. package/build/dist/UI/Components/Diagram/VerticalFlowSteps.js +16 -0
  116. package/build/dist/UI/Components/Diagram/VerticalFlowSteps.js.map +1 -0
  117. package/build/dist/UI/Components/Icon/Icon.js +4 -0
  118. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  119. package/build/dist/UI/Components/SimpleLogViewer/SimpleLogViewer.js +30 -1
  120. package/build/dist/UI/Components/SimpleLogViewer/SimpleLogViewer.js.map +1 -1
  121. package/package.json +1 -1
@@ -0,0 +1,811 @@
1
+ import Label from "./Label";
2
+ import Project from "./Project";
3
+ import ProjectCallSMSConfig from "./ProjectCallSMSConfig";
4
+ import User from "./User";
5
+ import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
6
+ import Route from "../../Types/API/Route";
7
+ import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
8
+ import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
9
+ import AccessControlColumn from "../../Types/Database/AccessControlColumn";
10
+ import ColumnLength from "../../Types/Database/ColumnLength";
11
+ import ColumnType from "../../Types/Database/ColumnType";
12
+ import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
13
+ import EnableDocumentation from "../../Types/Database/EnableDocumentation";
14
+ import SlugifyColumn from "../../Types/Database/SlugifyColumn";
15
+ import TableColumn from "../../Types/Database/TableColumn";
16
+ import TableColumnType from "../../Types/Database/TableColumnType";
17
+ import TableMetadata from "../../Types/Database/TableMetadata";
18
+ import TenantColumn from "../../Types/Database/TenantColumn";
19
+ import IconProp from "../../Types/Icon/IconProp";
20
+ import ObjectID from "../../Types/ObjectID";
21
+ import Permission from "../../Types/Permission";
22
+ import Phone from "../../Types/Phone";
23
+ import {
24
+ Column,
25
+ Entity,
26
+ Index,
27
+ JoinColumn,
28
+ JoinTable,
29
+ ManyToMany,
30
+ ManyToOne,
31
+ } from "typeorm";
32
+ import EnableWorkflow from "../../Types/Database/EnableWorkflow";
33
+
34
+ @EnableDocumentation()
35
+ @AccessControlColumn("labels")
36
+ @TenantColumn("projectId")
37
+ @EnableWorkflow({
38
+ create: true,
39
+ delete: true,
40
+ update: true,
41
+ read: true,
42
+ })
43
+ @TableAccessControl({
44
+ create: [
45
+ Permission.ProjectOwner,
46
+ Permission.ProjectAdmin,
47
+ Permission.ProjectMember,
48
+ Permission.CreateProjectIncomingCallPolicy,
49
+ ],
50
+ read: [
51
+ Permission.ProjectOwner,
52
+ Permission.ProjectAdmin,
53
+ Permission.ProjectMember,
54
+ Permission.ReadProjectIncomingCallPolicy,
55
+ ],
56
+ delete: [
57
+ Permission.ProjectOwner,
58
+ Permission.ProjectAdmin,
59
+ Permission.ProjectMember,
60
+ Permission.DeleteProjectIncomingCallPolicy,
61
+ ],
62
+ update: [
63
+ Permission.ProjectOwner,
64
+ Permission.ProjectAdmin,
65
+ Permission.ProjectMember,
66
+ Permission.EditProjectIncomingCallPolicy,
67
+ ],
68
+ })
69
+ @CrudApiEndpoint(new Route("/incoming-call-policy"))
70
+ @SlugifyColumn("name", "slug")
71
+ @Entity({
72
+ name: "IncomingCallPolicy",
73
+ })
74
+ @TableMetadata({
75
+ tableName: "IncomingCallPolicy",
76
+ singularName: "Incoming Call Policy",
77
+ pluralName: "Incoming Call Policies",
78
+ icon: IconProp.Call,
79
+ tableDescription:
80
+ "Manage incoming call routing policies with escalation rules for on-call teams",
81
+ })
82
+ export default class IncomingCallPolicy extends BaseModel {
83
+ @ColumnAccessControl({
84
+ create: [
85
+ Permission.ProjectOwner,
86
+ Permission.ProjectAdmin,
87
+ Permission.ProjectMember,
88
+ Permission.CreateProjectIncomingCallPolicy,
89
+ ],
90
+ read: [
91
+ Permission.ProjectOwner,
92
+ Permission.ProjectAdmin,
93
+ Permission.ProjectMember,
94
+ Permission.ReadProjectIncomingCallPolicy,
95
+ ],
96
+ update: [],
97
+ })
98
+ @TableColumn({
99
+ manyToOneRelationColumn: "projectId",
100
+ type: TableColumnType.Entity,
101
+ modelType: Project,
102
+ title: "Project",
103
+ description: "Relation to Project Resource in which this object belongs",
104
+ })
105
+ @ManyToOne(
106
+ () => {
107
+ return Project;
108
+ },
109
+ {
110
+ eager: false,
111
+ nullable: true,
112
+ onDelete: "CASCADE",
113
+ orphanedRowAction: "nullify",
114
+ },
115
+ )
116
+ @JoinColumn({ name: "projectId" })
117
+ public project?: Project = undefined;
118
+
119
+ @ColumnAccessControl({
120
+ create: [
121
+ Permission.ProjectOwner,
122
+ Permission.ProjectAdmin,
123
+ Permission.ProjectMember,
124
+ Permission.CreateProjectIncomingCallPolicy,
125
+ ],
126
+ read: [
127
+ Permission.ProjectOwner,
128
+ Permission.ProjectAdmin,
129
+ Permission.ProjectMember,
130
+ Permission.ReadProjectIncomingCallPolicy,
131
+ ],
132
+ update: [],
133
+ })
134
+ @Index()
135
+ @TableColumn({
136
+ type: TableColumnType.ObjectID,
137
+ required: true,
138
+ canReadOnRelationQuery: true,
139
+ title: "Project ID",
140
+ description: "ID of your OneUptime Project in which this object belongs",
141
+ })
142
+ @Column({
143
+ type: ColumnType.ObjectID,
144
+ nullable: false,
145
+ transformer: ObjectID.getDatabaseTransformer(),
146
+ })
147
+ public projectId?: ObjectID = undefined;
148
+
149
+ @ColumnAccessControl({
150
+ create: [
151
+ Permission.ProjectOwner,
152
+ Permission.ProjectAdmin,
153
+ Permission.ProjectMember,
154
+ Permission.CreateProjectIncomingCallPolicy,
155
+ ],
156
+ read: [
157
+ Permission.ProjectOwner,
158
+ Permission.ProjectAdmin,
159
+ Permission.ProjectMember,
160
+ Permission.ReadProjectIncomingCallPolicy,
161
+ ],
162
+ update: [
163
+ Permission.ProjectOwner,
164
+ Permission.ProjectAdmin,
165
+ Permission.ProjectMember,
166
+ Permission.EditProjectIncomingCallPolicy,
167
+ ],
168
+ })
169
+ @Index()
170
+ @TableColumn({
171
+ required: true,
172
+ type: TableColumnType.ShortText,
173
+ title: "Name",
174
+ description: "Any friendly name of this policy",
175
+ canReadOnRelationQuery: true,
176
+ })
177
+ @Column({
178
+ nullable: false,
179
+ type: ColumnType.ShortText,
180
+ length: ColumnLength.ShortText,
181
+ })
182
+ public name?: string = undefined;
183
+
184
+ @ColumnAccessControl({
185
+ create: [
186
+ Permission.ProjectOwner,
187
+ Permission.ProjectAdmin,
188
+ Permission.ProjectMember,
189
+ Permission.CreateProjectIncomingCallPolicy,
190
+ ],
191
+ read: [
192
+ Permission.ProjectOwner,
193
+ Permission.ProjectAdmin,
194
+ Permission.ProjectMember,
195
+ Permission.ReadProjectIncomingCallPolicy,
196
+ ],
197
+ update: [
198
+ Permission.ProjectOwner,
199
+ Permission.ProjectAdmin,
200
+ Permission.ProjectMember,
201
+ Permission.EditProjectIncomingCallPolicy,
202
+ ],
203
+ })
204
+ @TableColumn({
205
+ required: false,
206
+ type: TableColumnType.LongText,
207
+ title: "Description",
208
+ description: "Friendly description that will help you remember",
209
+ })
210
+ @Column({
211
+ nullable: true,
212
+ type: ColumnType.LongText,
213
+ length: ColumnLength.LongText,
214
+ })
215
+ public description?: string = undefined;
216
+
217
+ @Index()
218
+ @ColumnAccessControl({
219
+ create: [
220
+ Permission.ProjectOwner,
221
+ Permission.ProjectAdmin,
222
+ Permission.ProjectMember,
223
+ Permission.CreateProjectIncomingCallPolicy,
224
+ ],
225
+ read: [
226
+ Permission.ProjectOwner,
227
+ Permission.ProjectAdmin,
228
+ Permission.ProjectMember,
229
+ Permission.ReadProjectIncomingCallPolicy,
230
+ ],
231
+ update: [],
232
+ })
233
+ @TableColumn({
234
+ required: true,
235
+ unique: true,
236
+ type: TableColumnType.Slug,
237
+ title: "Slug",
238
+ description: "Friendly globally unique name for your object",
239
+ computed: true,
240
+ })
241
+ @Column({
242
+ nullable: false,
243
+ type: ColumnType.Slug,
244
+ length: ColumnLength.Slug,
245
+ unique: true,
246
+ })
247
+ public slug?: string = undefined;
248
+
249
+ @ColumnAccessControl({
250
+ create: [],
251
+ read: [
252
+ Permission.ProjectOwner,
253
+ Permission.ProjectAdmin,
254
+ Permission.ProjectMember,
255
+ Permission.ReadProjectIncomingCallPolicy,
256
+ ],
257
+ update: [],
258
+ })
259
+ @Index()
260
+ @TableColumn({
261
+ required: false,
262
+ type: TableColumnType.Phone,
263
+ title: "Routing Phone Number",
264
+ description: "The phone number for incoming calls to this policy",
265
+ })
266
+ @Column({
267
+ nullable: true,
268
+ type: ColumnType.Phone,
269
+ length: ColumnLength.Phone,
270
+ transformer: Phone.getDatabaseTransformer(),
271
+ })
272
+ public routingPhoneNumber?: Phone = undefined;
273
+
274
+ @ColumnAccessControl({
275
+ create: [],
276
+ read: [
277
+ Permission.ProjectOwner,
278
+ Permission.ProjectAdmin,
279
+ Permission.ProjectMember,
280
+ Permission.ReadProjectIncomingCallPolicy,
281
+ ],
282
+ update: [],
283
+ })
284
+ @TableColumn({
285
+ required: false,
286
+ type: TableColumnType.ShortText,
287
+ title: "Call Provider Phone Number ID",
288
+ description:
289
+ "The call provider's ID for the phone number (e.g., Twilio SID)",
290
+ })
291
+ @Column({
292
+ nullable: true,
293
+ type: ColumnType.ShortText,
294
+ length: ColumnLength.ShortText,
295
+ })
296
+ public callProviderPhoneNumberId?: string = undefined;
297
+
298
+ @ColumnAccessControl({
299
+ create: [],
300
+ read: [
301
+ Permission.ProjectOwner,
302
+ Permission.ProjectAdmin,
303
+ Permission.ProjectMember,
304
+ Permission.ReadProjectIncomingCallPolicy,
305
+ ],
306
+ update: [],
307
+ })
308
+ @TableColumn({
309
+ required: false,
310
+ type: TableColumnType.ShortText,
311
+ title: "Phone Number Country Code",
312
+ description: "Country code of the phone number (US, GB, etc.)",
313
+ })
314
+ @Column({
315
+ nullable: true,
316
+ type: ColumnType.ShortText,
317
+ length: ColumnLength.ShortText,
318
+ })
319
+ public phoneNumberCountryCode?: string = undefined;
320
+
321
+ @ColumnAccessControl({
322
+ create: [],
323
+ read: [
324
+ Permission.ProjectOwner,
325
+ Permission.ProjectAdmin,
326
+ Permission.ProjectMember,
327
+ Permission.ReadProjectIncomingCallPolicy,
328
+ ],
329
+ update: [],
330
+ })
331
+ @TableColumn({
332
+ required: false,
333
+ type: TableColumnType.ShortText,
334
+ title: "Phone Number Area Code",
335
+ description: "Area code of the phone number",
336
+ })
337
+ @Column({
338
+ nullable: true,
339
+ type: ColumnType.ShortText,
340
+ length: ColumnLength.ShortText,
341
+ })
342
+ public phoneNumberAreaCode?: string = undefined;
343
+
344
+ @ColumnAccessControl({
345
+ create: [],
346
+ read: [
347
+ Permission.ProjectOwner,
348
+ Permission.ProjectAdmin,
349
+ Permission.ProjectMember,
350
+ Permission.ReadProjectIncomingCallPolicy,
351
+ ],
352
+ update: [],
353
+ })
354
+ @TableColumn({
355
+ required: false,
356
+ type: TableColumnType.Date,
357
+ title: "Phone Number Purchased At",
358
+ description: "When the phone number was purchased",
359
+ })
360
+ @Column({
361
+ nullable: true,
362
+ type: ColumnType.Date,
363
+ })
364
+ public phoneNumberPurchasedAt?: Date = undefined;
365
+
366
+ @ColumnAccessControl({
367
+ create: [
368
+ Permission.ProjectOwner,
369
+ Permission.ProjectAdmin,
370
+ Permission.ProjectMember,
371
+ Permission.CreateProjectIncomingCallPolicy,
372
+ ],
373
+ read: [
374
+ Permission.ProjectOwner,
375
+ Permission.ProjectAdmin,
376
+ Permission.ProjectMember,
377
+ Permission.ReadProjectIncomingCallPolicy,
378
+ ],
379
+ update: [
380
+ Permission.ProjectOwner,
381
+ Permission.ProjectAdmin,
382
+ Permission.ProjectMember,
383
+ Permission.EditProjectIncomingCallPolicy,
384
+ ],
385
+ })
386
+ @TableColumn({
387
+ required: false,
388
+ type: TableColumnType.LongText,
389
+ title: "Greeting Message",
390
+ description: "Custom TTS greeting message for incoming calls",
391
+ })
392
+ @Column({
393
+ nullable: true,
394
+ type: ColumnType.LongText,
395
+ length: ColumnLength.LongText,
396
+ default: "Please wait while we connect you to the on-call engineer.",
397
+ })
398
+ public greetingMessage?: string = undefined;
399
+
400
+ @ColumnAccessControl({
401
+ create: [
402
+ Permission.ProjectOwner,
403
+ Permission.ProjectAdmin,
404
+ Permission.ProjectMember,
405
+ Permission.CreateProjectIncomingCallPolicy,
406
+ ],
407
+ read: [
408
+ Permission.ProjectOwner,
409
+ Permission.ProjectAdmin,
410
+ Permission.ProjectMember,
411
+ Permission.ReadProjectIncomingCallPolicy,
412
+ ],
413
+ update: [
414
+ Permission.ProjectOwner,
415
+ Permission.ProjectAdmin,
416
+ Permission.ProjectMember,
417
+ Permission.EditProjectIncomingCallPolicy,
418
+ ],
419
+ })
420
+ @TableColumn({
421
+ required: false,
422
+ type: TableColumnType.LongText,
423
+ title: "No Answer Message",
424
+ description: "Message when escalation is exhausted and no one answers",
425
+ })
426
+ @Column({
427
+ nullable: true,
428
+ type: ColumnType.LongText,
429
+ length: ColumnLength.LongText,
430
+ default: "No one is available. Please try again later.",
431
+ })
432
+ public noAnswerMessage?: string = undefined;
433
+
434
+ @ColumnAccessControl({
435
+ create: [
436
+ Permission.ProjectOwner,
437
+ Permission.ProjectAdmin,
438
+ Permission.ProjectMember,
439
+ Permission.CreateProjectIncomingCallPolicy,
440
+ ],
441
+ read: [
442
+ Permission.ProjectOwner,
443
+ Permission.ProjectAdmin,
444
+ Permission.ProjectMember,
445
+ Permission.ReadProjectIncomingCallPolicy,
446
+ ],
447
+ update: [
448
+ Permission.ProjectOwner,
449
+ Permission.ProjectAdmin,
450
+ Permission.ProjectMember,
451
+ Permission.EditProjectIncomingCallPolicy,
452
+ ],
453
+ })
454
+ @TableColumn({
455
+ required: false,
456
+ type: TableColumnType.LongText,
457
+ title: "No One Available Message",
458
+ description: "Message when no one is on-call or reachable",
459
+ })
460
+ @Column({
461
+ nullable: true,
462
+ type: ColumnType.LongText,
463
+ length: ColumnLength.LongText,
464
+ default:
465
+ "We are sorry, but no on-call engineer is currently available. Please try again later or contact support.",
466
+ })
467
+ public noOneAvailableMessage?: string = undefined;
468
+
469
+ @ColumnAccessControl({
470
+ create: [
471
+ Permission.ProjectOwner,
472
+ Permission.ProjectAdmin,
473
+ Permission.ProjectMember,
474
+ Permission.CreateProjectIncomingCallPolicy,
475
+ ],
476
+ read: [
477
+ Permission.ProjectOwner,
478
+ Permission.ProjectAdmin,
479
+ Permission.ProjectMember,
480
+ Permission.ReadProjectIncomingCallPolicy,
481
+ ],
482
+ update: [
483
+ Permission.ProjectOwner,
484
+ Permission.ProjectAdmin,
485
+ Permission.ProjectMember,
486
+ Permission.EditProjectIncomingCallPolicy,
487
+ ],
488
+ })
489
+ @TableColumn({
490
+ required: true,
491
+ isDefaultValueColumn: true,
492
+ type: TableColumnType.Boolean,
493
+ title: "Is Enabled",
494
+ description: "Enable or disable this incoming call policy",
495
+ defaultValue: true,
496
+ })
497
+ @Column({
498
+ nullable: false,
499
+ default: true,
500
+ type: ColumnType.Boolean,
501
+ })
502
+ public isEnabled?: boolean = undefined;
503
+
504
+ @ColumnAccessControl({
505
+ create: [
506
+ Permission.ProjectOwner,
507
+ Permission.ProjectAdmin,
508
+ Permission.ProjectMember,
509
+ Permission.CreateProjectIncomingCallPolicy,
510
+ ],
511
+ read: [
512
+ Permission.ProjectOwner,
513
+ Permission.ProjectAdmin,
514
+ Permission.ProjectMember,
515
+ Permission.ReadProjectIncomingCallPolicy,
516
+ ],
517
+ update: [
518
+ Permission.ProjectOwner,
519
+ Permission.ProjectAdmin,
520
+ Permission.ProjectMember,
521
+ Permission.EditProjectIncomingCallPolicy,
522
+ ],
523
+ })
524
+ @TableColumn({
525
+ required: true,
526
+ isDefaultValueColumn: true,
527
+ type: TableColumnType.Boolean,
528
+ title: "Repeat Policy If No One Answers",
529
+ description: "Restart from first rule if all fail",
530
+ defaultValue: false,
531
+ })
532
+ @Column({
533
+ nullable: false,
534
+ default: false,
535
+ type: ColumnType.Boolean,
536
+ })
537
+ public repeatPolicyIfNoOneAnswers?: boolean = undefined;
538
+
539
+ @ColumnAccessControl({
540
+ create: [
541
+ Permission.ProjectOwner,
542
+ Permission.ProjectAdmin,
543
+ Permission.ProjectMember,
544
+ Permission.CreateProjectIncomingCallPolicy,
545
+ ],
546
+ read: [
547
+ Permission.ProjectOwner,
548
+ Permission.ProjectAdmin,
549
+ Permission.ProjectMember,
550
+ Permission.ReadProjectIncomingCallPolicy,
551
+ ],
552
+ update: [
553
+ Permission.ProjectOwner,
554
+ Permission.ProjectAdmin,
555
+ Permission.ProjectMember,
556
+ Permission.EditProjectIncomingCallPolicy,
557
+ ],
558
+ })
559
+ @TableColumn({
560
+ required: true,
561
+ isDefaultValueColumn: true,
562
+ type: TableColumnType.Number,
563
+ title: "Repeat Policy Times",
564
+ description: "Maximum repeat attempts if no one answers",
565
+ defaultValue: 1,
566
+ })
567
+ @Column({
568
+ nullable: false,
569
+ default: 1,
570
+ type: ColumnType.Number,
571
+ })
572
+ public repeatPolicyIfNoOneAnswersTimes?: number = undefined;
573
+
574
+ @ColumnAccessControl({
575
+ create: [
576
+ Permission.ProjectOwner,
577
+ Permission.ProjectAdmin,
578
+ Permission.ProjectMember,
579
+ Permission.CreateProjectIncomingCallPolicy,
580
+ ],
581
+ read: [
582
+ Permission.ProjectOwner,
583
+ Permission.ProjectAdmin,
584
+ Permission.ProjectMember,
585
+ Permission.ReadProjectIncomingCallPolicy,
586
+ ],
587
+ update: [
588
+ Permission.ProjectOwner,
589
+ Permission.ProjectAdmin,
590
+ Permission.ProjectMember,
591
+ Permission.EditProjectIncomingCallPolicy,
592
+ ],
593
+ })
594
+ @TableColumn({
595
+ required: false,
596
+ type: TableColumnType.EntityArray,
597
+ modelType: Label,
598
+ title: "Labels",
599
+ description:
600
+ "Relation to Labels Array where this object is categorized in.",
601
+ })
602
+ @ManyToMany(
603
+ () => {
604
+ return Label;
605
+ },
606
+ { eager: false },
607
+ )
608
+ @JoinTable({
609
+ name: "IncomingCallPolicyLabel",
610
+ inverseJoinColumn: {
611
+ name: "labelId",
612
+ referencedColumnName: "_id",
613
+ },
614
+ joinColumn: {
615
+ name: "incomingCallPolicyId",
616
+ referencedColumnName: "_id",
617
+ },
618
+ })
619
+ public labels?: Array<Label> = undefined;
620
+
621
+ /*
622
+ * Project-level Twilio configuration (optional)
623
+ * If set, uses the project's own Twilio config instead of the global config
624
+ * When using project config, billing does not apply
625
+ */
626
+ @ColumnAccessControl({
627
+ create: [
628
+ Permission.ProjectOwner,
629
+ Permission.ProjectAdmin,
630
+ Permission.ProjectMember,
631
+ Permission.CreateProjectIncomingCallPolicy,
632
+ ],
633
+ read: [
634
+ Permission.ProjectOwner,
635
+ Permission.ProjectAdmin,
636
+ Permission.ProjectMember,
637
+ Permission.ReadProjectIncomingCallPolicy,
638
+ ],
639
+ update: [
640
+ Permission.ProjectOwner,
641
+ Permission.ProjectAdmin,
642
+ Permission.ProjectMember,
643
+ Permission.EditProjectIncomingCallPolicy,
644
+ ],
645
+ })
646
+ @TableColumn({
647
+ manyToOneRelationColumn: "projectCallSMSConfigId",
648
+ type: TableColumnType.Entity,
649
+ modelType: ProjectCallSMSConfig,
650
+ title: "Project Call/SMS Config",
651
+ description:
652
+ "Optional project-level Twilio configuration. If set, uses this config instead of global config and billing does not apply.",
653
+ })
654
+ @ManyToOne(
655
+ () => {
656
+ return ProjectCallSMSConfig;
657
+ },
658
+ {
659
+ eager: false,
660
+ nullable: true,
661
+ onDelete: "SET NULL",
662
+ orphanedRowAction: "nullify",
663
+ },
664
+ )
665
+ @JoinColumn({ name: "projectCallSMSConfigId" })
666
+ public projectCallSMSConfig?: ProjectCallSMSConfig = undefined;
667
+
668
+ @ColumnAccessControl({
669
+ create: [
670
+ Permission.ProjectOwner,
671
+ Permission.ProjectAdmin,
672
+ Permission.ProjectMember,
673
+ Permission.CreateProjectIncomingCallPolicy,
674
+ ],
675
+ read: [
676
+ Permission.ProjectOwner,
677
+ Permission.ProjectAdmin,
678
+ Permission.ProjectMember,
679
+ Permission.ReadProjectIncomingCallPolicy,
680
+ ],
681
+ update: [
682
+ Permission.ProjectOwner,
683
+ Permission.ProjectAdmin,
684
+ Permission.ProjectMember,
685
+ Permission.EditProjectIncomingCallPolicy,
686
+ ],
687
+ })
688
+ @TableColumn({
689
+ type: TableColumnType.ObjectID,
690
+ title: "Project Call/SMS Config ID",
691
+ description:
692
+ "ID of the project-level Twilio configuration. If set, uses this config instead of global config and billing does not apply.",
693
+ })
694
+ @Column({
695
+ type: ColumnType.ObjectID,
696
+ nullable: true,
697
+ transformer: ObjectID.getDatabaseTransformer(),
698
+ })
699
+ public projectCallSMSConfigId?: ObjectID = undefined;
700
+
701
+ @ColumnAccessControl({
702
+ create: [
703
+ Permission.ProjectOwner,
704
+ Permission.ProjectAdmin,
705
+ Permission.ProjectMember,
706
+ Permission.CreateProjectIncomingCallPolicy,
707
+ ],
708
+ read: [
709
+ Permission.ProjectOwner,
710
+ Permission.ProjectAdmin,
711
+ Permission.ProjectMember,
712
+ Permission.ReadProjectIncomingCallPolicy,
713
+ ],
714
+ update: [],
715
+ })
716
+ @TableColumn({
717
+ manyToOneRelationColumn: "createdByUserId",
718
+ type: TableColumnType.Entity,
719
+ modelType: User,
720
+ title: "Created by User",
721
+ description:
722
+ "Relation to User who created this object (if this object was created by a User)",
723
+ })
724
+ @ManyToOne(
725
+ () => {
726
+ return User;
727
+ },
728
+ {
729
+ eager: false,
730
+ nullable: true,
731
+ onDelete: "SET NULL",
732
+ orphanedRowAction: "nullify",
733
+ },
734
+ )
735
+ @JoinColumn({ name: "createdByUserId" })
736
+ public createdByUser?: User = undefined;
737
+
738
+ @ColumnAccessControl({
739
+ create: [
740
+ Permission.ProjectOwner,
741
+ Permission.ProjectAdmin,
742
+ Permission.ProjectMember,
743
+ Permission.CreateProjectIncomingCallPolicy,
744
+ ],
745
+ read: [
746
+ Permission.ProjectOwner,
747
+ Permission.ProjectAdmin,
748
+ Permission.ProjectMember,
749
+ Permission.ReadProjectIncomingCallPolicy,
750
+ ],
751
+ update: [],
752
+ })
753
+ @TableColumn({
754
+ type: TableColumnType.ObjectID,
755
+ title: "Created by User ID",
756
+ description:
757
+ "User ID who created this object (if this object was created by a User)",
758
+ })
759
+ @Column({
760
+ type: ColumnType.ObjectID,
761
+ nullable: true,
762
+ transformer: ObjectID.getDatabaseTransformer(),
763
+ })
764
+ public createdByUserId?: ObjectID = undefined;
765
+
766
+ @ColumnAccessControl({
767
+ create: [],
768
+ read: [],
769
+ update: [],
770
+ })
771
+ @TableColumn({
772
+ manyToOneRelationColumn: "deletedByUserId",
773
+ type: TableColumnType.Entity,
774
+ title: "Deleted by User",
775
+ modelType: User,
776
+ description:
777
+ "Relation to User who deleted this object (if this object was deleted by a User)",
778
+ })
779
+ @ManyToOne(
780
+ () => {
781
+ return User;
782
+ },
783
+ {
784
+ cascade: false,
785
+ eager: false,
786
+ nullable: true,
787
+ onDelete: "SET NULL",
788
+ orphanedRowAction: "nullify",
789
+ },
790
+ )
791
+ @JoinColumn({ name: "deletedByUserId" })
792
+ public deletedByUser?: User = undefined;
793
+
794
+ @ColumnAccessControl({
795
+ create: [],
796
+ read: [],
797
+ update: [],
798
+ })
799
+ @TableColumn({
800
+ type: TableColumnType.ObjectID,
801
+ title: "Deleted by User ID",
802
+ description:
803
+ "User ID who deleted this object (if this object was deleted by a User)",
804
+ })
805
+ @Column({
806
+ type: ColumnType.ObjectID,
807
+ nullable: true,
808
+ transformer: ObjectID.getDatabaseTransformer(),
809
+ })
810
+ public deletedByUserId?: ObjectID = undefined;
811
+ }