@actuate-media/cms-core 0.29.0 → 0.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/dist/__tests__/actions/seo-fields-update.test.d.ts +2 -0
  2. package/dist/__tests__/actions/seo-fields-update.test.d.ts.map +1 -0
  3. package/dist/__tests__/actions/seo-fields-update.test.js +93 -0
  4. package/dist/__tests__/actions/seo-fields-update.test.js.map +1 -0
  5. package/dist/__tests__/api/admin-contracts.test.js +10 -2
  6. package/dist/__tests__/api/admin-contracts.test.js.map +1 -1
  7. package/dist/__tests__/api/llms-txt.test.d.ts +2 -0
  8. package/dist/__tests__/api/llms-txt.test.d.ts.map +1 -0
  9. package/dist/__tests__/api/llms-txt.test.js +77 -0
  10. package/dist/__tests__/api/llms-txt.test.js.map +1 -0
  11. package/dist/__tests__/api/public-seo.test.js +2 -0
  12. package/dist/__tests__/api/public-seo.test.js.map +1 -1
  13. package/dist/__tests__/api/seo-read-access.test.d.ts +2 -0
  14. package/dist/__tests__/api/seo-read-access.test.d.ts.map +1 -0
  15. package/dist/__tests__/api/seo-read-access.test.js +101 -0
  16. package/dist/__tests__/api/seo-read-access.test.js.map +1 -0
  17. package/dist/__tests__/api/seo-summary-ssrf.test.d.ts +2 -0
  18. package/dist/__tests__/api/seo-summary-ssrf.test.d.ts.map +1 -0
  19. package/dist/__tests__/api/seo-summary-ssrf.test.js +80 -0
  20. package/dist/__tests__/api/seo-summary-ssrf.test.js.map +1 -0
  21. package/dist/__tests__/api/sitemap-pagination.test.d.ts +2 -0
  22. package/dist/__tests__/api/sitemap-pagination.test.d.ts.map +1 -0
  23. package/dist/__tests__/api/sitemap-pagination.test.js +100 -0
  24. package/dist/__tests__/api/sitemap-pagination.test.js.map +1 -0
  25. package/dist/__tests__/forms/forms-service.test.d.ts +2 -0
  26. package/dist/__tests__/forms/forms-service.test.d.ts.map +1 -0
  27. package/dist/__tests__/forms/forms-service.test.js +193 -0
  28. package/dist/__tests__/forms/forms-service.test.js.map +1 -0
  29. package/dist/__tests__/middleware.test.d.ts +2 -0
  30. package/dist/__tests__/middleware.test.d.ts.map +1 -0
  31. package/dist/__tests__/middleware.test.js +50 -0
  32. package/dist/__tests__/middleware.test.js.map +1 -0
  33. package/dist/__tests__/seo/analysis-markdown.test.d.ts +2 -0
  34. package/dist/__tests__/seo/analysis-markdown.test.d.ts.map +1 -0
  35. package/dist/__tests__/seo/analysis-markdown.test.js +57 -0
  36. package/dist/__tests__/seo/analysis-markdown.test.js.map +1 -0
  37. package/dist/__tests__/seo/audit-runner.test.d.ts +2 -0
  38. package/dist/__tests__/seo/audit-runner.test.d.ts.map +1 -0
  39. package/dist/__tests__/seo/audit-runner.test.js +135 -0
  40. package/dist/__tests__/seo/audit-runner.test.js.map +1 -0
  41. package/dist/__tests__/seo/internal-collections.test.d.ts +2 -0
  42. package/dist/__tests__/seo/internal-collections.test.d.ts.map +1 -0
  43. package/dist/__tests__/seo/internal-collections.test.js +27 -0
  44. package/dist/__tests__/seo/internal-collections.test.js.map +1 -0
  45. package/dist/__tests__/seo/page-meta.test.js +34 -2
  46. package/dist/__tests__/seo/page-meta.test.js.map +1 -1
  47. package/dist/__tests__/seo/robots.test.js +23 -2
  48. package/dist/__tests__/seo/robots.test.js.map +1 -1
  49. package/dist/actions.d.ts +24 -0
  50. package/dist/actions.d.ts.map +1 -1
  51. package/dist/actions.js +63 -0
  52. package/dist/actions.js.map +1 -1
  53. package/dist/api/handlers.d.ts.map +1 -1
  54. package/dist/api/handlers.js +744 -196
  55. package/dist/api/handlers.js.map +1 -1
  56. package/dist/config/types.d.ts +49 -0
  57. package/dist/config/types.d.ts.map +1 -1
  58. package/dist/cron/index.d.ts +1 -0
  59. package/dist/cron/index.d.ts.map +1 -1
  60. package/dist/cron/index.js +10 -1
  61. package/dist/cron/index.js.map +1 -1
  62. package/dist/forms/entries.d.ts +45 -0
  63. package/dist/forms/entries.d.ts.map +1 -0
  64. package/dist/forms/entries.js +348 -0
  65. package/dist/forms/entries.js.map +1 -0
  66. package/dist/forms/index.d.ts +4 -0
  67. package/dist/forms/index.d.ts.map +1 -1
  68. package/dist/forms/index.js +3 -0
  69. package/dist/forms/index.js.map +1 -1
  70. package/dist/forms/service.d.ts +92 -0
  71. package/dist/forms/service.d.ts.map +1 -0
  72. package/dist/forms/service.js +579 -0
  73. package/dist/forms/service.js.map +1 -0
  74. package/dist/forms/types.d.ts +244 -0
  75. package/dist/forms/types.d.ts.map +1 -0
  76. package/dist/forms/types.js +36 -0
  77. package/dist/forms/types.js.map +1 -0
  78. package/dist/index.d.ts +2 -2
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +1 -1
  81. package/dist/index.js.map +1 -1
  82. package/dist/middleware.js +12 -2
  83. package/dist/middleware.js.map +1 -1
  84. package/dist/seo/analysis.d.ts +9 -0
  85. package/dist/seo/analysis.d.ts.map +1 -1
  86. package/dist/seo/analysis.js +45 -6
  87. package/dist/seo/analysis.js.map +1 -1
  88. package/dist/seo/audit-runner.d.ts +43 -2
  89. package/dist/seo/audit-runner.d.ts.map +1 -1
  90. package/dist/seo/audit-runner.js +86 -7
  91. package/dist/seo/audit-runner.js.map +1 -1
  92. package/dist/seo/index.d.ts +3 -2
  93. package/dist/seo/index.d.ts.map +1 -1
  94. package/dist/seo/index.js +2 -2
  95. package/dist/seo/index.js.map +1 -1
  96. package/dist/seo/page-meta.d.ts +6 -0
  97. package/dist/seo/page-meta.d.ts.map +1 -1
  98. package/dist/seo/page-meta.js +22 -5
  99. package/dist/seo/page-meta.js.map +1 -1
  100. package/dist/seo/robots.d.ts +7 -0
  101. package/dist/seo/robots.d.ts.map +1 -1
  102. package/dist/seo/robots.js +10 -1
  103. package/dist/seo/robots.js.map +1 -1
  104. package/dist/seo/score.d.ts +5 -1
  105. package/dist/seo/score.d.ts.map +1 -1
  106. package/dist/seo/score.js +7 -4
  107. package/dist/seo/score.js.map +1 -1
  108. package/package.json +1 -1
  109. package/prisma/cms-schema.prisma +81 -7
  110. package/prisma/migrations/0010_forms/migration.sql +130 -0
  111. package/prisma/schema.prisma +130 -35
package/dist/seo/score.js CHANGED
@@ -12,7 +12,7 @@
12
12
  * the admin UI can show editors what to fix. The unit tests in
13
13
  * `__tests__/seo/score.test.ts` are the source of truth for the weights.
14
14
  */
15
- import { stripHtmlTags } from './analysis.js';
15
+ import { extractHeadings, stripHtmlTags } from './analysis.js';
16
16
  /** Page score weights. Must sum to 100. */
17
17
  export const PAGE_SEO_WEIGHTS = {
18
18
  metaTitlePresent: 10,
@@ -52,10 +52,13 @@ export function gradeForSeoScore(score) {
52
52
  return 'poor';
53
53
  return 'critical';
54
54
  }
55
- /** Count `<h1>` tags in an HTML string (case-insensitive). */
55
+ /**
56
+ * Count H1 headings in content that may be HTML or Markdown (case-insensitive
57
+ * for HTML tags, ATX `#`/Setext `===` for Markdown), so markdown-bodied posts
58
+ * aren't penalised for a "missing" H1 that is actually present.
59
+ */
56
60
  export function countH1(html) {
57
- const matches = html.match(/<h1[\s>]/gi);
58
- return matches ? matches.length : 0;
61
+ return extractHeadings(html, 1).length;
59
62
  }
60
63
  function wordCountOf(content) {
61
64
  const text = stripHtmlTags(content);
@@ -1 +1 @@
1
- {"version":3,"file":"score.js","sourceRoot":"","sources":["../../src/seo/score.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"score.js","sourceRoot":"","sources":["../../src/seo/score.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@actuate-media/cms-core",
3
- "version": "0.29.0",
3
+ "version": "0.31.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/actuate-media/actuatecms.git",
@@ -209,18 +209,92 @@ model Redirect {
209
209
  @@index([createdAt])
210
210
  }
211
211
 
212
+ model FormSchemaVersion {
213
+ id String @id @default(cuid())
214
+ formId String
215
+ version Int
216
+ fields Json
217
+ notes String?
218
+ createdById String?
219
+ createdAt DateTime @default(now())
220
+
221
+ @@unique([formId, version])
222
+ @@index([formId])
223
+ }
224
+
212
225
  model FormSubmission {
213
- id String @id @default(cuid())
214
- formId String
215
- form Document @relation(fields: [formId], references: [id], onDelete: Cascade)
216
- data Json
217
- attribution Json?
218
- submittedAt DateTime @default(now())
219
- createdAt DateTime @default(now())
226
+ id String @id @default(cuid())
227
+ entryNumber Int?
228
+ formId String
229
+ form Document @relation(fields: [formId], references: [id], onDelete: Cascade)
230
+ schemaVersionId String?
231
+ data Json
232
+ normalizedData Json?
233
+ attribution Json?
234
+ senderName String?
235
+ senderEmail String?
236
+ senderPhone String?
237
+ preview String?
238
+ status String @default("new")
239
+ unread Boolean @default(true)
240
+ starred Boolean @default(false)
241
+ archived Boolean @default(false)
242
+ spamStatus String @default("clean")
243
+ ipAddressHash String?
244
+ userAgent String?
245
+ referrer String?
246
+ pageUrl String?
247
+ utmSource String?
248
+ utmMedium String?
249
+ utmCampaign String?
250
+ submittedAt DateTime @default(now())
251
+ readAt DateTime?
252
+ archivedAt DateTime?
253
+ createdAt DateTime @default(now())
254
+ updatedAt DateTime @updatedAt
255
+
256
+ files FormSubmissionFile[]
220
257
 
221
258
  @@index([formId])
222
259
  @@index([submittedAt])
223
260
  @@index([createdAt])
261
+ @@index([unread])
262
+ @@index([starred])
263
+ @@index([archived])
264
+ }
265
+
266
+ model FormSubmissionFile {
267
+ id String @id @default(cuid())
268
+ submissionId String
269
+ fieldKey String
270
+ mediaAssetId String?
271
+ fileName String
272
+ mimeType String
273
+ sizeBytes Int
274
+ storageKey String
275
+ publicUrl String?
276
+ secureDownloadUrl String?
277
+ createdAt DateTime @default(now())
278
+
279
+ submission FormSubmission @relation(fields: [submissionId], references: [id], onDelete: Cascade)
280
+
281
+ @@index([submissionId])
282
+ }
283
+
284
+ model FormWebhook {
285
+ id String @id @default(cuid())
286
+ formId String
287
+ url String
288
+ secret String
289
+ enabled Boolean @default(true)
290
+ events Json
291
+ retryCount Int @default(0)
292
+ lastDeliveryAt DateTime?
293
+ lastDeliveryStatus String?
294
+ createdAt DateTime @default(now())
295
+ updatedAt DateTime @updatedAt
296
+
297
+ @@index([formId])
224
298
  }
225
299
 
226
300
  model AuditLog {
@@ -0,0 +1,130 @@
1
+ -- Forms system
2
+ --
3
+ -- Expands the Forms feature from a single flat submissions table into a real
4
+ -- submission workflow with schema versioning, per-submission file attachments,
5
+ -- and per-form webhooks.
6
+ --
7
+ -- * actuate_form_submissions: new workflow columns (entryNumber, sender*,
8
+ -- unread/starred/archived, spamStatus, attribution metadata, schema version
9
+ -- link, normalizedData, read/archived timestamps, updatedAt).
10
+ -- * actuate_form_schema_versions: versioned field-schema snapshots so old
11
+ -- submissions always render against the schema they were captured with.
12
+ -- * actuate_form_submission_files: file-upload metadata (storage keys, not
13
+ -- blobs) with cascade delete from its submission.
14
+ -- * actuate_form_webhooks: per-form signed outbound webhooks.
15
+ --
16
+ -- Safe to apply to a populated database:
17
+ -- * Every new column on actuate_form_submissions is nullable or has a default.
18
+ -- * updatedAt is backfilled from createdAt for existing rows before the NOT
19
+ -- NULL default takes over for new rows.
20
+ -- * No existing column is dropped or retyped. formId stays a loose string
21
+ -- (no new FK) so historical rows with orphaned formIds are not rejected.
22
+
23
+ -- ---------------------------------------------------------------------------
24
+ -- actuate_form_submissions new columns
25
+ -- ---------------------------------------------------------------------------
26
+ ALTER TABLE "actuate_form_submissions"
27
+ ADD COLUMN "entryNumber" INTEGER,
28
+ ADD COLUMN "schemaVersionId" TEXT,
29
+ ADD COLUMN "normalizedData" JSONB,
30
+ ADD COLUMN "senderName" TEXT,
31
+ ADD COLUMN "senderEmail" TEXT,
32
+ ADD COLUMN "senderPhone" TEXT,
33
+ ADD COLUMN "preview" TEXT,
34
+ ADD COLUMN "unread" BOOLEAN NOT NULL DEFAULT true,
35
+ ADD COLUMN "starred" BOOLEAN NOT NULL DEFAULT false,
36
+ ADD COLUMN "archived" BOOLEAN NOT NULL DEFAULT false,
37
+ ADD COLUMN "spamStatus" TEXT NOT NULL DEFAULT 'clean',
38
+ ADD COLUMN "ipAddressHash" TEXT,
39
+ ADD COLUMN "userAgent" TEXT,
40
+ ADD COLUMN "referrer" TEXT,
41
+ ADD COLUMN "pageUrl" TEXT,
42
+ ADD COLUMN "utmSource" TEXT,
43
+ ADD COLUMN "utmMedium" TEXT,
44
+ ADD COLUMN "utmCampaign" TEXT,
45
+ ADD COLUMN "readAt" TIMESTAMP(3),
46
+ ADD COLUMN "archivedAt" TIMESTAMP(3),
47
+ ADD COLUMN "updatedAt" TIMESTAMP(3);
48
+
49
+ -- Backfill updatedAt for existing rows, then enforce NOT NULL with a default
50
+ -- so new inserts (and Prisma's @updatedAt) always have a value.
51
+ UPDATE "actuate_form_submissions" SET "updatedAt" = "createdAt" WHERE "updatedAt" IS NULL;
52
+ ALTER TABLE "actuate_form_submissions"
53
+ ALTER COLUMN "updatedAt" SET NOT NULL,
54
+ ALTER COLUMN "updatedAt" SET DEFAULT CURRENT_TIMESTAMP;
55
+
56
+ -- Existing rows predate the read/unread workflow; treat them as already read so
57
+ -- they don't all light up as unread in the new inbox.
58
+ UPDATE "actuate_form_submissions" SET "unread" = false WHERE "status" <> 'new';
59
+
60
+ CREATE INDEX "actuate_form_submissions_unread_idx" ON "actuate_form_submissions" ("unread");
61
+ CREATE INDEX "actuate_form_submissions_starred_idx" ON "actuate_form_submissions" ("starred");
62
+ CREATE INDEX "actuate_form_submissions_archived_idx" ON "actuate_form_submissions" ("archived");
63
+ CREATE INDEX "actuate_form_submissions_spamStatus_idx" ON "actuate_form_submissions" ("spamStatus");
64
+ CREATE INDEX "actuate_form_submissions_submittedAt_idx" ON "actuate_form_submissions" ("submittedAt");
65
+ CREATE INDEX "actuate_form_submissions_senderEmail_idx" ON "actuate_form_submissions" ("senderEmail");
66
+
67
+ -- ---------------------------------------------------------------------------
68
+ -- actuate_form_schema_versions
69
+ -- ---------------------------------------------------------------------------
70
+ CREATE TABLE "actuate_form_schema_versions" (
71
+ "id" TEXT NOT NULL,
72
+ "formId" TEXT NOT NULL,
73
+ "version" INTEGER NOT NULL,
74
+ "fields" JSONB NOT NULL,
75
+ "notes" TEXT,
76
+ "createdById" TEXT,
77
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
78
+ CONSTRAINT "actuate_form_schema_versions_pkey" PRIMARY KEY ("id")
79
+ );
80
+
81
+ CREATE UNIQUE INDEX "actuate_form_schema_versions_formId_version_key"
82
+ ON "actuate_form_schema_versions" ("formId", "version");
83
+ CREATE INDEX "actuate_form_schema_versions_formId_idx"
84
+ ON "actuate_form_schema_versions" ("formId");
85
+
86
+ -- ---------------------------------------------------------------------------
87
+ -- actuate_form_submission_files
88
+ -- ---------------------------------------------------------------------------
89
+ CREATE TABLE "actuate_form_submission_files" (
90
+ "id" TEXT NOT NULL,
91
+ "submissionId" TEXT NOT NULL,
92
+ "fieldKey" TEXT NOT NULL,
93
+ "mediaAssetId" TEXT,
94
+ "fileName" TEXT NOT NULL,
95
+ "mimeType" TEXT NOT NULL,
96
+ "sizeBytes" INTEGER NOT NULL,
97
+ "storageKey" TEXT NOT NULL,
98
+ "publicUrl" TEXT,
99
+ "secureDownloadUrl" TEXT,
100
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
101
+ CONSTRAINT "actuate_form_submission_files_pkey" PRIMARY KEY ("id")
102
+ );
103
+
104
+ CREATE INDEX "actuate_form_submission_files_submissionId_idx"
105
+ ON "actuate_form_submission_files" ("submissionId");
106
+
107
+ ALTER TABLE "actuate_form_submission_files"
108
+ ADD CONSTRAINT "actuate_form_submission_files_submissionId_fkey"
109
+ FOREIGN KEY ("submissionId") REFERENCES "actuate_form_submissions"("id")
110
+ ON DELETE CASCADE ON UPDATE CASCADE;
111
+
112
+ -- ---------------------------------------------------------------------------
113
+ -- actuate_form_webhooks
114
+ -- ---------------------------------------------------------------------------
115
+ CREATE TABLE "actuate_form_webhooks" (
116
+ "id" TEXT NOT NULL,
117
+ "formId" TEXT NOT NULL,
118
+ "url" TEXT NOT NULL,
119
+ "secret" TEXT NOT NULL,
120
+ "enabled" BOOLEAN NOT NULL DEFAULT true,
121
+ "events" JSONB NOT NULL,
122
+ "retryCount" INTEGER NOT NULL DEFAULT 0,
123
+ "lastDeliveryAt" TIMESTAMP(3),
124
+ "lastDeliveryStatus" TEXT,
125
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
126
+ "updatedAt" TIMESTAMP(3) NOT NULL,
127
+ CONSTRAINT "actuate_form_webhooks_pkey" PRIMARY KEY ("id")
128
+ );
129
+
130
+ CREATE INDEX "actuate_form_webhooks_formId_idx" ON "actuate_form_webhooks" ("formId");
@@ -561,30 +561,30 @@ model SeoAuditRun {
561
561
  /// hash of (type + entityId/url) used to carry status across runs so a
562
562
  /// resolved/ignored issue stays resolved/ignored when re-detected.
563
563
  model SeoIssue {
564
- id String @id @default(cuid())
565
- auditRunId String?
566
- issueKey String
567
- entityType String?
568
- entityId String?
569
- entityTitle String?
570
- url String?
571
- severity SeoIssueSeverity
572
- category SeoIssueCategory
573
- type String
574
- title String
575
- description String?
576
- impact String?
577
- recommendation String?
578
- status SeoIssueStatus @default(open)
579
- fixable Boolean @default(false)
580
- fixActionType String?
564
+ id String @id @default(cuid())
565
+ auditRunId String?
566
+ issueKey String
567
+ entityType String?
568
+ entityId String?
569
+ entityTitle String?
570
+ url String?
571
+ severity SeoIssueSeverity
572
+ category SeoIssueCategory
573
+ type String
574
+ title String
575
+ description String?
576
+ impact String?
577
+ recommendation String?
578
+ status SeoIssueStatus @default(open)
579
+ fixable Boolean @default(false)
580
+ fixActionType String?
581
581
  relatedEntityIds Json?
582
- source String @default("audit")
583
- firstDetectedAt DateTime @default(now())
584
- lastDetectedAt DateTime @default(now())
585
- resolvedAt DateTime?
586
- resolvedById String?
587
- metadata Json?
582
+ source String @default("audit")
583
+ firstDetectedAt DateTime @default(now())
584
+ lastDetectedAt DateTime @default(now())
585
+ resolvedAt DateTime?
586
+ resolvedById String?
587
+ metadata Json?
588
588
 
589
589
  auditRun SeoAuditRun? @relation(fields: [auditRunId], references: [id], onDelete: SetNull)
590
590
 
@@ -599,13 +599,13 @@ model SeoIssue {
599
599
  /// A 404 hit observed by the redirect middleware. Aggregated per path so
600
600
  /// the Redirects tab can surface "broken URLs still getting traffic".
601
601
  model Redirect404Hit {
602
- id String @id @default(cuid())
603
- path String
604
- hits Int @default(1)
605
- referrer String?
606
- resolvedAt DateTime?
607
- firstSeenAt DateTime @default(now())
608
- lastSeenAt DateTime @default(now())
602
+ id String @id @default(cuid())
603
+ path String
604
+ hits Int @default(1)
605
+ referrer String?
606
+ resolvedAt DateTime?
607
+ firstSeenAt DateTime @default(now())
608
+ lastSeenAt DateTime @default(now())
609
609
 
610
610
  @@unique([path])
611
611
  @@index([lastSeenAt])
@@ -632,20 +632,115 @@ model RedirectSuggestion {
632
632
  @@map("actuate_redirect_suggestions")
633
633
  }
634
634
 
635
- model FormSubmission {
635
+ // A versioned snapshot of a form's field schema. Saving a form's schema in
636
+ // the admin creates a new row here; submissions reference the version they
637
+ // were captured against so historical entries always render with the fields
638
+ // that existed at submit time, even after the live form schema changes.
639
+ model FormSchemaVersion {
636
640
  id String @id @default(cuid())
637
641
  formId String
638
- data Json
639
- attribution Json?
640
- status String @default("new")
641
- submittedAt DateTime @default(now())
642
+ version Int
643
+ fields Json
644
+ notes String?
645
+ createdById String?
642
646
  createdAt DateTime @default(now())
643
647
 
648
+ @@unique([formId, version])
649
+ @@index([formId])
650
+ @@map("actuate_form_schema_versions")
651
+ }
652
+
653
+ model FormSubmission {
654
+ id String @id @default(cuid())
655
+ // Per-instance sequential number shown in the UI (e.g. #00001). Assigned by
656
+ // the submission service inside a transaction; nullable for legacy rows.
657
+ entryNumber Int?
658
+ formId String
659
+ schemaVersionId String?
660
+ data Json
661
+ // Server-derived, type-coerced view of `data` (e.g. checkbox -> bool,
662
+ // number -> number) used for export/search. `data` keeps the raw payload.
663
+ normalizedData Json?
664
+ attribution Json?
665
+ senderName String?
666
+ senderEmail String?
667
+ senderPhone String?
668
+ preview String?
669
+ // Legacy free-form status ('new'); superseded by the booleans below but
670
+ // retained so existing rows/integrations keep working.
671
+ status String @default("new")
672
+ unread Boolean @default(true)
673
+ starred Boolean @default(false)
674
+ archived Boolean @default(false)
675
+ spamStatus String @default("clean")
676
+ ipAddressHash String?
677
+ userAgent String?
678
+ referrer String?
679
+ pageUrl String?
680
+ utmSource String?
681
+ utmMedium String?
682
+ utmCampaign String?
683
+ submittedAt DateTime @default(now())
684
+ readAt DateTime?
685
+ archivedAt DateTime?
686
+ createdAt DateTime @default(now())
687
+ updatedAt DateTime @updatedAt
688
+
689
+ files FormSubmissionFile[]
690
+
644
691
  @@index([formId])
645
692
  @@index([status])
693
+ @@index([unread])
694
+ @@index([starred])
695
+ @@index([archived])
696
+ @@index([spamStatus])
697
+ @@index([submittedAt])
698
+ @@index([senderEmail])
646
699
  @@map("actuate_form_submissions")
647
700
  }
648
701
 
702
+ // File attachments for a submission. Files are stored via the configured
703
+ // storage adapter (never inline in the DB); this row tracks metadata and the
704
+ // storage key needed to mint a secure download link.
705
+ model FormSubmissionFile {
706
+ id String @id @default(cuid())
707
+ submissionId String
708
+ fieldKey String
709
+ mediaAssetId String?
710
+ fileName String
711
+ mimeType String
712
+ sizeBytes Int
713
+ storageKey String
714
+ publicUrl String?
715
+ secureDownloadUrl String?
716
+ createdAt DateTime @default(now())
717
+
718
+ submission FormSubmission @relation(fields: [submissionId], references: [id], onDelete: Cascade)
719
+
720
+ @@index([submissionId])
721
+ @@map("actuate_form_submission_files")
722
+ }
723
+
724
+ // Per-form outbound webhook configuration. Distinct from the global
725
+ // WebhookEndpoint registry so form owners can wire delivery without admin
726
+ // access to site-wide webhooks.
727
+ model FormWebhook {
728
+ id String @id @default(cuid())
729
+ formId String
730
+ url String
731
+ secret String
732
+ enabled Boolean @default(true)
733
+ events Json
734
+ retryCount Int @default(0)
735
+ lastDeliveryAt DateTime?
736
+ lastDeliveryStatus String?
737
+ createdAt DateTime @default(now())
738
+ updatedAt DateTime @updatedAt
739
+
740
+ @@index([formId])
741
+ @@map("actuate_form_webhooks")
742
+ }
743
+
649
744
  model BackupRecord {
650
745
  id String @id @default(cuid())
651
746
  filename String