@trycompai/db 2.0.0 → 2.0.1

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 (268) hide show
  1. package/dist/client.d.ts +2 -2
  2. package/dist/client.d.ts.map +1 -1
  3. package/dist/client.js +24 -3
  4. package/dist/scripts/backfill-framework-versions.d.ts +6 -0
  5. package/dist/scripts/backfill-framework-versions.d.ts.map +1 -0
  6. package/dist/scripts/backfill-framework-versions.js +142 -0
  7. package/package.json +5 -3
  8. package/dist/client.ts +0 -7
  9. package/dist/generated/prisma/client.d.ts +0 -427
  10. package/dist/generated/prisma/client.d.ts.map +0 -1
  11. package/dist/generated/prisma/client.js +0 -73
  12. package/dist/generated/prisma/commonInputTypes.d.ts +0 -2082
  13. package/dist/generated/prisma/commonInputTypes.d.ts.map +0 -1
  14. package/dist/generated/prisma/commonInputTypes.js +0 -11
  15. package/dist/generated/prisma/enums.d.ts +0 -367
  16. package/dist/generated/prisma/enums.d.ts.map +0 -1
  17. package/dist/generated/prisma/enums.js +0 -329
  18. package/dist/generated/prisma/internal/class.d.ts +0 -1000
  19. package/dist/generated/prisma/internal/class.d.ts.map +0 -1
  20. package/dist/generated/prisma/internal/class.js +0 -87
  21. package/dist/generated/prisma/internal/prismaNamespace.d.ts +0 -8063
  22. package/dist/generated/prisma/internal/prismaNamespace.d.ts.map +0 -1
  23. package/dist/generated/prisma/internal/prismaNamespace.js +0 -1256
  24. package/dist/generated/prisma/models/Account.d.ts +0 -1456
  25. package/dist/generated/prisma/models/Account.d.ts.map +0 -1
  26. package/dist/generated/prisma/models/Account.js +0 -2
  27. package/dist/generated/prisma/models/ApiKey.d.ts +0 -1387
  28. package/dist/generated/prisma/models/ApiKey.d.ts.map +0 -1
  29. package/dist/generated/prisma/models/ApiKey.js +0 -2
  30. package/dist/generated/prisma/models/Attachment.d.ts +0 -1520
  31. package/dist/generated/prisma/models/Attachment.d.ts.map +0 -1
  32. package/dist/generated/prisma/models/Attachment.js +0 -2
  33. package/dist/generated/prisma/models/AuditLog.d.ts +0 -1590
  34. package/dist/generated/prisma/models/AuditLog.d.ts.map +0 -1
  35. package/dist/generated/prisma/models/AuditLog.js +0 -2
  36. package/dist/generated/prisma/models/BrowserAutomation.d.ts +0 -1507
  37. package/dist/generated/prisma/models/BrowserAutomation.d.ts.map +0 -1
  38. package/dist/generated/prisma/models/BrowserAutomation.js +0 -2
  39. package/dist/generated/prisma/models/BrowserAutomationRun.d.ts +0 -1455
  40. package/dist/generated/prisma/models/BrowserAutomationRun.d.ts.map +0 -1
  41. package/dist/generated/prisma/models/BrowserAutomationRun.js +0 -2
  42. package/dist/generated/prisma/models/BrowserbaseContext.d.ts +0 -1139
  43. package/dist/generated/prisma/models/BrowserbaseContext.d.ts.map +0 -1
  44. package/dist/generated/prisma/models/BrowserbaseContext.js +0 -2
  45. package/dist/generated/prisma/models/Comment.d.ts +0 -1502
  46. package/dist/generated/prisma/models/Comment.d.ts.map +0 -1
  47. package/dist/generated/prisma/models/Comment.js +0 -2
  48. package/dist/generated/prisma/models/Context.d.ts +0 -1254
  49. package/dist/generated/prisma/models/Context.d.ts.map +0 -1
  50. package/dist/generated/prisma/models/Context.js +0 -2
  51. package/dist/generated/prisma/models/Control.d.ts +0 -1965
  52. package/dist/generated/prisma/models/Control.d.ts.map +0 -1
  53. package/dist/generated/prisma/models/Control.js +0 -2
  54. package/dist/generated/prisma/models/ControlDocumentType.d.ts +0 -1115
  55. package/dist/generated/prisma/models/ControlDocumentType.d.ts.map +0 -1
  56. package/dist/generated/prisma/models/ControlDocumentType.js +0 -2
  57. package/dist/generated/prisma/models/Device.d.ts +0 -1858
  58. package/dist/generated/prisma/models/Device.d.ts.map +0 -1
  59. package/dist/generated/prisma/models/Device.js +0 -2
  60. package/dist/generated/prisma/models/DynamicCheck.d.ts +0 -1517
  61. package/dist/generated/prisma/models/DynamicCheck.d.ts.map +0 -1
  62. package/dist/generated/prisma/models/DynamicCheck.js +0 -2
  63. package/dist/generated/prisma/models/DynamicIntegration.d.ts +0 -1528
  64. package/dist/generated/prisma/models/DynamicIntegration.d.ts.map +0 -1
  65. package/dist/generated/prisma/models/DynamicIntegration.js +0 -2
  66. package/dist/generated/prisma/models/EmployeeTrainingVideoCompletion.d.ts +0 -1146
  67. package/dist/generated/prisma/models/EmployeeTrainingVideoCompletion.d.ts.map +0 -1
  68. package/dist/generated/prisma/models/EmployeeTrainingVideoCompletion.js +0 -2
  69. package/dist/generated/prisma/models/EvidenceAutomation.d.ts +0 -1533
  70. package/dist/generated/prisma/models/EvidenceAutomation.d.ts.map +0 -1
  71. package/dist/generated/prisma/models/EvidenceAutomation.js +0 -2
  72. package/dist/generated/prisma/models/EvidenceAutomationRun.d.ts +0 -1833
  73. package/dist/generated/prisma/models/EvidenceAutomationRun.d.ts.map +0 -1
  74. package/dist/generated/prisma/models/EvidenceAutomationRun.js +0 -2
  75. package/dist/generated/prisma/models/EvidenceAutomationVersion.d.ts +0 -1331
  76. package/dist/generated/prisma/models/EvidenceAutomationVersion.d.ts.map +0 -1
  77. package/dist/generated/prisma/models/EvidenceAutomationVersion.js +0 -2
  78. package/dist/generated/prisma/models/EvidenceSubmission.d.ts +0 -1905
  79. package/dist/generated/prisma/models/EvidenceSubmission.d.ts.map +0 -1
  80. package/dist/generated/prisma/models/EvidenceSubmission.js +0 -2
  81. package/dist/generated/prisma/models/Finding.d.ts +0 -2386
  82. package/dist/generated/prisma/models/Finding.d.ts.map +0 -1
  83. package/dist/generated/prisma/models/Finding.js +0 -2
  84. package/dist/generated/prisma/models/FindingTemplate.d.ts +0 -1264
  85. package/dist/generated/prisma/models/FindingTemplate.d.ts.map +0 -1
  86. package/dist/generated/prisma/models/FindingTemplate.js +0 -2
  87. package/dist/generated/prisma/models/FleetPolicyResult.d.ts +0 -1484
  88. package/dist/generated/prisma/models/FleetPolicyResult.d.ts.map +0 -1
  89. package/dist/generated/prisma/models/FleetPolicyResult.js +0 -2
  90. package/dist/generated/prisma/models/FrameworkEditorControlTemplate.d.ts +0 -1669
  91. package/dist/generated/prisma/models/FrameworkEditorControlTemplate.d.ts.map +0 -1
  92. package/dist/generated/prisma/models/FrameworkEditorControlTemplate.js +0 -2
  93. package/dist/generated/prisma/models/FrameworkEditorFramework.d.ts +0 -1581
  94. package/dist/generated/prisma/models/FrameworkEditorFramework.d.ts.map +0 -1
  95. package/dist/generated/prisma/models/FrameworkEditorFramework.js +0 -2
  96. package/dist/generated/prisma/models/FrameworkEditorPolicyTemplate.d.ts +0 -1428
  97. package/dist/generated/prisma/models/FrameworkEditorPolicyTemplate.d.ts.map +0 -1
  98. package/dist/generated/prisma/models/FrameworkEditorPolicyTemplate.js +0 -2
  99. package/dist/generated/prisma/models/FrameworkEditorRequirement.d.ts +0 -1525
  100. package/dist/generated/prisma/models/FrameworkEditorRequirement.d.ts.map +0 -1
  101. package/dist/generated/prisma/models/FrameworkEditorRequirement.js +0 -2
  102. package/dist/generated/prisma/models/FrameworkEditorTaskTemplate.d.ts +0 -1434
  103. package/dist/generated/prisma/models/FrameworkEditorTaskTemplate.d.ts.map +0 -1
  104. package/dist/generated/prisma/models/FrameworkEditorTaskTemplate.js +0 -2
  105. package/dist/generated/prisma/models/FrameworkEditorVideo.d.ts +0 -1054
  106. package/dist/generated/prisma/models/FrameworkEditorVideo.d.ts.map +0 -1
  107. package/dist/generated/prisma/models/FrameworkEditorVideo.js +0 -2
  108. package/dist/generated/prisma/models/FrameworkInstance.d.ts +0 -1321
  109. package/dist/generated/prisma/models/FrameworkInstance.d.ts.map +0 -1
  110. package/dist/generated/prisma/models/FrameworkInstance.js +0 -2
  111. package/dist/generated/prisma/models/GlobalVendors.d.ts +0 -1358
  112. package/dist/generated/prisma/models/GlobalVendors.d.ts.map +0 -1
  113. package/dist/generated/prisma/models/GlobalVendors.js +0 -2
  114. package/dist/generated/prisma/models/Integration.d.ts +0 -1363
  115. package/dist/generated/prisma/models/Integration.d.ts.map +0 -1
  116. package/dist/generated/prisma/models/Integration.js +0 -2
  117. package/dist/generated/prisma/models/IntegrationCheckResult.d.ts +0 -1408
  118. package/dist/generated/prisma/models/IntegrationCheckResult.d.ts.map +0 -1
  119. package/dist/generated/prisma/models/IntegrationCheckResult.js +0 -2
  120. package/dist/generated/prisma/models/IntegrationCheckRun.d.ts +0 -1958
  121. package/dist/generated/prisma/models/IntegrationCheckRun.d.ts.map +0 -1
  122. package/dist/generated/prisma/models/IntegrationCheckRun.js +0 -2
  123. package/dist/generated/prisma/models/IntegrationConnection.d.ts +0 -2472
  124. package/dist/generated/prisma/models/IntegrationConnection.d.ts.map +0 -1
  125. package/dist/generated/prisma/models/IntegrationConnection.js +0 -2
  126. package/dist/generated/prisma/models/IntegrationCredentialVersion.d.ts +0 -1298
  127. package/dist/generated/prisma/models/IntegrationCredentialVersion.d.ts.map +0 -1
  128. package/dist/generated/prisma/models/IntegrationCredentialVersion.js +0 -2
  129. package/dist/generated/prisma/models/IntegrationOAuthApp.d.ts +0 -1362
  130. package/dist/generated/prisma/models/IntegrationOAuthApp.d.ts.map +0 -1
  131. package/dist/generated/prisma/models/IntegrationOAuthApp.js +0 -2
  132. package/dist/generated/prisma/models/IntegrationOAuthState.d.ts +0 -1131
  133. package/dist/generated/prisma/models/IntegrationOAuthState.d.ts.map +0 -1
  134. package/dist/generated/prisma/models/IntegrationOAuthState.js +0 -2
  135. package/dist/generated/prisma/models/IntegrationPlatformCredential.d.ts +0 -1237
  136. package/dist/generated/prisma/models/IntegrationPlatformCredential.d.ts.map +0 -1
  137. package/dist/generated/prisma/models/IntegrationPlatformCredential.js +0 -2
  138. package/dist/generated/prisma/models/IntegrationPlatformFinding.d.ts +0 -1652
  139. package/dist/generated/prisma/models/IntegrationPlatformFinding.d.ts.map +0 -1
  140. package/dist/generated/prisma/models/IntegrationPlatformFinding.js +0 -2
  141. package/dist/generated/prisma/models/IntegrationProvider.d.ts +0 -1300
  142. package/dist/generated/prisma/models/IntegrationProvider.d.ts.map +0 -1
  143. package/dist/generated/prisma/models/IntegrationProvider.js +0 -2
  144. package/dist/generated/prisma/models/IntegrationResult.d.ts +0 -1539
  145. package/dist/generated/prisma/models/IntegrationResult.d.ts.map +0 -1
  146. package/dist/generated/prisma/models/IntegrationResult.js +0 -2
  147. package/dist/generated/prisma/models/IntegrationRun.d.ts +0 -1596
  148. package/dist/generated/prisma/models/IntegrationRun.d.ts.map +0 -1
  149. package/dist/generated/prisma/models/IntegrationRun.js +0 -2
  150. package/dist/generated/prisma/models/IntegrationSyncLog.d.ts +0 -1716
  151. package/dist/generated/prisma/models/IntegrationSyncLog.d.ts.map +0 -1
  152. package/dist/generated/prisma/models/IntegrationSyncLog.js +0 -2
  153. package/dist/generated/prisma/models/Invitation.d.ts +0 -1404
  154. package/dist/generated/prisma/models/Invitation.d.ts.map +0 -1
  155. package/dist/generated/prisma/models/Invitation.js +0 -2
  156. package/dist/generated/prisma/models/Jwks.d.ts +0 -998
  157. package/dist/generated/prisma/models/Jwks.d.ts.map +0 -1
  158. package/dist/generated/prisma/models/Jwks.js +0 -2
  159. package/dist/generated/prisma/models/KnowledgeBaseDocument.d.ts +0 -1463
  160. package/dist/generated/prisma/models/KnowledgeBaseDocument.d.ts.map +0 -1
  161. package/dist/generated/prisma/models/KnowledgeBaseDocument.js +0 -2
  162. package/dist/generated/prisma/models/Member.d.ts +0 -5530
  163. package/dist/generated/prisma/models/Member.d.ts.map +0 -1
  164. package/dist/generated/prisma/models/Member.js +0 -2
  165. package/dist/generated/prisma/models/Onboarding.d.ts +0 -1376
  166. package/dist/generated/prisma/models/Onboarding.d.ts.map +0 -1
  167. package/dist/generated/prisma/models/Onboarding.js +0 -2
  168. package/dist/generated/prisma/models/Organization.d.ts +0 -14367
  169. package/dist/generated/prisma/models/Organization.d.ts.map +0 -1
  170. package/dist/generated/prisma/models/Organization.js +0 -2
  171. package/dist/generated/prisma/models/OrganizationBilling.d.ts +0 -1222
  172. package/dist/generated/prisma/models/OrganizationBilling.d.ts.map +0 -1
  173. package/dist/generated/prisma/models/OrganizationBilling.js +0 -2
  174. package/dist/generated/prisma/models/OrganizationChart.d.ts +0 -1248
  175. package/dist/generated/prisma/models/OrganizationChart.d.ts.map +0 -1
  176. package/dist/generated/prisma/models/OrganizationChart.js +0 -2
  177. package/dist/generated/prisma/models/OrganizationRole.d.ts +0 -1251
  178. package/dist/generated/prisma/models/OrganizationRole.d.ts.map +0 -1
  179. package/dist/generated/prisma/models/OrganizationRole.js +0 -2
  180. package/dist/generated/prisma/models/PentestSubscription.d.ts +0 -1497
  181. package/dist/generated/prisma/models/PentestSubscription.d.ts.map +0 -1
  182. package/dist/generated/prisma/models/PentestSubscription.js +0 -2
  183. package/dist/generated/prisma/models/Policy.d.ts +0 -3356
  184. package/dist/generated/prisma/models/Policy.d.ts.map +0 -1
  185. package/dist/generated/prisma/models/Policy.js +0 -2
  186. package/dist/generated/prisma/models/PolicyVersion.d.ts +0 -1619
  187. package/dist/generated/prisma/models/PolicyVersion.d.ts.map +0 -1
  188. package/dist/generated/prisma/models/PolicyVersion.js +0 -2
  189. package/dist/generated/prisma/models/Questionnaire.d.ts +0 -1808
  190. package/dist/generated/prisma/models/Questionnaire.d.ts.map +0 -1
  191. package/dist/generated/prisma/models/Questionnaire.js +0 -2
  192. package/dist/generated/prisma/models/QuestionnaireQuestionAnswer.d.ts +0 -1422
  193. package/dist/generated/prisma/models/QuestionnaireQuestionAnswer.d.ts.map +0 -1
  194. package/dist/generated/prisma/models/QuestionnaireQuestionAnswer.js +0 -2
  195. package/dist/generated/prisma/models/RequirementMap.d.ts +0 -1345
  196. package/dist/generated/prisma/models/RequirementMap.d.ts.map +0 -1
  197. package/dist/generated/prisma/models/RequirementMap.js +0 -2
  198. package/dist/generated/prisma/models/Risk.d.ts +0 -1975
  199. package/dist/generated/prisma/models/Risk.d.ts.map +0 -1
  200. package/dist/generated/prisma/models/Risk.js +0 -2
  201. package/dist/generated/prisma/models/RoleNotificationSetting.d.ts +0 -1391
  202. package/dist/generated/prisma/models/RoleNotificationSetting.d.ts.map +0 -1
  203. package/dist/generated/prisma/models/RoleNotificationSetting.js +0 -2
  204. package/dist/generated/prisma/models/SOAAnswer.d.ts +0 -1498
  205. package/dist/generated/prisma/models/SOAAnswer.d.ts.map +0 -1
  206. package/dist/generated/prisma/models/SOAAnswer.js +0 -2
  207. package/dist/generated/prisma/models/SOADocument.d.ts +0 -2272
  208. package/dist/generated/prisma/models/SOADocument.d.ts.map +0 -1
  209. package/dist/generated/prisma/models/SOADocument.js +0 -2
  210. package/dist/generated/prisma/models/SOAFrameworkConfiguration.d.ts +0 -1445
  211. package/dist/generated/prisma/models/SOAFrameworkConfiguration.d.ts.map +0 -1
  212. package/dist/generated/prisma/models/SOAFrameworkConfiguration.js +0 -2
  213. package/dist/generated/prisma/models/Secret.d.ts +0 -1321
  214. package/dist/generated/prisma/models/Secret.d.ts.map +0 -1
  215. package/dist/generated/prisma/models/Secret.js +0 -2
  216. package/dist/generated/prisma/models/SecurityPenetrationTestRun.d.ts +0 -1176
  217. package/dist/generated/prisma/models/SecurityPenetrationTestRun.d.ts.map +0 -1
  218. package/dist/generated/prisma/models/SecurityPenetrationTestRun.js +0 -2
  219. package/dist/generated/prisma/models/SecurityQuestionnaireManualAnswer.d.ts +0 -1510
  220. package/dist/generated/prisma/models/SecurityQuestionnaireManualAnswer.d.ts.map +0 -1
  221. package/dist/generated/prisma/models/SecurityQuestionnaireManualAnswer.js +0 -2
  222. package/dist/generated/prisma/models/Session.d.ts +0 -1351
  223. package/dist/generated/prisma/models/Session.d.ts.map +0 -1
  224. package/dist/generated/prisma/models/Session.js +0 -2
  225. package/dist/generated/prisma/models/Task.d.ts +0 -3980
  226. package/dist/generated/prisma/models/Task.d.ts.map +0 -1
  227. package/dist/generated/prisma/models/Task.js +0 -2
  228. package/dist/generated/prisma/models/TaskItem.d.ts +0 -1961
  229. package/dist/generated/prisma/models/TaskItem.d.ts.map +0 -1
  230. package/dist/generated/prisma/models/TaskItem.js +0 -2
  231. package/dist/generated/prisma/models/Trust.d.ts +0 -2242
  232. package/dist/generated/prisma/models/Trust.d.ts.map +0 -1
  233. package/dist/generated/prisma/models/Trust.js +0 -2
  234. package/dist/generated/prisma/models/TrustAccessGrant.d.ts +0 -1888
  235. package/dist/generated/prisma/models/TrustAccessGrant.d.ts.map +0 -1
  236. package/dist/generated/prisma/models/TrustAccessGrant.js +0 -2
  237. package/dist/generated/prisma/models/TrustAccessRequest.d.ts +0 -2103
  238. package/dist/generated/prisma/models/TrustAccessRequest.d.ts.map +0 -1
  239. package/dist/generated/prisma/models/TrustAccessRequest.js +0 -2
  240. package/dist/generated/prisma/models/TrustCustomLink.d.ts +0 -1354
  241. package/dist/generated/prisma/models/TrustCustomLink.d.ts.map +0 -1
  242. package/dist/generated/prisma/models/TrustCustomLink.js +0 -2
  243. package/dist/generated/prisma/models/TrustDocument.d.ts +0 -1281
  244. package/dist/generated/prisma/models/TrustDocument.d.ts.map +0 -1
  245. package/dist/generated/prisma/models/TrustDocument.js +0 -2
  246. package/dist/generated/prisma/models/TrustNDAAgreement.d.ts +0 -1877
  247. package/dist/generated/prisma/models/TrustNDAAgreement.d.ts.map +0 -1
  248. package/dist/generated/prisma/models/TrustNDAAgreement.js +0 -2
  249. package/dist/generated/prisma/models/TrustResource.d.ts +0 -1328
  250. package/dist/generated/prisma/models/TrustResource.d.ts.map +0 -1
  251. package/dist/generated/prisma/models/TrustResource.js +0 -2
  252. package/dist/generated/prisma/models/User.d.ts +0 -3070
  253. package/dist/generated/prisma/models/User.d.ts.map +0 -1
  254. package/dist/generated/prisma/models/User.js +0 -2
  255. package/dist/generated/prisma/models/Vendor.d.ts +0 -2307
  256. package/dist/generated/prisma/models/Vendor.d.ts.map +0 -1
  257. package/dist/generated/prisma/models/Vendor.js +0 -2
  258. package/dist/generated/prisma/models/VendorContact.d.ts +0 -1246
  259. package/dist/generated/prisma/models/VendorContact.d.ts.map +0 -1
  260. package/dist/generated/prisma/models/VendorContact.js +0 -2
  261. package/dist/generated/prisma/models/Verification.d.ts +0 -1026
  262. package/dist/generated/prisma/models/Verification.d.ts.map +0 -1
  263. package/dist/generated/prisma/models/Verification.js +0 -2
  264. package/dist/generated/prisma/models.d.ts +0 -82
  265. package/dist/generated/prisma/models.d.ts.map +0 -1
  266. package/dist/generated/prisma/models.js +0 -2
  267. package/dist/index.ts +0 -1
  268. package/dist/schema.prisma +0 -2609
@@ -1,2609 +0,0 @@
1
- generator client {
2
- provider = "prisma-client"
3
- output = "../src/generated/prisma"
4
- previewFeatures = ["postgresqlExtensions"]
5
- }
6
-
7
- datasource db {
8
- provider = "postgresql"
9
- extensions = [pgcrypto]
10
- }
11
-
12
-
13
- // ===== attachments.prisma =====
14
- model Attachment {
15
- id String @id @default(dbgenerated("generate_prefixed_cuid('att'::text)"))
16
- name String
17
- url String
18
- type AttachmentType
19
- entityId String
20
- entityType AttachmentEntityType
21
-
22
- // Dates
23
- createdAt DateTime @default(now())
24
- updatedAt DateTime @updatedAt
25
-
26
- // Relationships
27
- organizationId String
28
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
29
- comment Comment? @relation(fields: [commentId], references: [id])
30
- commentId String?
31
-
32
- @@index([entityId, entityType])
33
- }
34
-
35
- enum AttachmentEntityType {
36
- task
37
- vendor
38
- risk
39
- comment
40
- trust_nda
41
- task_item
42
- }
43
-
44
- enum AttachmentType {
45
- image
46
- video
47
- audio
48
- document
49
- other
50
- }
51
-
52
-
53
- // ===== auth.prisma =====
54
- model User {
55
- id String @id @default(dbgenerated("generate_prefixed_cuid('usr'::text)"))
56
- name String
57
- email String
58
- emailVerified Boolean
59
- image String?
60
- createdAt DateTime @default(now())
61
- updatedAt DateTime @updatedAt
62
- lastLogin DateTime?
63
- emailNotificationsUnsubscribed Boolean @default(false)
64
- emailPreferences Json? @default("{\"policyNotifications\":true,\"taskReminders\":true,\"weeklyTaskDigest\":true,\"unassignedItemsNotifications\":true}")
65
- role String? @default("user")
66
- banned Boolean?
67
- banReason String?
68
- banExpires DateTime?
69
- isPlatformAdmin Boolean @default(false)
70
-
71
- accounts Account[]
72
- auditLog AuditLog[]
73
- integrationResults IntegrationResult[]
74
- invitations Invitation[]
75
- members Member[]
76
- sessions Session[]
77
- fleetPolicyResults FleetPolicyResult[]
78
- evidenceSubmissions EvidenceSubmission[] @relation("EvidenceSubmitter")
79
- evidenceReviews EvidenceSubmission[] @relation("EvidenceReviewer")
80
- adminFindings Finding[] @relation("AdminFindingCreator")
81
-
82
- @@unique([email])
83
- }
84
-
85
- model EmployeeTrainingVideoCompletion {
86
- id String @id @default(dbgenerated("generate_prefixed_cuid('evc'::text)"))
87
- completedAt DateTime?
88
- videoId String
89
-
90
- memberId String
91
- member Member @relation(fields: [memberId], references: [id], onDelete: Cascade)
92
-
93
- @@unique([memberId, videoId])
94
- @@index([memberId])
95
- }
96
-
97
- model Session {
98
- id String @id @default(dbgenerated("generate_prefixed_cuid('ses'::text)"))
99
- expiresAt DateTime
100
- token String
101
- createdAt DateTime @default(now())
102
- updatedAt DateTime @updatedAt
103
- ipAddress String?
104
- userAgent String?
105
- userId String
106
- activeOrganizationId String?
107
- impersonatedBy String?
108
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
109
-
110
- @@unique([token])
111
- }
112
-
113
- model Account {
114
- id String @id @default(dbgenerated("generate_prefixed_cuid('acc'::text)"))
115
- accountId String
116
- providerId String
117
- userId String
118
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
119
- accessToken String?
120
- refreshToken String?
121
- idToken String?
122
- accessTokenExpiresAt DateTime?
123
- refreshTokenExpiresAt DateTime?
124
- scope String?
125
- password String?
126
- createdAt DateTime
127
- updatedAt DateTime
128
- }
129
-
130
- model Verification {
131
- id String @id @default(dbgenerated("generate_prefixed_cuid('ver'::text)"))
132
- identifier String
133
- value String
134
- expiresAt DateTime
135
- createdAt DateTime @default(now())
136
- updatedAt DateTime @updatedAt
137
- }
138
-
139
- // JWT Plugin - Required by Better Auth JWT plugin
140
- // https://www.better-auth.com/docs/plugins/jwt
141
- model Jwks {
142
- id String @id @default(dbgenerated("generate_prefixed_cuid('jwk'::text)"))
143
- publicKey String
144
- privateKey String
145
- createdAt DateTime @default(now())
146
- expiresAt DateTime?
147
-
148
- @@map("jwks")
149
- }
150
-
151
- model Member {
152
- id String @id @default(dbgenerated("generate_prefixed_cuid('mem'::text)"))
153
- organizationId String
154
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
155
- userId String
156
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
157
- role String // Purposefully a string, since BetterAuth doesn't support enums this way
158
- createdAt DateTime @default(now())
159
-
160
- department Departments @default(none)
161
- jobTitle String?
162
- isActive Boolean @default(true)
163
- deactivated Boolean @default(false)
164
- externalUserId String?
165
- externalUserSource String?
166
- employeeTrainingVideoCompletion EmployeeTrainingVideoCompletion[]
167
- fleetDmLabelId Int?
168
-
169
- assignedPolicies Policy[] @relation("PolicyAssignee") // Policies where this member is an assignee
170
- approvedPolicies Policy[] @relation("PolicyApprover") // Policies where this member is an approver
171
- approvedSOADocuments SOADocument[] @relation("SOADocumentApprover") // SOA documents where this member is an approver
172
- risks Risk[]
173
- tasks Task[]
174
- vendors Vendor[]
175
- comments Comment[]
176
- auditLogs AuditLog[]
177
- reviewedAccessRequests TrustAccessRequest[] @relation("TrustAccessRequestReviewer")
178
- issuedGrants TrustAccessGrant[] @relation("IssuedGrants")
179
- revokedGrants TrustAccessGrant[] @relation("RevokedGrants")
180
- createdTaskItems TaskItem[] @relation("TaskItemCreator")
181
- updatedTaskItems TaskItem[] @relation("TaskItemUpdater")
182
- assignedTaskItems TaskItem[] @relation("TaskItemAssignee")
183
- createdFindings Finding[] @relation("FindingCreatedBy")
184
- publishedPolicyVersions PolicyVersion[] @relation("PolicyVersionPublisher")
185
- approvedTasks Task[] @relation("TaskApprover")
186
- devices Device[]
187
- }
188
-
189
- model Invitation {
190
- id String @id @default(dbgenerated("generate_prefixed_cuid('inv'::text)"))
191
- organizationId String
192
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
193
- email String
194
- role String // Purposefully a string, since BetterAuth doesn't support enums this way
195
- status String
196
- expiresAt DateTime
197
- inviterId String
198
- user User @relation(fields: [inviterId], references: [id], onDelete: Cascade)
199
- createdAt DateTime @default(now())
200
- }
201
-
202
- // This is only for the app to consume, shouldn't be enforced by DB
203
- // Otherwise it won't work with Better Auth, as per https://www.better-auth.com/docs/plugins/organization#access-control
204
- enum Role {
205
- owner
206
- admin
207
- auditor
208
- employee
209
- contractor
210
- }
211
-
212
- // Custom roles for dynamic access control
213
- // This table stores organization-specific custom roles created via better-auth
214
- // See: https://www.better-auth.com/docs/plugins/organization#dynamic-access-control
215
- model OrganizationRole {
216
- id String @id @default(dbgenerated("generate_prefixed_cuid('rol'::text)"))
217
- name String
218
- permissions String @db.Text // Stored as serialized JSON string for better-auth compatibility
219
- obligations String @default("{}") @db.Text // JSON: { compliance?: boolean }
220
- organizationId String
221
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
222
- createdAt DateTime @default(now())
223
- updatedAt DateTime @updatedAt
224
-
225
- @@unique([organizationId, name])
226
- @@map("organization_role")
227
- }
228
-
229
- enum PolicyStatus {
230
- draft
231
- published
232
- needs_review
233
- }
234
-
235
-
236
- // ===== automation-run.prisma =====
237
- model EvidenceAutomationRun {
238
- id String @id @default(dbgenerated("generate_prefixed_cuid('ear'::text)"))
239
- createdAt DateTime @default(now())
240
- updatedAt DateTime @updatedAt
241
-
242
- // Relations
243
- evidenceAutomationId String
244
- evidenceAutomation EvidenceAutomation @relation(fields: [evidenceAutomationId], references: [id], onDelete: Cascade)
245
-
246
- // Run details
247
- status EvidenceAutomationRunStatus @default(pending)
248
- startedAt DateTime?
249
- completedAt DateTime?
250
-
251
- // Results
252
- success Boolean?
253
- error String?
254
- logs Json?
255
- output Json?
256
-
257
- // Evaluation
258
- evaluationStatus EvidenceAutomationEvaluationStatus?
259
- evaluationReason String?
260
-
261
- // Metadata
262
- triggeredBy EvidenceAutomationTrigger @default(scheduled)
263
- runDuration Int? // in milliseconds
264
- version Int? // Version number that was executed (null = draft)
265
- task Task? @relation(fields: [taskId], references: [id])
266
- taskId String?
267
-
268
- @@index([evidenceAutomationId])
269
- @@index([status])
270
- @@index([createdAt])
271
- @@index([version])
272
- }
273
-
274
- enum EvidenceAutomationRunStatus {
275
- pending
276
- running
277
- completed
278
- failed
279
- cancelled
280
- }
281
-
282
- enum EvidenceAutomationTrigger {
283
- manual
284
- scheduled
285
- api
286
- }
287
-
288
- enum EvidenceAutomationEvaluationStatus {
289
- pass
290
- fail
291
- }
292
-
293
-
294
- // ===== automation-version.prisma =====
295
- model EvidenceAutomationVersion {
296
- id String @id @default(dbgenerated("generate_prefixed_cuid('eav'::text)"))
297
- createdAt DateTime @default(now())
298
- updatedAt DateTime @updatedAt
299
-
300
- // Relations
301
- evidenceAutomationId String
302
- evidenceAutomation EvidenceAutomation @relation(fields: [evidenceAutomationId], references: [id], onDelete: Cascade)
303
-
304
- // Version details
305
- version Int // Sequential version number (1, 2, 3...)
306
- scriptKey String // S3 key for this version's script
307
- publishedBy String? // User ID who published
308
- changelog String? // Optional description of changes
309
-
310
- @@unique([evidenceAutomationId, version])
311
- @@index([evidenceAutomationId])
312
- @@index([createdAt])
313
- }
314
-
315
-
316
- // ===== automation.prisma =====
317
- model EvidenceAutomation {
318
- id String @id @default(dbgenerated("generate_prefixed_cuid('aut'::text)"))
319
- name String
320
- description String?
321
- createdAt DateTime @default(now())
322
- isEnabled Boolean @default(false)
323
-
324
- chatHistory String?
325
- evaluationCriteria String?
326
-
327
- taskId String
328
- task Task @relation(fields: [taskId], references: [id], onDelete: Cascade)
329
-
330
- // Relations
331
- runs EvidenceAutomationRun[]
332
- versions EvidenceAutomationVersion[]
333
-
334
- @@index([taskId])
335
- }
336
-
337
-
338
- // ===== browserbase-context.prisma =====
339
- /// Stores Browserbase context IDs for browser-based automation
340
- /// One context per organization - shared like a normal browser
341
- model BrowserbaseContext {
342
- id String @id @default(dbgenerated("generate_prefixed_cuid('bbc'::text)"))
343
-
344
- /// Organization that owns this browser context
345
- organizationId String @unique
346
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
347
-
348
- /// Browserbase context ID from their API
349
- contextId String
350
-
351
- createdAt DateTime @default(now())
352
- updatedAt DateTime @updatedAt
353
-
354
- @@index([organizationId])
355
- }
356
-
357
- /// Browser automation configuration linked to a task
358
- model BrowserAutomation {
359
- id String @id @default(dbgenerated("generate_prefixed_cuid('bau'::text)"))
360
- name String
361
- description String?
362
-
363
- /// Task this automation belongs to
364
- taskId String
365
- task Task @relation(fields: [taskId], references: [id], onDelete: Cascade)
366
-
367
- /// Starting URL for the automation
368
- targetUrl String
369
-
370
- /// Natural language instruction for the AI agent
371
- instruction String
372
-
373
- /// Whether automation is enabled for scheduled runs
374
- isEnabled Boolean @default(false)
375
-
376
- /// Cron expression for scheduled runs (null = manual only)
377
- schedule String?
378
-
379
- createdAt DateTime @default(now())
380
- updatedAt DateTime @updatedAt
381
-
382
- runs BrowserAutomationRun[]
383
-
384
- @@index([taskId])
385
- }
386
-
387
- /// Records of browser automation executions
388
- model BrowserAutomationRun {
389
- id String @id @default(dbgenerated("generate_prefixed_cuid('bar'::text)"))
390
-
391
- /// Parent automation
392
- automationId String
393
- automation BrowserAutomation @relation(fields: [automationId], references: [id], onDelete: Cascade)
394
-
395
- /// Execution status
396
- status BrowserAutomationRunStatus @default(pending)
397
-
398
- /// Timestamps
399
- startedAt DateTime?
400
- completedAt DateTime?
401
-
402
- /// Duration in milliseconds
403
- durationMs Int?
404
-
405
- /// Screenshot URL in S3 (if successful)
406
- screenshotUrl String?
407
-
408
- /// Evaluation result - whether the automation fulfilled the task requirements
409
- evaluationStatus BrowserAutomationEvaluationStatus?
410
-
411
- /// AI explanation of why it passed or failed
412
- evaluationReason String?
413
-
414
- /// Error message (if failed)
415
- error String?
416
-
417
- createdAt DateTime @default(now())
418
-
419
- @@index([automationId])
420
- @@index([status])
421
- @@index([createdAt])
422
- }
423
-
424
- enum BrowserAutomationEvaluationStatus {
425
- pass
426
- fail
427
- }
428
-
429
- enum BrowserAutomationRunStatus {
430
- pending
431
- running
432
- completed
433
- failed
434
- }
435
-
436
-
437
- // ===== comment.prisma =====
438
- model Comment {
439
- id String @id @default(dbgenerated("generate_prefixed_cuid('cmt'::text)"))
440
- content String
441
- entityId String
442
- entityType CommentEntityType
443
-
444
- // Dates
445
- createdAt DateTime @default(now())
446
-
447
- // Relationships
448
- authorId String
449
- author Member @relation(fields: [authorId], references: [id])
450
- organizationId String
451
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
452
-
453
- // Relation to Attachments
454
- attachments Attachment[]
455
-
456
- @@index([entityId])
457
- }
458
-
459
- enum CommentEntityType {
460
- task
461
- vendor
462
- risk
463
- policy
464
- }
465
-
466
-
467
- // ===== context.prisma =====
468
- model Context {
469
- id String @id @default(dbgenerated("generate_prefixed_cuid('ctx'::text)"))
470
- organizationId String
471
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
472
-
473
- question String
474
- answer String
475
-
476
- tags String[]
477
-
478
- createdAt DateTime @default(now())
479
- updatedAt DateTime @updatedAt
480
-
481
- @@index([organizationId])
482
- @@index([question])
483
- @@index([answer])
484
- @@index([tags])
485
- }
486
-
487
-
488
- // ===== control-document-type.prisma =====
489
- model ControlDocumentType {
490
- id String @id @default(dbgenerated("generate_prefixed_cuid('cdt'::text)"))
491
- controlId String
492
- control Control @relation(fields: [controlId], references: [id], onDelete: Cascade)
493
- formType EvidenceFormType
494
-
495
- @@unique([controlId, formType])
496
- @@index([controlId])
497
- }
498
-
499
-
500
- // ===== control.prisma =====
501
- model Control {
502
- // Metadata
503
- id String @id @default(dbgenerated("generate_prefixed_cuid('ctl'::text)"))
504
- name String
505
- description String
506
-
507
- // Review dates
508
- lastReviewDate DateTime?
509
- nextReviewDate DateTime?
510
-
511
- // Relationships
512
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
513
- organizationId String
514
- requirementsMapped RequirementMap[]
515
- tasks Task[]
516
- policies Policy[]
517
- controlTemplateId String?
518
- controlTemplate FrameworkEditorControlTemplate? @relation(fields: [controlTemplateId], references: [id])
519
- controlDocumentTypes ControlDocumentType[]
520
-
521
- @@index([organizationId])
522
- }
523
-
524
-
525
- // ===== device.prisma =====
526
- model Device {
527
- id String @id @default(dbgenerated("generate_prefixed_cuid('dev'::text)"))
528
- name String
529
- hostname String
530
- platform DevicePlatform
531
- osVersion String
532
- serialNumber String?
533
- hardwareModel String?
534
-
535
- memberId String
536
- member Member @relation(fields: [memberId], references: [id], onDelete: Cascade)
537
- organizationId String
538
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
539
-
540
- isCompliant Boolean @default(false)
541
- diskEncryptionEnabled Boolean @default(false)
542
- antivirusEnabled Boolean @default(false)
543
- passwordPolicySet Boolean @default(false)
544
- screenLockEnabled Boolean @default(false)
545
- checkDetails Json?
546
-
547
- lastCheckIn DateTime?
548
- agentVersion String?
549
- installedAt DateTime @default(now())
550
- updatedAt DateTime @updatedAt
551
-
552
- @@unique([serialNumber, organizationId])
553
- @@index([memberId])
554
- @@index([organizationId])
555
- @@index([isCompliant])
556
- }
557
-
558
- enum DevicePlatform {
559
- macos
560
- windows
561
- linux
562
- }
563
-
564
-
565
- // ===== dynamic-integration.prisma =====
566
- // ===== Dynamic Integration Platform =====
567
- // Stores integration manifests and declarative check definitions in the database
568
- // Enables adding new integrations without code changes or deployments
569
-
570
- /// Stores a full integration manifest as JSON — replaces hand-written TypeScript manifests
571
- model DynamicIntegration {
572
- id String @id @default(dbgenerated("generate_prefixed_cuid('din'::text)"))
573
- /// Unique slug (e.g., "azure-devops", "office-365")
574
- slug String @unique
575
- /// Display name
576
- name String
577
- /// Short description for catalog
578
- description String
579
- /// Category for grouping
580
- category String
581
- /// Logo URL
582
- logoUrl String
583
- /// URL to documentation
584
- docsUrl String?
585
-
586
- /// API base URL for ctx.fetch
587
- baseUrl String?
588
- /// Default headers (JSON object)
589
- defaultHeaders Json?
590
-
591
- /// Auth strategy config (JSON — matches AuthStrategy type: oauth2/api_key/basic/jwt/custom)
592
- authConfig Json
593
-
594
- /// Capabilities JSON array (default ["checks"])
595
- capabilities Json @default("[\"checks\"]")
596
-
597
- /// Whether multiple connections per org are allowed
598
- supportsMultipleConnections Boolean @default(false)
599
-
600
- /// Declarative sync definition (JSON — DSL steps that produce employee list)
601
- /// When present and capabilities includes 'sync', enables employee sync
602
- syncDefinition Json?
603
-
604
- /// Whether this dynamic integration is active
605
- isActive Boolean @default(true)
606
-
607
- createdAt DateTime @default(now())
608
- updatedAt DateTime @updatedAt
609
-
610
- checks DynamicCheck[]
611
-
612
- @@index([slug])
613
- @@index([category])
614
- @@index([isActive])
615
- }
616
-
617
- /// Stores a declarative check definition — DSL JSON replaces hand-written run() functions
618
- model DynamicCheck {
619
- id String @id @default(dbgenerated("generate_prefixed_cuid('dck'::text)"))
620
-
621
- /// Parent integration
622
- integrationId String
623
- integration DynamicIntegration @relation(fields: [integrationId], references: [id], onDelete: Cascade)
624
-
625
- /// Unique slug within integration (e.g., "mfa_enabled")
626
- checkSlug String
627
-
628
- /// Human-readable name
629
- name String
630
- /// Description of what this check does
631
- description String
632
-
633
- /// Task template ID for auto-completion (references TASK_TEMPLATES)
634
- taskMapping String?
635
-
636
- /// Default severity for findings
637
- defaultSeverity String @default("medium")
638
-
639
- /// Declarative DSL definition (JSON — the step-by-step instructions)
640
- definition Json
641
-
642
- /// Check-level variables (JSON array of CheckVariable)
643
- variables Json @default("[]")
644
-
645
- /// Whether this check is enabled
646
- isEnabled Boolean @default(true)
647
-
648
- /// Display order
649
- sortOrder Int @default(0)
650
-
651
- createdAt DateTime @default(now())
652
- updatedAt DateTime @updatedAt
653
-
654
- @@unique([integrationId, checkSlug])
655
- @@index([integrationId])
656
- @@index([isEnabled])
657
- }
658
-
659
-
660
- // ===== evidence-submission.prisma =====
661
- model EvidenceSubmission {
662
- id String @id @default(dbgenerated("generate_prefixed_cuid('evs'::text)"))
663
- organizationId String
664
- formType EvidenceFormType
665
- submittedById String?
666
- submittedAt DateTime @default(now())
667
- data Json
668
- status String @default("pending")
669
- reviewedById String?
670
- reviewedAt DateTime?
671
- reviewReason String?
672
- createdAt DateTime @default(now())
673
- updatedAt DateTime @updatedAt
674
-
675
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
676
- submittedBy User? @relation("EvidenceSubmitter", fields: [submittedById], references: [id], onDelete: SetNull)
677
- reviewedBy User? @relation("EvidenceReviewer", fields: [reviewedById], references: [id], onDelete: SetNull)
678
- findings Finding[]
679
-
680
- @@index([organizationId, formType, submittedAt])
681
- @@index([organizationId, formType])
682
- @@index([submittedById, status])
683
- }
684
-
685
-
686
- // ===== finding.prisma =====
687
- enum FindingType {
688
- soc2
689
- iso27001
690
- }
691
-
692
- enum FindingStatus {
693
- open
694
- ready_for_review
695
- needs_revision
696
- closed
697
- }
698
-
699
- model FindingTemplate {
700
- id String @id @default(dbgenerated("generate_prefixed_cuid('fnd_t'::text)"))
701
- category String // e.g., "evidence_issue", "further_evidence", "task_specific", "na_incorrect"
702
- title String // Short title
703
- content String // Full message template
704
- order Int @default(0)
705
- createdAt DateTime @default(now())
706
- updatedAt DateTime @updatedAt
707
-
708
- findings Finding[]
709
- }
710
-
711
- model Finding {
712
- id String @id @default(dbgenerated("generate_prefixed_cuid('fnd'::text)"))
713
- type FindingType @default(soc2)
714
- status FindingStatus @default(open)
715
- content String // Custom message or copied from template
716
- revisionNote String? // Auditor's note when requesting revision
717
-
718
- createdAt DateTime @default(now())
719
- updatedAt DateTime @updatedAt
720
-
721
- // Relationships
722
- taskId String?
723
- task Task? @relation(fields: [taskId], references: [id], onDelete: Cascade)
724
- evidenceSubmissionId String?
725
- evidenceSubmission EvidenceSubmission? @relation(fields: [evidenceSubmissionId], references: [id], onDelete: Cascade)
726
- evidenceFormType EvidenceFormType?
727
- templateId String?
728
- template FindingTemplate? @relation(fields: [templateId], references: [id])
729
- createdById String?
730
- createdBy Member? @relation("FindingCreatedBy", fields: [createdById], references: [id])
731
- createdByAdminId String?
732
- createdByAdmin User? @relation("AdminFindingCreator", fields: [createdByAdminId], references: [id])
733
- organizationId String
734
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
735
-
736
- @@index([taskId])
737
- @@index([evidenceSubmissionId])
738
- @@index([evidenceFormType])
739
- @@index([organizationId, status])
740
- }
741
-
742
-
743
- // ===== fleet-policy-result.prisma =====
744
- model FleetPolicyResult {
745
- id String @id @default(dbgenerated("generate_prefixed_cuid('fpr'::text)"))
746
- userId String
747
- organizationId String
748
- fleetPolicyId Int
749
- fleetPolicyName String
750
- fleetPolicyResponse String
751
- attachments String[] @default([])
752
- createdAt DateTime @default(now())
753
- updatedAt DateTime @updatedAt
754
-
755
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
756
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
757
-
758
- @@index([userId])
759
- @@index([organizationId])
760
- }
761
-
762
-
763
- // ===== framework-editor.prisma =====
764
- // --- Data for Framework Editor ---
765
- model FrameworkEditorVideo {
766
- id String @id @default(dbgenerated("generate_prefixed_cuid('frk_vi'::text)"))
767
- title String
768
- description String
769
- youtubeId String
770
- url String
771
-
772
- // Dates
773
- createdAt DateTime @default(now())
774
- updatedAt DateTime @default(now()) @updatedAt
775
- }
776
-
777
- model FrameworkEditorFramework {
778
- id String @id @default(dbgenerated("generate_prefixed_cuid('frk'::text)"))
779
- name String // e.g., "soc2", "iso27001"
780
- version String
781
- description String
782
- visible Boolean @default(false)
783
-
784
- requirements FrameworkEditorRequirement[]
785
- frameworkInstances FrameworkInstance[]
786
- soaConfigurations SOAFrameworkConfiguration[] // Multiple SOA config versions per framework
787
- soaDocuments SOADocument[] // SOA documents from organizations
788
-
789
- // Dates
790
- createdAt DateTime @default(now())
791
- updatedAt DateTime @default(now()) @updatedAt
792
- }
793
-
794
- model FrameworkEditorRequirement {
795
- id String @id @default(dbgenerated("generate_prefixed_cuid('frk_rq'::text)"))
796
- frameworkId String
797
- framework FrameworkEditorFramework @relation(fields: [frameworkId], references: [id])
798
-
799
- name String // Original requirement ID within that framework, e.g., "Privacy"
800
- identifier String @default("") // Unique identifier for the requirement, e.g., "cc1-1"
801
- description String
802
-
803
- controlTemplates FrameworkEditorControlTemplate[]
804
- requirementMaps RequirementMap[]
805
-
806
- // Dates
807
- createdAt DateTime @default(now())
808
- updatedAt DateTime @default(now()) @updatedAt
809
- }
810
-
811
- model FrameworkEditorPolicyTemplate {
812
- id String @id @default(dbgenerated("generate_prefixed_cuid('frk_pt'::text)"))
813
- name String
814
- description String
815
- frequency Frequency // Using the enum from shared.prisma
816
- department Departments // Using the enum from shared.prisma
817
- content Json
818
-
819
- controlTemplates FrameworkEditorControlTemplate[]
820
-
821
- // Dates
822
- createdAt DateTime @default(now())
823
- updatedAt DateTime @default(now()) @updatedAt
824
-
825
- // Instances
826
- policies Policy[]
827
- }
828
-
829
- model FrameworkEditorTaskTemplate {
830
- id String @id @default(dbgenerated("generate_prefixed_cuid('frk_tt'::text)"))
831
- name String
832
- description String
833
- frequency Frequency // Using the enum from shared.prisma
834
- department Departments // Using the enum from shared.prisma
835
- automationStatus TaskAutomationStatus @default(AUTOMATED)
836
-
837
- controlTemplates FrameworkEditorControlTemplate[]
838
-
839
- // Dates
840
- createdAt DateTime @default(now())
841
- updatedAt DateTime @default(now()) @updatedAt
842
-
843
- // Instances
844
- tasks Task[]
845
- }
846
-
847
- model FrameworkEditorControlTemplate {
848
- id String @id @default(dbgenerated("generate_prefixed_cuid('frk_ct'::text)"))
849
- name String
850
- description String
851
-
852
- policyTemplates FrameworkEditorPolicyTemplate[]
853
- requirements FrameworkEditorRequirement[]
854
- taskTemplates FrameworkEditorTaskTemplate[]
855
- documentTypes EvidenceFormType[]
856
-
857
- // Dates
858
- createdAt DateTime @default(now())
859
- updatedAt DateTime @default(now()) @updatedAt
860
-
861
- // Instances
862
- controls Control[]
863
- }
864
-
865
-
866
- // ===== framework.prisma =====
867
- model FrameworkInstance {
868
- // Metadata
869
- id String @id @default(dbgenerated("generate_prefixed_cuid('frm'::text)"))
870
- organizationId String
871
-
872
- frameworkId String
873
- framework FrameworkEditorFramework @relation(fields: [frameworkId], references: [id], onDelete: Cascade)
874
-
875
- // Relationships
876
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
877
- requirementsMapped RequirementMap[]
878
-
879
- @@unique([organizationId, frameworkId])
880
- }
881
-
882
-
883
- // ===== integration-platform.prisma =====
884
- // ===== Integration Platform =====
885
- // New integration platform models for scalable, config-driven integrations
886
-
887
- /// Stores metadata about available integration providers (synced from code manifests)
888
- model IntegrationProvider {
889
- id String @id @default(dbgenerated("generate_prefixed_cuid('prv'::text)"))
890
- /// Unique slug matching manifest ID (e.g., "github", "slack")
891
- slug String @unique
892
- /// Display name
893
- name String
894
- /// Category for grouping
895
- category String
896
- /// Hash of manifest for detecting changes
897
- manifestHash String?
898
- /// Capabilities JSON array
899
- capabilities Json @default("[]")
900
- /// Whether provider is active
901
- isActive Boolean @default(true)
902
-
903
- createdAt DateTime @default(now())
904
- updatedAt DateTime @updatedAt
905
-
906
- connections IntegrationConnection[]
907
-
908
- @@index([slug])
909
- @@index([category])
910
- }
911
-
912
- /// Represents an organization's connection to an integration provider
913
- model IntegrationConnection {
914
- id String @id @default(dbgenerated("generate_prefixed_cuid('icn'::text)"))
915
-
916
- /// Reference to the provider
917
- providerId String
918
- provider IntegrationProvider @relation(fields: [providerId], references: [id], onDelete: Cascade)
919
-
920
- /// Organization that owns this connection
921
- organizationId String
922
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
923
-
924
- /// Connection status
925
- status IntegrationConnectionStatus @default(pending)
926
-
927
- /// Auth strategy used (oauth2, api_key, basic, jwt, custom)
928
- authStrategy String
929
-
930
- /// Reference to active credential version
931
- activeCredentialVersionId String?
932
-
933
- /// Last successful sync timestamp
934
- lastSyncAt DateTime?
935
-
936
- /// Next scheduled sync timestamp
937
- nextSyncAt DateTime?
938
-
939
- /// Custom sync cadence (cron expression), null = use default
940
- syncCadence String?
941
-
942
- /// Additional metadata (e.g., connected account info)
943
- metadata Json?
944
-
945
- /// User-configured variables for checks (collected after OAuth)
946
- variables Json?
947
-
948
- /// Error message if status is error
949
- errorMessage String?
950
-
951
- createdAt DateTime @default(now())
952
- updatedAt DateTime @updatedAt
953
-
954
- credentialVersions IntegrationCredentialVersion[]
955
- runs IntegrationRun[]
956
- findings IntegrationPlatformFinding[]
957
- checkRuns IntegrationCheckRun[]
958
- syncLogs IntegrationSyncLog[]
959
-
960
- @@index([organizationId])
961
- @@index([providerId])
962
- @@index([providerId, organizationId])
963
- @@index([status])
964
- }
965
-
966
- enum IntegrationConnectionStatus {
967
- pending // Awaiting credential setup
968
- active // Connected and operational
969
- error // Connection has errors
970
- paused // Manually paused by user
971
- disconnected // User disconnected
972
- }
973
-
974
- /// Stores encrypted credentials with versioning for audit trail
975
- model IntegrationCredentialVersion {
976
- id String @id @default(dbgenerated("generate_prefixed_cuid('icv'::text)"))
977
-
978
- /// Parent connection
979
- connectionId String
980
- connection IntegrationConnection @relation(fields: [connectionId], references: [id], onDelete: Cascade)
981
-
982
- /// Encrypted credential payload (JSON with encrypted fields)
983
- encryptedPayload Json
984
-
985
- /// Version number (auto-increment per connection)
986
- version Int
987
-
988
- /// Token expiration (for OAuth tokens)
989
- expiresAt DateTime?
990
-
991
- /// When this version was rotated/replaced
992
- rotatedAt DateTime?
993
-
994
- createdAt DateTime @default(now())
995
-
996
- @@unique([connectionId, version])
997
- @@index([connectionId])
998
- }
999
-
1000
- /// Records each sync/job execution for audit and debugging
1001
- model IntegrationRun {
1002
- id String @id @default(dbgenerated("generate_prefixed_cuid('irn'::text)"))
1003
-
1004
- /// Parent connection
1005
- connectionId String
1006
- connection IntegrationConnection @relation(fields: [connectionId], references: [id], onDelete: Cascade)
1007
-
1008
- /// Type of job
1009
- jobType IntegrationRunJobType
1010
-
1011
- /// Execution status
1012
- status IntegrationRunStatus @default(pending)
1013
-
1014
- /// Timestamps
1015
- startedAt DateTime?
1016
- completedAt DateTime?
1017
-
1018
- /// Duration in milliseconds
1019
- durationMs Int?
1020
-
1021
- /// Number of findings from this run
1022
- findingsCount Int @default(0)
1023
-
1024
- /// Error details if failed
1025
- error Json?
1026
-
1027
- /// Additional metadata (trigger source, cursor, etc.)
1028
- metadata Json?
1029
-
1030
- createdAt DateTime @default(now())
1031
-
1032
- findings IntegrationPlatformFinding[]
1033
-
1034
- @@index([connectionId])
1035
- @@index([status])
1036
- @@index([createdAt])
1037
- }
1038
-
1039
- enum IntegrationRunJobType {
1040
- full_sync
1041
- delta_sync
1042
- webhook
1043
- manual
1044
- test_connection
1045
- }
1046
-
1047
- enum IntegrationRunStatus {
1048
- pending
1049
- running
1050
- success
1051
- failed
1052
- cancelled
1053
- }
1054
-
1055
- /// Stores findings/results from integration syncs
1056
- model IntegrationPlatformFinding {
1057
- id String @id @default(dbgenerated("generate_prefixed_cuid('ipf'::text)"))
1058
-
1059
- /// Parent run (optional - webhooks may not have runs)
1060
- runId String?
1061
- run IntegrationRun? @relation(fields: [runId], references: [id], onDelete: SetNull)
1062
-
1063
- /// Parent connection
1064
- connectionId String
1065
- connection IntegrationConnection @relation(fields: [connectionId], references: [id], onDelete: Cascade)
1066
-
1067
- /// Resource classification
1068
- resourceType String
1069
- resourceId String
1070
-
1071
- /// Finding details
1072
- title String
1073
- description String?
1074
-
1075
- /// Severity level
1076
- severity IntegrationFindingSeverity @default(info)
1077
-
1078
- /// Finding status
1079
- status IntegrationFindingStatus @default(open)
1080
-
1081
- /// Remediation guidance
1082
- remediation String?
1083
-
1084
- /// Raw payload from provider
1085
- rawPayload Json?
1086
-
1087
- createdAt DateTime @default(now())
1088
- updatedAt DateTime @updatedAt
1089
-
1090
- @@index([connectionId])
1091
- @@index([runId])
1092
- @@index([resourceType, resourceId])
1093
- @@index([severity])
1094
- @@index([status])
1095
- }
1096
-
1097
- enum IntegrationFindingSeverity {
1098
- info
1099
- low
1100
- medium
1101
- high
1102
- critical
1103
- }
1104
-
1105
- enum IntegrationFindingStatus {
1106
- open
1107
- resolved
1108
- ignored
1109
- }
1110
-
1111
- /// Stores OAuth state for CSRF protection during OAuth flow
1112
- model IntegrationOAuthState {
1113
- id String @id @default(dbgenerated("generate_prefixed_cuid('ios'::text)"))
1114
-
1115
- /// Random state parameter
1116
- state String @unique
1117
-
1118
- /// Provider slug
1119
- providerSlug String
1120
-
1121
- /// Organization initiating the OAuth
1122
- organizationId String
1123
-
1124
- /// User initiating the OAuth
1125
- userId String
1126
-
1127
- /// PKCE code verifier (if using PKCE)
1128
- codeVerifier String?
1129
-
1130
- /// Redirect URL after OAuth completes
1131
- redirectUrl String?
1132
-
1133
- /// Expiration timestamp
1134
- expiresAt DateTime
1135
-
1136
- createdAt DateTime @default(now())
1137
-
1138
- @@index([state])
1139
- @@index([expiresAt])
1140
- }
1141
-
1142
- /// Stores organization-level OAuth app credentials
1143
- /// Allows orgs (especially self-hosters) to use their own OAuth apps
1144
- model IntegrationOAuthApp {
1145
- id String @id @default(dbgenerated("generate_prefixed_cuid('ioa'::text)"))
1146
-
1147
- /// Provider slug (e.g., "github", "slack")
1148
- providerSlug String
1149
-
1150
- /// Organization that owns this OAuth app config
1151
- organizationId String
1152
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
1153
-
1154
- /// Encrypted client ID
1155
- encryptedClientId Json
1156
-
1157
- /// Encrypted client secret
1158
- encryptedClientSecret Json
1159
-
1160
- /// Optional: custom scopes (overrides manifest defaults)
1161
- customScopes String[]
1162
-
1163
- /// Provider-specific settings (e.g., Rippling app name for authorize URL)
1164
- /// Stored as JSON: { "appName": "compai533c" }
1165
- customSettings Json?
1166
-
1167
- /// Whether this config is active
1168
- isActive Boolean @default(true)
1169
-
1170
- createdAt DateTime @default(now())
1171
- updatedAt DateTime @updatedAt
1172
-
1173
- @@unique([providerSlug, organizationId])
1174
- @@index([organizationId])
1175
- @@index([providerSlug])
1176
- }
1177
-
1178
- /// Records check runs linked to tasks for compliance verification
1179
- model IntegrationCheckRun {
1180
- id String @id @default(dbgenerated("generate_prefixed_cuid('icr'::text)"))
1181
-
1182
- /// Parent connection
1183
- connectionId String
1184
- connection IntegrationConnection @relation(fields: [connectionId], references: [id], onDelete: Cascade)
1185
-
1186
- /// Task being verified (optional - checks can run without a task)
1187
- taskId String?
1188
- task Task? @relation(fields: [taskId], references: [id], onDelete: SetNull)
1189
-
1190
- /// Check ID from the manifest
1191
- checkId String
1192
-
1193
- /// Check name (denormalized for display)
1194
- checkName String
1195
-
1196
- /// Execution status
1197
- status IntegrationRunStatus @default(pending)
1198
-
1199
- /// Timestamps
1200
- startedAt DateTime?
1201
- completedAt DateTime?
1202
-
1203
- /// Duration in milliseconds
1204
- durationMs Int?
1205
-
1206
- /// Summary counts
1207
- totalChecked Int @default(0)
1208
- passedCount Int @default(0)
1209
- failedCount Int @default(0)
1210
-
1211
- /// Error message if failed
1212
- errorMessage String?
1213
-
1214
- /// Full execution logs (JSON array)
1215
- logs Json?
1216
-
1217
- createdAt DateTime @default(now())
1218
-
1219
- /// Results from this check run
1220
- results IntegrationCheckResult[]
1221
-
1222
- @@index([connectionId])
1223
- @@index([taskId])
1224
- @@index([checkId])
1225
- @@index([status])
1226
- @@index([createdAt])
1227
- }
1228
-
1229
- /// Stores individual results (pass/fail) from check runs
1230
- model IntegrationCheckResult {
1231
- id String @id @default(dbgenerated("generate_prefixed_cuid('icx'::text)"))
1232
-
1233
- /// Parent check run
1234
- checkRunId String
1235
- checkRun IntegrationCheckRun @relation(fields: [checkRunId], references: [id], onDelete: Cascade)
1236
-
1237
- /// Whether this result is a pass or fail
1238
- passed Boolean
1239
-
1240
- /// Resource classification
1241
- resourceType String
1242
- resourceId String
1243
-
1244
- /// Result details
1245
- title String
1246
- description String?
1247
-
1248
- /// Severity (for failures)
1249
- severity IntegrationFindingSeverity?
1250
-
1251
- /// Remediation guidance (for failures)
1252
- remediation String?
1253
-
1254
- /// Evidence/proof (JSON - API response data)
1255
- evidence Json?
1256
-
1257
- /// When this evidence was collected
1258
- collectedAt DateTime @default(now())
1259
-
1260
- @@index([checkRunId])
1261
- @@index([passed])
1262
- @@index([resourceType, resourceId])
1263
- }
1264
-
1265
- /// Stores platform-wide OAuth app credentials
1266
- /// Used by platform operators to provide default OAuth apps for all users
1267
- model IntegrationPlatformCredential {
1268
- id String @id @default(dbgenerated("generate_prefixed_cuid('ipc'::text)"))
1269
-
1270
- /// Provider slug (e.g., "github", "slack") - unique per platform
1271
- providerSlug String @unique
1272
-
1273
- /// Encrypted client ID
1274
- encryptedClientId Json
1275
-
1276
- /// Encrypted client secret
1277
- encryptedClientSecret Json
1278
-
1279
- /// Masked display hint for client ID (computed at write time)
1280
- clientIdHint String?
1281
-
1282
- /// Masked display hint for client secret (computed at write time)
1283
- clientSecretHint String?
1284
-
1285
- /// Optional: custom scopes (overrides manifest defaults)
1286
- customScopes String[]
1287
-
1288
- /// Provider-specific settings (e.g., Rippling app name for authorize URL)
1289
- /// Stored as JSON: { "appName": "compai533c" }
1290
- customSettings Json?
1291
-
1292
- /// Whether this credential is active
1293
- isActive Boolean @default(true)
1294
-
1295
- /// Who created this credential
1296
- createdById String?
1297
-
1298
- /// Who last updated this credential
1299
- updatedById String?
1300
-
1301
- createdAt DateTime @default(now())
1302
- updatedAt DateTime @updatedAt
1303
-
1304
- @@index([providerSlug])
1305
- }
1306
-
1307
-
1308
- // ===== integration-sync-log.prisma =====
1309
- // ===== Integration Sync Log =====
1310
- // Generic audit trail for integration sync operations (employee sync, role discovery, etc.)
1311
-
1312
- model IntegrationSyncLog {
1313
- id String @id @default(dbgenerated("generate_prefixed_cuid('isl'::text)"))
1314
- connectionId String
1315
- connection IntegrationConnection @relation(fields: [connectionId], references: [id], onDelete: Cascade)
1316
- organizationId String
1317
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
1318
-
1319
- /// Provider slug (e.g., "ramp", "google-workspace", "rippling", "jumpcloud")
1320
- provider String
1321
- /// Event type (e.g., "employee_sync", "role_discovery", "role_mapping_save")
1322
- eventType String
1323
- /// Execution status
1324
- status IntegrationSyncLogStatus @default(pending)
1325
- /// When the operation started executing
1326
- startedAt DateTime?
1327
- /// When the operation completed (success or failure)
1328
- completedAt DateTime?
1329
- /// Duration in milliseconds
1330
- durationMs Int?
1331
- /// Flexible result payload (e.g., { imported, deactivated, reactivated, skipped, errors })
1332
- result Json?
1333
- /// Error message if failed
1334
- error String?
1335
- /// How the sync was triggered: "manual", "scheduled", "api"
1336
- triggeredBy String?
1337
- /// User who triggered the sync (null for automated/cron)
1338
- userId String?
1339
-
1340
- createdAt DateTime @default(now())
1341
-
1342
- @@index([connectionId])
1343
- @@index([organizationId])
1344
- @@index([provider])
1345
- @@index([createdAt])
1346
- }
1347
-
1348
- enum IntegrationSyncLogStatus {
1349
- pending
1350
- running
1351
- success
1352
- failed
1353
- }
1354
-
1355
-
1356
- // ===== integration.prisma =====
1357
- model Integration {
1358
- id String @id @default(dbgenerated("generate_prefixed_cuid('int'::text)"))
1359
- name String
1360
- integrationId String
1361
- settings Json
1362
- userSettings Json
1363
- organizationId String
1364
- lastRunAt DateTime?
1365
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
1366
- results IntegrationResult[]
1367
-
1368
- @@index([organizationId])
1369
- }
1370
-
1371
- model IntegrationResult {
1372
- id String @id @default(dbgenerated("generate_prefixed_cuid('itr'::text)"))
1373
- title String?
1374
- description String?
1375
- remediation String?
1376
- status String?
1377
- severity String?
1378
- resultDetails Json?
1379
- completedAt DateTime? @default(now())
1380
- integrationId String
1381
- organizationId String
1382
- assignedUserId String?
1383
-
1384
- assignedUser User? @relation(fields: [assignedUserId], references: [id], onDelete: Cascade)
1385
- integration Integration @relation(fields: [integrationId], references: [id], onDelete: Cascade)
1386
-
1387
- @@index([integrationId])
1388
- }
1389
-
1390
-
1391
- // ===== knowledge-base-document.prisma =====
1392
- model KnowledgeBaseDocument {
1393
- id String @id @default(dbgenerated("generate_prefixed_cuid('kbd'::text)"))
1394
- name String // Original filename
1395
- description String? // Optional user description/notes
1396
- s3Key String // S3 storage key (e.g., "org123/knowledge-base-documents/timestamp-file.pdf")
1397
- fileType String // MIME type (e.g., "application/pdf")
1398
- fileSize Int // File size in bytes
1399
- processingStatus KnowledgeBaseDocumentProcessingStatus @default(pending) // Track indexing status
1400
- processedAt DateTime? // When indexing completed
1401
- triggerRunId String? // Trigger.dev run ID for tracking processing progress
1402
-
1403
- // Dates
1404
- createdAt DateTime @default(now())
1405
- updatedAt DateTime @updatedAt
1406
-
1407
- // Relationships
1408
- organizationId String
1409
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
1410
-
1411
- @@index([organizationId])
1412
- @@index([organizationId, processingStatus])
1413
- @@index([s3Key])
1414
- @@index([triggerRunId])
1415
- }
1416
-
1417
- enum KnowledgeBaseDocumentProcessingStatus {
1418
- pending // Uploaded but not yet processed/indexed
1419
- processing // Currently being processed/indexed
1420
- completed // Successfully indexed in vector database
1421
- failed // Processing failed
1422
- }
1423
-
1424
-
1425
- // ===== notification-policy.prisma =====
1426
- model RoleNotificationSetting {
1427
- id String @id @default(dbgenerated("generate_prefixed_cuid('rns'::text)"))
1428
- organizationId String
1429
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
1430
- role String // "owner", "admin", "auditor", "employee", "contractor", or custom role name
1431
-
1432
- policyNotifications Boolean @default(true)
1433
- taskReminders Boolean @default(true)
1434
- taskAssignments Boolean @default(true)
1435
- taskMentions Boolean @default(true)
1436
- weeklyTaskDigest Boolean @default(true)
1437
- findingNotifications Boolean @default(true)
1438
-
1439
- createdAt DateTime @default(now())
1440
- updatedAt DateTime @updatedAt
1441
-
1442
- @@unique([organizationId, role])
1443
- @@map("role_notification_setting")
1444
- }
1445
-
1446
-
1447
- // ===== onboarding.prisma =====
1448
- model Onboarding {
1449
- organizationId String @id
1450
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
1451
- policies Boolean @default(false)
1452
- employees Boolean @default(false)
1453
- vendors Boolean @default(false)
1454
- integrations Boolean @default(false)
1455
- risk Boolean @default(false)
1456
- team Boolean @default(false)
1457
- tasks Boolean @default(false)
1458
- callBooked Boolean @default(false)
1459
- companyBookingDetails Json?
1460
- companyDetails Json?
1461
- triggerJobId String?
1462
- triggerJobCompleted Boolean @default(false)
1463
-
1464
- @@index([organizationId])
1465
- }
1466
-
1467
-
1468
- // ===== org-chart.prisma =====
1469
- model OrganizationChart {
1470
- id String @id @default(dbgenerated("generate_prefixed_cuid('och'::text)"))
1471
- organizationId String @unique
1472
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
1473
- name String @default("Organization Chart")
1474
- type String @default("interactive") // "interactive" or "uploaded"
1475
- nodes Json @default("[]")
1476
- edges Json @default("[]")
1477
- uploadedImageUrl String? // S3 key when type="uploaded"
1478
- createdAt DateTime @default(now())
1479
- updatedAt DateTime @updatedAt
1480
-
1481
- @@index([organizationId])
1482
- }
1483
-
1484
-
1485
- // ===== organization-billing.prisma =====
1486
- model OrganizationBilling {
1487
- id String @id @default(dbgenerated("generate_prefixed_cuid('obil'::text)"))
1488
- organizationId String @unique @map("organization_id")
1489
- stripeCustomerId String @map("stripe_customer_id")
1490
- createdAt DateTime @default(now()) @map("created_at")
1491
- updatedAt DateTime @updatedAt @map("updated_at")
1492
-
1493
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
1494
- pentestSubscription PentestSubscription?
1495
-
1496
- @@map("organization_billing")
1497
- }
1498
-
1499
-
1500
- // ===== organization.prisma =====
1501
- model Organization {
1502
- id String @id @default(dbgenerated("generate_prefixed_cuid('org'::text)"))
1503
- name String
1504
- slug String @unique @default(dbgenerated("generate_prefixed_cuid('slug'::text)"))
1505
- logo String?
1506
- createdAt DateTime @default(now())
1507
- metadata String?
1508
- onboarding Onboarding?
1509
- website String?
1510
- onboardingCompleted Boolean @default(false)
1511
- hasAccess Boolean @default(false)
1512
- advancedModeEnabled Boolean @default(false)
1513
- evidenceApprovalEnabled Boolean @default(false)
1514
- deviceAgentStepEnabled Boolean @default(true)
1515
- securityTrainingStepEnabled Boolean @default(true)
1516
- whistleblowerReportEnabled Boolean @default(true)
1517
- accessRequestFormEnabled Boolean @default(true)
1518
-
1519
- // FleetDM
1520
- fleetDmLabelId Int?
1521
- isFleetSetupCompleted Boolean @default(false)
1522
-
1523
- // Employee sync provider (e.g., 'google-workspace', 'rippling')
1524
- // When set, the scheduled sync will only use this provider
1525
- employeeSyncProvider String?
1526
-
1527
- apiKeys ApiKey[]
1528
- auditLog AuditLog[]
1529
- controls Control[]
1530
- frameworkInstances FrameworkInstance[]
1531
- integrations Integration[]
1532
- invitations Invitation[]
1533
- members Member[]
1534
- policy Policy[]
1535
- risk Risk[]
1536
- vendors Vendor[]
1537
- tasks Task[]
1538
- taskItems TaskItem[]
1539
- comments Comment[]
1540
- attachments Attachment[]
1541
- evidenceSubmissions EvidenceSubmission[]
1542
- trust Trust[]
1543
- context Context[]
1544
- secrets Secret[]
1545
- securityPenetrationTestRuns SecurityPenetrationTestRun[]
1546
- trustAccessRequests TrustAccessRequest[]
1547
- trustNdaAgreements TrustNDAAgreement[]
1548
- trustDocuments TrustDocument[]
1549
- trustResources TrustResource[] @relation("OrganizationTrustResources")
1550
- trustCustomLinks TrustCustomLink[]
1551
- knowledgeBaseDocuments KnowledgeBaseDocument[]
1552
- questionnaires Questionnaire[]
1553
- securityQuestionnaireManualAnswers SecurityQuestionnaireManualAnswer[]
1554
- soaDocuments SOADocument[]
1555
- primaryColor String?
1556
- trustPortalFaqs Json? // Array of { question: string, answer: string, order: number }
1557
-
1558
- // Integration Platform
1559
- integrationConnections IntegrationConnection[]
1560
- integrationOAuthApps IntegrationOAuthApp[]
1561
- integrationSyncLogs IntegrationSyncLog[]
1562
-
1563
- // Pentest Subscription
1564
- pentestSubscription PentestSubscription?
1565
- billing OrganizationBilling?
1566
-
1567
- // Browser Automation
1568
- browserbaseContext BrowserbaseContext?
1569
- fleetPolicyResults FleetPolicyResult[]
1570
-
1571
- // Findings
1572
- findings Finding[]
1573
-
1574
- // Device Agent
1575
- devices Device[]
1576
-
1577
- // Org Chart
1578
- organizationChart OrganizationChart?
1579
-
1580
- // RBAC
1581
- organizationRoles OrganizationRole[]
1582
- roleNotificationSettings RoleNotificationSetting[]
1583
-
1584
- @@index([slug])
1585
- }
1586
-
1587
-
1588
- // ===== pentest-subscription.prisma =====
1589
- model PentestSubscription {
1590
- id String @id @default(dbgenerated("generate_prefixed_cuid('psub'::text)"))
1591
- organizationId String @unique @map("organization_id")
1592
- organizationBillingId String @unique @map("organization_billing_id")
1593
- stripeSubscriptionId String @map("stripe_subscription_id")
1594
- stripePriceId String @map("stripe_price_id")
1595
- stripeOveragePriceId String? @map("stripe_overage_price_id")
1596
- status String @default("active") // active | cancelled | past_due
1597
- includedRunsPerPeriod Int @default(3) @map("included_runs_per_period")
1598
- currentPeriodStart DateTime @map("current_period_start")
1599
- currentPeriodEnd DateTime @map("current_period_end")
1600
- createdAt DateTime @default(now()) @map("created_at")
1601
- updatedAt DateTime @updatedAt @map("updated_at")
1602
-
1603
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
1604
- organizationBilling OrganizationBilling @relation(fields: [organizationBillingId], references: [id])
1605
-
1606
- @@index([organizationId])
1607
- @@map("pentest_subscriptions")
1608
- }
1609
-
1610
-
1611
- // ===== policy.prisma =====
1612
- enum PolicyDisplayFormat {
1613
- EDITOR
1614
- PDF
1615
- }
1616
-
1617
- enum PolicyVisibility {
1618
- ALL // Visible to everyone in organization
1619
- DEPARTMENT // Only visible to specified departments
1620
- }
1621
-
1622
- model Policy {
1623
- id String @id @default(dbgenerated("generate_prefixed_cuid('pol'::text)"))
1624
- name String
1625
- description String?
1626
- status PolicyStatus @default(draft)
1627
- content Json[]
1628
- draftContent Json[] @default([])
1629
- frequency Frequency?
1630
- department Departments?
1631
- isRequiredToSign Boolean @default(true)
1632
- signedBy String[] @default([])
1633
- reviewDate DateTime?
1634
- isArchived Boolean @default(false)
1635
- displayFormat PolicyDisplayFormat @default(EDITOR)
1636
- pdfUrl String?
1637
-
1638
- // Visibility settings (for department-specific policies)
1639
- visibility PolicyVisibility @default(ALL)
1640
- visibleToDepartments Departments[] @default([])
1641
-
1642
- // Dates
1643
- createdAt DateTime @default(now())
1644
- updatedAt DateTime @updatedAt
1645
- lastArchivedAt DateTime?
1646
- lastPublishedAt DateTime?
1647
-
1648
- // Relationships
1649
- organizationId String
1650
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
1651
- assigneeId String?
1652
- assignee Member? @relation("PolicyAssignee", fields: [assigneeId], references: [id], onDelete: SetNull, onUpdate: Cascade)
1653
- approverId String?
1654
- approver Member? @relation("PolicyApprover", fields: [approverId], references: [id], onDelete: SetNull, onUpdate: Cascade)
1655
- policyTemplateId String?
1656
- policyTemplate FrameworkEditorPolicyTemplate? @relation(fields: [policyTemplateId], references: [id])
1657
- controls Control[]
1658
- currentVersionId String? @unique
1659
- currentVersion PolicyVersion? @relation("PolicyCurrentVersion", fields: [currentVersionId], references: [id])
1660
- pendingVersionId String?
1661
- versions PolicyVersion[] @relation("PolicyVersions")
1662
-
1663
- @@index([organizationId])
1664
- }
1665
-
1666
- model PolicyVersion {
1667
- id String @id @default(dbgenerated("generate_prefixed_cuid('pv'::text)"))
1668
- createdAt DateTime @default(now())
1669
- updatedAt DateTime @updatedAt
1670
-
1671
- // Relations
1672
- policyId String
1673
- policy Policy @relation("PolicyVersions", fields: [policyId], references: [id], onDelete: Cascade)
1674
- currentForPolicy Policy? @relation("PolicyCurrentVersion")
1675
-
1676
- // Version details
1677
- version Int
1678
- content Json[]
1679
- pdfUrl String?
1680
- publishedById String?
1681
- publishedBy Member? @relation("PolicyVersionPublisher", fields: [publishedById], references: [id], onDelete: SetNull)
1682
- changelog String?
1683
-
1684
- @@unique([policyId, version])
1685
- @@index([policyId])
1686
- @@index([createdAt])
1687
- }
1688
-
1689
-
1690
- // ===== questionnaire.prisma =====
1691
- model Questionnaire {
1692
- id String @id @default(dbgenerated("generate_prefixed_cuid('qst'::text)"))
1693
- filename String // Original filename
1694
- s3Key String // S3 storage key for the uploaded file
1695
- fileType String // MIME type (e.g., "application/pdf")
1696
- fileSize Int // File size in bytes
1697
- status QuestionnaireStatus @default(parsing) // Parsing status
1698
- parsedAt DateTime? // When parsing completed
1699
- totalQuestions Int @default(0) // Total number of questions parsed
1700
- answeredQuestions Int @default(0) // Number of questions with answers
1701
- source String @default("internal") // Source of the questionnaire: 'internal' (from app) or 'external' (from trust portal)
1702
-
1703
- // Dates
1704
- createdAt DateTime @default(now())
1705
- updatedAt DateTime @updatedAt
1706
-
1707
- // Relationships
1708
- organizationId String
1709
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
1710
- questions QuestionnaireQuestionAnswer[]
1711
- manualAnswers SecurityQuestionnaireManualAnswer[] // Manual answers saved from this questionnaire
1712
-
1713
- @@index([organizationId])
1714
- @@index([organizationId, createdAt])
1715
- @@index([status])
1716
- @@index([source])
1717
- }
1718
-
1719
- model QuestionnaireQuestionAnswer {
1720
- id String @id @default(dbgenerated("generate_prefixed_cuid('qqa'::text)"))
1721
- question String // The question text
1722
- answer String? // The answer (nullable if not provided in file or not generated yet)
1723
- status QuestionnaireAnswerStatus @default(untouched) // Answer status
1724
- questionIndex Int // Order/index of the question in the questionnaire
1725
- sources Json? // Sources used for generated answers (array of source objects)
1726
- generatedAt DateTime? // When answer was generated (if status is generated)
1727
- updatedBy String? // User ID who last updated the answer (if manual)
1728
-
1729
- // Dates
1730
- createdAt DateTime @default(now())
1731
- updatedAt DateTime @updatedAt
1732
-
1733
- // Relationships
1734
- questionnaireId String
1735
- questionnaire Questionnaire @relation(fields: [questionnaireId], references: [id], onDelete: Cascade)
1736
-
1737
- @@index([questionnaireId])
1738
- @@index([questionnaireId, questionIndex])
1739
- @@index([status])
1740
- }
1741
-
1742
- enum QuestionnaireStatus {
1743
- parsing // Currently being parsed
1744
- completed // Successfully parsed
1745
- failed // Parsing failed
1746
- }
1747
-
1748
- enum QuestionnaireAnswerStatus {
1749
- untouched // No answer yet (empty or not generated)
1750
- generated // AI generated answer
1751
- manual // Manually written/edited by user
1752
- }
1753
-
1754
-
1755
- // ===== requirement.prisma =====
1756
- model RequirementMap {
1757
- id String @id @default(dbgenerated("generate_prefixed_cuid('req'::text)"))
1758
-
1759
- requirementId String
1760
- requirement FrameworkEditorRequirement @relation(fields: [requirementId], references: [id], onDelete: Cascade)
1761
-
1762
- controlId String
1763
- control Control @relation(fields: [controlId], references: [id], onDelete: Cascade)
1764
-
1765
- frameworkInstanceId String
1766
- frameworkInstance FrameworkInstance @relation(fields: [frameworkInstanceId], references: [id], onDelete: Cascade)
1767
-
1768
- @@unique([controlId, frameworkInstanceId, requirementId])
1769
- @@index([requirementId, frameworkInstanceId])
1770
- }
1771
-
1772
-
1773
- // ===== risk.prisma =====
1774
- model Risk {
1775
- // Metadata
1776
- id String @id @default(dbgenerated("generate_prefixed_cuid('rsk'::text)"))
1777
- title String
1778
- description String
1779
- category RiskCategory
1780
- department Departments?
1781
- status RiskStatus @default(open)
1782
- likelihood Likelihood @default(very_unlikely)
1783
- impact Impact @default(insignificant)
1784
- residualLikelihood Likelihood @default(very_unlikely)
1785
- residualImpact Impact @default(insignificant)
1786
- treatmentStrategyDescription String?
1787
- treatmentStrategy RiskTreatmentType @default(accept)
1788
-
1789
- // Dates
1790
- createdAt DateTime @default(now())
1791
- updatedAt DateTime @updatedAt
1792
-
1793
- // Relationships
1794
- organizationId String
1795
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
1796
- assigneeId String?
1797
- assignee Member? @relation(fields: [assigneeId], references: [id])
1798
- tasks Task[]
1799
-
1800
- @@index([organizationId])
1801
- @@index([category])
1802
- @@index([status])
1803
- }
1804
-
1805
- enum RiskTreatmentType {
1806
- accept
1807
- avoid
1808
- mitigate
1809
- transfer
1810
- }
1811
-
1812
- enum RiskCategory {
1813
- customer
1814
- fraud
1815
- governance
1816
- operations
1817
- other
1818
- people
1819
- regulatory
1820
- reporting
1821
- resilience
1822
- technology
1823
- vendor_management
1824
- }
1825
-
1826
- enum RiskStatus {
1827
- open
1828
- pending
1829
- closed
1830
- archived
1831
- }
1832
-
1833
-
1834
- // ===== secret.prisma =====
1835
- model Secret {
1836
- id String @id @default(dbgenerated("generate_prefixed_cuid('sec'::text)"))
1837
- organizationId String @map("organization_id")
1838
- name String
1839
- value String @db.Text // Encrypted value
1840
- description String? @db.Text
1841
- category String? // e.g., "api", "webhook", "database", etc.
1842
- lastUsedAt DateTime? @map("last_used_at")
1843
- createdAt DateTime @default(now()) @map("created_at")
1844
- updatedAt DateTime @updatedAt @map("updated_at")
1845
-
1846
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
1847
-
1848
- @@unique([organizationId, name])
1849
- @@map("secrets")
1850
- }
1851
-
1852
-
1853
- // ===== security-penetration-test-run.prisma =====
1854
- model SecurityPenetrationTestRun {
1855
- id String @id @default(dbgenerated("generate_prefixed_cuid('ptr'::text)"))
1856
- organizationId String @map("organization_id")
1857
- providerRunId String @map("provider_run_id")
1858
- createdAt DateTime @default(now()) @map("created_at")
1859
- updatedAt DateTime @updatedAt @map("updated_at")
1860
-
1861
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
1862
-
1863
- @@unique([providerRunId])
1864
- @@index([organizationId])
1865
- @@map("security_penetration_test_runs")
1866
- }
1867
-
1868
-
1869
- // ===== security-questionnaire-manual-answer.prisma =====
1870
- model SecurityQuestionnaireManualAnswer {
1871
- id String @id @default(dbgenerated("generate_prefixed_cuid('sqma'::text)"))
1872
- question String // The question text
1873
- answer String // The answer text (required for saved answers)
1874
- tags String[] @default([]) // Optional tags for categorization
1875
-
1876
- // Optional reference to original questionnaire (for tracking)
1877
- sourceQuestionnaireId String?
1878
- sourceQuestionnaire Questionnaire? @relation(fields: [sourceQuestionnaireId], references: [id], onDelete: SetNull)
1879
-
1880
- // User who created/updated this answer
1881
- createdBy String? // User ID
1882
- updatedBy String? // User ID
1883
-
1884
- // Dates
1885
- createdAt DateTime @default(now())
1886
- updatedAt DateTime @updatedAt
1887
-
1888
- // Relationships
1889
- organizationId String
1890
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
1891
-
1892
- @@unique([organizationId, question]) // Prevent duplicate questions per organization
1893
- @@index([organizationId])
1894
- @@index([organizationId, question])
1895
- @@index([tags])
1896
- @@index([createdAt])
1897
- }
1898
-
1899
-
1900
- // ===== shared.prisma =====
1901
- model ApiKey {
1902
- id String @id @default(dbgenerated("generate_prefixed_cuid('apk'::text)"))
1903
- name String
1904
- key String @unique
1905
- keyPrefix String?
1906
- salt String?
1907
- createdAt DateTime @default(now())
1908
- expiresAt DateTime?
1909
- lastUsedAt DateTime?
1910
- isActive Boolean @default(true)
1911
- scopes String[] @default([])
1912
-
1913
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
1914
- organizationId String
1915
-
1916
- @@index([organizationId])
1917
- @@index([key])
1918
- @@index([keyPrefix])
1919
- }
1920
-
1921
- model AuditLog {
1922
- id String @id @default(dbgenerated("generate_prefixed_cuid('aud'::text)"))
1923
- timestamp DateTime @default(now())
1924
- organizationId String
1925
- userId String
1926
- memberId String?
1927
- data Json
1928
- description String?
1929
- entityId String?
1930
- entityType AuditLogEntityType?
1931
-
1932
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
1933
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
1934
- member Member? @relation(fields: [memberId], references: [id], onDelete: Cascade)
1935
-
1936
- @@index([userId])
1937
- @@index([organizationId])
1938
- @@index([memberId])
1939
- @@index([entityType])
1940
- }
1941
-
1942
- enum AuditLogEntityType {
1943
- organization
1944
- framework
1945
- requirement
1946
- control
1947
- policy
1948
- task
1949
- people
1950
- risk
1951
- vendor
1952
- tests
1953
- integration
1954
- trust
1955
- finding
1956
- }
1957
-
1958
- enum EvidenceFormType {
1959
- board_meeting @map("board-meeting")
1960
- it_leadership_meeting @map("it-leadership-meeting")
1961
- risk_committee_meeting @map("risk-committee-meeting")
1962
- meeting
1963
- access_request @map("access-request")
1964
- whistleblower_report @map("whistleblower-report")
1965
- penetration_test @map("penetration-test")
1966
- rbac_matrix @map("rbac-matrix")
1967
- infrastructure_inventory @map("infrastructure-inventory")
1968
- employee_performance_evaluation @map("employee-performance-evaluation")
1969
- network_diagram @map("network-diagram")
1970
- tabletop_exercise @map("tabletop-exercise")
1971
- }
1972
-
1973
- model GlobalVendors {
1974
- website String @id @unique
1975
- company_name String?
1976
- legal_name String?
1977
- company_description String?
1978
- company_hq_address String?
1979
- privacy_policy_url String?
1980
- terms_of_service_url String?
1981
- service_level_agreement_url String?
1982
- security_page_url String?
1983
- trust_page_url String?
1984
- security_certifications String[]
1985
- subprocessors String[]
1986
- type_of_company String?
1987
-
1988
- // Vendor Risk Assessment (shared across all organizations)
1989
- riskAssessmentData Json?
1990
- riskAssessmentVersion String?
1991
- riskAssessmentUpdatedAt DateTime?
1992
-
1993
- approved Boolean @default(false)
1994
- createdAt DateTime @default(now())
1995
-
1996
- @@index([website])
1997
- }
1998
-
1999
- enum Departments {
2000
- none
2001
- admin
2002
- gov
2003
- hr
2004
- it
2005
- itsm
2006
- qms
2007
- }
2008
-
2009
- enum Frequency {
2010
- monthly
2011
- quarterly
2012
- yearly
2013
- }
2014
-
2015
- enum Likelihood {
2016
- very_unlikely
2017
- unlikely
2018
- possible
2019
- likely
2020
- very_likely
2021
- }
2022
-
2023
- enum Impact {
2024
- insignificant
2025
- minor
2026
- moderate
2027
- major
2028
- severe
2029
- }
2030
-
2031
-
2032
- // ===== soa.prisma =====
2033
- // Statement of Applicability (SOA) Auto-complete Configuration and Answers
2034
-
2035
- model SOAFrameworkConfiguration {
2036
- id String @id @default(dbgenerated("generate_prefixed_cuid('soa_cfg'::text)"))
2037
- frameworkId String
2038
- framework FrameworkEditorFramework @relation(fields: [frameworkId], references: [id], onDelete: Cascade)
2039
-
2040
- // Configuration versioning - allows multiple configurations per framework
2041
- version Int @default(1) // Version number for this configuration (increments when config changes)
2042
- isLatest Boolean @default(true) // Whether this is the latest configuration version
2043
-
2044
- // Column definitions for SOA structure (template used when creating new documents)
2045
- columns Json // Array of { name: string, type: string } objects
2046
- // Example: [{ name: "Control ID", type: "string" }, { name: "Control Name", type: "string" }, { name: "Applicable", type: "boolean" }, { name: "Justification", type: "text" }]
2047
-
2048
- // Predefined questions for this framework
2049
- // Documents reference a specific configuration version via SOADocument.configurationId
2050
- // Old documents keep their old config version, new documents use new config version
2051
- questions Json // Array of question objects with unique IDs
2052
- // Example: [{ id: "A.5.1.1", text: "Is this control applicable?", columnMapping: "Applicable", controlId: "A.5.1.1" }, ...]
2053
- // IMPORTANT: question.id must be unique and stable - this is what SOAAnswer.questionId references
2054
-
2055
- // Dates
2056
- createdAt DateTime @default(now())
2057
- updatedAt DateTime @updatedAt
2058
-
2059
- // Relationships
2060
- documents SOADocument[]
2061
-
2062
- @@unique([frameworkId, version]) // Prevent duplicate configuration versions
2063
- @@index([frameworkId])
2064
- @@index([frameworkId, version])
2065
- @@index([frameworkId, isLatest])
2066
- }
2067
-
2068
- model SOADocument {
2069
- id String @id @default(dbgenerated("generate_prefixed_cuid('soa_doc'::text)"))
2070
-
2071
- // Framework and organization context
2072
- frameworkId String
2073
- framework FrameworkEditorFramework @relation(fields: [frameworkId], references: [id], onDelete: Cascade)
2074
- organizationId String
2075
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
2076
-
2077
- // Configuration reference - references a specific SOAFrameworkConfiguration version
2078
- // Each document version can use a different configuration version
2079
- // Old documents keep their old config, new documents use new config
2080
- configurationId String
2081
- configuration SOAFrameworkConfiguration @relation(fields: [configurationId], references: [id], onDelete: Cascade)
2082
-
2083
- // Document versioning
2084
- version Int @default(1) // Version number for this document (increments yearly)
2085
- isLatest Boolean @default(true) // Whether this is the latest version
2086
-
2087
- // Document status
2088
- status SOADocumentStatus @default(draft) // draft, in_progress, completed
2089
-
2090
- // Document metadata
2091
- totalQuestions Int @default(0) // Total number of questions in this document
2092
- answeredQuestions Int @default(0) // Number of questions with answers
2093
-
2094
- // Approval tracking
2095
- preparedBy String @default("Comp AI") // Always "Comp AI"
2096
- approverId String? // Member ID who will approve this document (set when submitted for approval)
2097
- approver Member? @relation("SOADocumentApprover", fields: [approverId], references: [id], onDelete: SetNull, onUpdate: Cascade)
2098
- approvedAt DateTime? // When document was approved
2099
-
2100
- // Dates
2101
- completedAt DateTime? // When document was completed
2102
- createdAt DateTime @default(now())
2103
- updatedAt DateTime @updatedAt
2104
-
2105
- // Relationships
2106
- answers SOAAnswer[]
2107
-
2108
- @@unique([frameworkId, organizationId, version]) // Prevent duplicate versions
2109
- @@index([frameworkId, organizationId])
2110
- @@index([frameworkId, organizationId, version])
2111
- @@index([frameworkId, organizationId, isLatest])
2112
- @@index([configurationId])
2113
- @@index([status])
2114
- }
2115
-
2116
- model SOAAnswer {
2117
- id String @id @default(dbgenerated("generate_prefixed_cuid('soa_ans'::text)"))
2118
-
2119
- // Document context (replaces direct framework/organization link)
2120
- documentId String
2121
- document SOADocument @relation(fields: [documentId], references: [id], onDelete: Cascade)
2122
-
2123
- // Question reference - references question.id from SOADocument.configuration.questions
2124
- // References the specific configuration version that the document uses
2125
- // If config changes, old documents still reference their old config version
2126
- questionId String // Must match a question.id from SOADocument.configuration.questions
2127
-
2128
- // Answer data - simple text answer
2129
- answer String? // Text answer (nullable if not generated yet)
2130
-
2131
- // Answer metadata
2132
- status SOAAnswerStatus @default(untouched) // untouched, generated, manual
2133
- sources Json? // Sources used for generated answers (similar to questionnaire)
2134
- generatedAt DateTime? // When answer was generated
2135
-
2136
- // Answer versioning (within the document)
2137
- answerVersion Int @default(1) // Version number for this specific answer
2138
- isLatestAnswer Boolean @default(true) // Whether this is the latest version of this answer
2139
-
2140
- // User tracking
2141
- createdBy String? // User ID who created this answer
2142
- updatedBy String? // User ID who last updated this answer
2143
-
2144
- // Dates
2145
- createdAt DateTime @default(now())
2146
- updatedAt DateTime @updatedAt
2147
-
2148
- @@unique([documentId, questionId, answerVersion]) // Prevent duplicate answer versions
2149
- @@index([documentId])
2150
- @@index([documentId, questionId])
2151
- @@index([documentId, questionId, isLatestAnswer])
2152
- @@index([status])
2153
- }
2154
-
2155
- enum SOADocumentStatus {
2156
- draft // Document is being created/edited
2157
- in_progress // Document is being generated
2158
- needs_review // Document is submitted for approval
2159
- completed // Document is complete and approved
2160
- }
2161
-
2162
- enum SOAAnswerStatus {
2163
- untouched // No answer yet (not generated)
2164
- generated // AI generated answer
2165
- manual // Manually written/edited by user
2166
- }
2167
-
2168
-
2169
- // ===== task-item.prisma =====
2170
- model TaskItem {
2171
- id String @id @default(dbgenerated("generate_prefixed_cuid('tski'::text)"))
2172
- title String
2173
- description String?
2174
- status TaskItemStatus @default(todo)
2175
- priority TaskItemPriority @default(medium)
2176
-
2177
- // Polymorphic relation (like Comment and Attachment)
2178
- entityId String
2179
- entityType TaskItemEntityType
2180
-
2181
- // Assignment (nullable)
2182
- assigneeId String?
2183
- assignee Member? @relation("TaskItemAssignee", fields: [assigneeId], references: [id], onDelete: SetNull)
2184
-
2185
- // Creator & Updater
2186
- createdById String
2187
- createdBy Member @relation("TaskItemCreator", fields: [createdById], references: [id])
2188
- updatedById String?
2189
- updatedBy Member? @relation("TaskItemUpdater", fields: [updatedById], references: [id])
2190
-
2191
- // Relationships
2192
- organizationId String
2193
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
2194
-
2195
- // Dates
2196
- createdAt DateTime @default(now())
2197
- updatedAt DateTime @updatedAt
2198
-
2199
- @@index([entityId, entityType])
2200
- @@index([organizationId])
2201
- @@index([assigneeId])
2202
- @@index([status])
2203
- @@index([priority])
2204
- }
2205
-
2206
- enum TaskItemStatus {
2207
- todo
2208
- in_progress
2209
- in_review
2210
- done
2211
- canceled
2212
- }
2213
-
2214
- enum TaskItemPriority {
2215
- urgent
2216
- high
2217
- medium
2218
- low
2219
- }
2220
-
2221
- enum TaskItemEntityType {
2222
- vendor
2223
- risk
2224
- }
2225
-
2226
-
2227
- // ===== task.prisma =====
2228
- model Task {
2229
- // Metadata
2230
- id String @id @default(dbgenerated("generate_prefixed_cuid('tsk'::text)"))
2231
- title String
2232
- description String
2233
- status TaskStatus @default(todo)
2234
- automationStatus TaskAutomationStatus @default(AUTOMATED)
2235
- frequency TaskFrequency?
2236
- department Departments? @default(none)
2237
- order Int @default(0)
2238
-
2239
- // Dates
2240
- createdAt DateTime @default(now())
2241
- updatedAt DateTime @updatedAt
2242
- lastCompletedAt DateTime?
2243
- reviewDate DateTime?
2244
-
2245
- // Relationships
2246
- assigneeId String?
2247
- assignee Member? @relation(fields: [assigneeId], references: [id])
2248
- organizationId String
2249
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
2250
- taskTemplateId String?
2251
- taskTemplate FrameworkEditorTaskTemplate? @relation(fields: [taskTemplateId], references: [id])
2252
- controls Control[]
2253
- vendors Vendor[]
2254
- risks Risk[]
2255
- evidenceAutomations EvidenceAutomation[]
2256
- browserAutomations BrowserAutomation[]
2257
-
2258
- evidenceAutomationRuns EvidenceAutomationRun[]
2259
- integrationCheckRuns IntegrationCheckRun[]
2260
- findings Finding[]
2261
-
2262
- // Evidence approval
2263
- approverId String?
2264
- approver Member? @relation("TaskApprover", fields: [approverId], references: [id])
2265
- approvedAt DateTime?
2266
- previousStatus TaskStatus?
2267
- }
2268
-
2269
- enum TaskStatus {
2270
- todo
2271
- in_progress
2272
- in_review
2273
- done
2274
- not_relevant
2275
- failed
2276
- }
2277
-
2278
- enum TaskFrequency {
2279
- daily
2280
- weekly
2281
- monthly
2282
- quarterly
2283
- yearly
2284
- }
2285
-
2286
- enum TaskAutomationStatus {
2287
- AUTOMATED
2288
- MANUAL
2289
- }
2290
-
2291
-
2292
- // ===== trust.prisma =====
2293
- model Trust {
2294
- organizationId String
2295
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
2296
- friendlyUrl String? @unique
2297
- domain String?
2298
- domainVerified Boolean @default(false)
2299
- isVercelDomain Boolean @default(false)
2300
- vercelVerification String?
2301
- status TrustStatus @default(published)
2302
- contactEmail String?
2303
-
2304
- /// Domains that bypass NDA signing when requesting trust portal access
2305
- allowedDomains String[] @default([])
2306
-
2307
- email String?
2308
- privacyPolicy String?
2309
- soc2 Boolean @default(false)
2310
- soc2type1 Boolean @default(false)
2311
- soc2type2 Boolean @default(false)
2312
- iso27001 Boolean @default(false)
2313
- iso42001 Boolean @default(false)
2314
- nen7510 Boolean @default(false)
2315
- gdpr Boolean @default(false)
2316
- hipaa Boolean @default(false)
2317
- pci_dss Boolean @default(false)
2318
- iso9001 Boolean @default(false)
2319
-
2320
- soc2_status FrameworkStatus @default(started)
2321
- soc2type1_status FrameworkStatus @default(started)
2322
- soc2type2_status FrameworkStatus @default(started)
2323
- iso27001_status FrameworkStatus @default(started)
2324
- iso42001_status FrameworkStatus @default(started)
2325
- nen7510_status FrameworkStatus @default(started)
2326
- gdpr_status FrameworkStatus @default(started)
2327
- hipaa_status FrameworkStatus @default(started)
2328
- pci_dss_status FrameworkStatus @default(started)
2329
- iso9001_status FrameworkStatus @default(started)
2330
-
2331
- // Overview section for public trust portal
2332
- overviewTitle String?
2333
- overviewContent String? // Markdown content with links
2334
- showOverview Boolean @default(false)
2335
-
2336
- // Favicon for trust portal (stored in S3)
2337
- favicon String?
2338
-
2339
- @@id([status, organizationId])
2340
- @@unique([organizationId])
2341
- @@index([organizationId])
2342
- @@index([friendlyUrl])
2343
- }
2344
-
2345
- enum TrustStatus {
2346
- draft
2347
- published
2348
- }
2349
-
2350
- enum FrameworkStatus {
2351
- started
2352
- in_progress
2353
- compliant
2354
- }
2355
-
2356
- enum TrustFramework {
2357
- iso_27001
2358
- iso_42001
2359
- gdpr
2360
- hipaa
2361
- soc2_type1
2362
- soc2_type2
2363
- pci_dss
2364
- nen_7510
2365
- iso_9001
2366
- }
2367
-
2368
- model TrustResource {
2369
- id String @id @default(dbgenerated("generate_prefixed_cuid('tcr'::text)"))
2370
- organizationId String
2371
- organization Organization @relation("OrganizationTrustResources", fields: [organizationId], references: [id], onDelete: Cascade)
2372
- framework TrustFramework
2373
- s3Key String
2374
- fileName String
2375
- fileSize Int
2376
- createdAt DateTime @default(now())
2377
- updatedAt DateTime @updatedAt
2378
-
2379
- @@unique([organizationId, framework])
2380
- @@index([organizationId])
2381
- }
2382
-
2383
- model TrustAccessRequest {
2384
- id String @id @default(dbgenerated("generate_prefixed_cuid('tar'::text)"))
2385
- organizationId String
2386
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
2387
-
2388
- name String
2389
- email String
2390
- company String?
2391
- jobTitle String?
2392
- purpose String?
2393
- requestedDurationDays Int?
2394
-
2395
- status TrustAccessRequestStatus @default(under_review)
2396
- reviewerMemberId String?
2397
- reviewer Member? @relation("TrustAccessRequestReviewer", fields: [reviewerMemberId], references: [id], onDelete: SetNull)
2398
- reviewedAt DateTime?
2399
- decisionReason String?
2400
-
2401
- ipAddress String?
2402
- userAgent String?
2403
-
2404
- createdAt DateTime @default(now())
2405
- updatedAt DateTime @updatedAt
2406
-
2407
- grant TrustAccessGrant? @relation("RequestGrant")
2408
- ndaAgreements TrustNDAAgreement[] @relation("RequestNDA")
2409
-
2410
- @@index([organizationId])
2411
- @@index([email])
2412
- @@index([status])
2413
- @@index([organizationId, status])
2414
- }
2415
-
2416
- model TrustAccessGrant {
2417
- id String @id @default(dbgenerated("generate_prefixed_cuid('tag'::text)"))
2418
-
2419
- accessRequestId String @unique
2420
- accessRequest TrustAccessRequest @relation("RequestGrant", fields: [accessRequestId], references: [id], onDelete: Cascade)
2421
-
2422
- subjectEmail String
2423
-
2424
- status TrustAccessGrantStatus @default(active)
2425
- expiresAt DateTime
2426
-
2427
- accessToken String? @unique
2428
- accessTokenExpiresAt DateTime?
2429
-
2430
- issuedByMemberId String?
2431
- issuedBy Member? @relation("IssuedGrants", fields: [issuedByMemberId], references: [id], onDelete: SetNull)
2432
-
2433
- revokedAt DateTime?
2434
- revokedByMemberId String?
2435
- revokedBy Member? @relation("RevokedGrants", fields: [revokedByMemberId], references: [id], onDelete: SetNull)
2436
- revokeReason String?
2437
-
2438
- createdAt DateTime @default(now())
2439
- updatedAt DateTime @updatedAt
2440
-
2441
- ndaAgreement TrustNDAAgreement? @relation("GrantNDA")
2442
-
2443
- @@index([accessRequestId])
2444
- @@index([subjectEmail])
2445
- @@index([status])
2446
- @@index([expiresAt])
2447
- @@index([status, expiresAt])
2448
- @@index([accessToken])
2449
- }
2450
-
2451
- enum TrustAccessRequestStatus {
2452
- under_review
2453
- approved
2454
- denied
2455
- canceled
2456
- }
2457
-
2458
- enum TrustAccessGrantStatus {
2459
- active
2460
- expired
2461
- revoked
2462
- }
2463
-
2464
- model TrustNDAAgreement {
2465
- id String @id @default(dbgenerated("generate_prefixed_cuid('tna'::text)"))
2466
-
2467
- organizationId String
2468
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
2469
-
2470
- accessRequestId String
2471
- accessRequest TrustAccessRequest @relation("RequestNDA", fields: [accessRequestId], references: [id], onDelete: Cascade)
2472
-
2473
- grantId String? @unique
2474
- grant TrustAccessGrant? @relation("GrantNDA", fields: [grantId], references: [id], onDelete: SetNull)
2475
-
2476
- signerName String?
2477
- signerEmail String?
2478
-
2479
- status TrustNDAStatus @default(pending)
2480
-
2481
- signToken String @unique
2482
- signTokenExpiresAt DateTime
2483
-
2484
- pdfTemplateKey String?
2485
- pdfSignedKey String?
2486
-
2487
- signedAt DateTime?
2488
-
2489
- ipAddress String?
2490
- userAgent String?
2491
-
2492
- createdAt DateTime @default(now())
2493
- updatedAt DateTime @updatedAt
2494
-
2495
- @@index([organizationId])
2496
- @@index([accessRequestId])
2497
- @@index([signToken])
2498
- @@index([status])
2499
- }
2500
-
2501
- enum TrustNDAStatus {
2502
- pending
2503
- signed
2504
- void
2505
- }
2506
-
2507
- model TrustDocument {
2508
- id String @id @default(dbgenerated("generate_prefixed_cuid('tdoc'::text)"))
2509
-
2510
- organizationId String
2511
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
2512
-
2513
- name String
2514
- description String?
2515
- s3Key String
2516
-
2517
- isActive Boolean @default(true)
2518
-
2519
- createdAt DateTime @default(now())
2520
- updatedAt DateTime @updatedAt
2521
-
2522
- @@index([organizationId])
2523
- @@index([organizationId, isActive])
2524
- }
2525
-
2526
- model TrustCustomLink {
2527
- id String @id @default(dbgenerated("generate_prefixed_cuid('tcl'::text)"))
2528
-
2529
- organizationId String
2530
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
2531
-
2532
- title String
2533
- description String?
2534
- url String
2535
- order Int @default(0)
2536
- isActive Boolean @default(true)
2537
-
2538
- createdAt DateTime @default(now())
2539
- updatedAt DateTime @updatedAt
2540
-
2541
- @@index([organizationId])
2542
- @@index([organizationId, isActive, order])
2543
- }
2544
-
2545
-
2546
- // ===== vendor.prisma =====
2547
- model Vendor {
2548
- id String @id @default(dbgenerated("generate_prefixed_cuid('vnd'::text)"))
2549
- name String
2550
- description String
2551
- category VendorCategory @default(other)
2552
- status VendorStatus @default(not_assessed)
2553
- inherentProbability Likelihood @default(very_unlikely)
2554
- inherentImpact Impact @default(insignificant)
2555
- residualProbability Likelihood @default(very_unlikely)
2556
- residualImpact Impact @default(insignificant)
2557
- website String?
2558
- isSubProcessor Boolean @default(false)
2559
-
2560
- // Trust Portal display settings
2561
- logoUrl String?
2562
- showOnTrustPortal Boolean @default(false)
2563
- trustPortalOrder Int?
2564
- complianceBadges Json? // Array of { type: 'soc2' | 'iso27001' | etc, verified: boolean }
2565
-
2566
- createdAt DateTime @default(now())
2567
- updatedAt DateTime @updatedAt
2568
-
2569
- organizationId String
2570
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
2571
- assigneeId String?
2572
- assignee Member? @relation(fields: [assigneeId], references: [id], onDelete: Cascade)
2573
- contacts VendorContact[]
2574
- tasks Task[]
2575
-
2576
- @@index([organizationId])
2577
- @@index([assigneeId])
2578
- @@index([category])
2579
- }
2580
-
2581
- model VendorContact {
2582
- id String @id @default(dbgenerated("generate_prefixed_cuid('vct'::text)"))
2583
- vendorId String
2584
- name String
2585
- email String
2586
- phone String
2587
- createdAt DateTime @default(now())
2588
- updatedAt DateTime @updatedAt
2589
- Vendor Vendor @relation(fields: [vendorId], references: [id], onDelete: Cascade)
2590
-
2591
- @@index([vendorId])
2592
- }
2593
-
2594
- enum VendorCategory {
2595
- cloud
2596
- infrastructure
2597
- software_as_a_service
2598
- finance
2599
- marketing
2600
- sales
2601
- hr
2602
- other
2603
- }
2604
-
2605
- enum VendorStatus {
2606
- not_assessed
2607
- in_progress
2608
- assessed
2609
- }