MAI-98 ContactMessage model + ContactTopic enum #1

Merged
wess merged 1 commit from wc/mai-98-contact-messages into main 2026-08-04 18:53:15 +02:00
Owner

Backs POST /v1/contact. Additive: a new table, a new enum, no change to any
existing model.

The row exists so a queued email that never sends is a delayed reply rather than
a lost message, and so support has something to triage against. reference is
the short code the sender is shown and can quote; it is uniquely indexed, so a
collision surfaces as a write error instead of one message overwriting another.

ip/userAgent are kept for abuse forensics only — the endpoint is unauthenticated,
rate-limited and honeypotted, and when those are defeated the pattern is what
identifies it.

Branched off the detached HEAD this submodule was sitting on rather than
committing onto it, so b3cd247 (onboarding_completed_at, not on main) is carried
along instead of orphaned.

Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com

Backs POST /v1/contact. Additive: a new table, a new enum, no change to any existing model. The row exists so a queued email that never sends is a delayed reply rather than a lost message, and so support has something to triage against. `reference` is the short code the sender is shown and can quote; it is uniquely indexed, so a collision surfaces as a write error instead of one message overwriting another. ip/userAgent are kept for abuse forensics only — the endpoint is unauthenticated, rate-limited and honeypotted, and when those are defeated the pattern is what identifies it. Branched off the detached HEAD this submodule was sitting on rather than committing onto it, so b3cd247 (onboarding_completed_at, not on main) is carried along instead of orphaned. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Backs POST /v1/contact. Additive: a new table, a new enum, no change to any
existing model.

The row exists so a queued email that never sends is a delayed reply rather than
a lost message, and so support has something to triage against. `reference` is
the short code the sender is shown and can quote; it is uniquely indexed, so a
collision surfaces as a write error instead of one message overwriting another.

ip/userAgent are kept for abuse forensics only — the endpoint is unauthenticated,
rate-limited and honeypotted, and when those are defeated the pattern is what
identifies it.

Branched off the detached HEAD this submodule was sitting on rather than
committing onto it, so b3cd247 (onboarding_completed_at, not on main) is carried
along instead of orphaned.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
wess merged commit 9e09fa99c4 into main 2026-08-04 18:53:15 +02:00
wess deleted branch wc/mai-98-contact-messages 2026-08-04 18:53:15 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
investment-nerds/prisma!1
No description provided.