seedproject-web/api/db/migrations/005_create_cja_contact.sql

37 lines
1.5 KiB
MySQL
Raw Normal View History

-- Contact form submissions.
--
-- `subject` is stored as free text (a slug from a known list), not an ENUM.
-- ENUMs need a migration every time an option is added; the list of enquiry
-- types will change more often than the schema should. The controller
-- validates against the allowed set, so bad values never reach here.
--
-- Anti-spam and audit columns live alongside the message: a honeypot outcome,
-- the origin IP, and the user agent. These make it possible to review what got
-- flagged without a separate log.
CREATE TABLE IF NOT EXISTS `cja_contact` (
`contact_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(160) NOT NULL,
`email` varchar(255) NOT NULL,
`subject` varchar(60) NOT NULL DEFAULT 'other',
`message` text NOT NULL,
-- lifecycle so the inbox is workable, not just a dump
`status` enum('new','read','replied','spam','archived')
NOT NULL DEFAULT 'new',
-- audit / anti-spam
`ip` varchar(45) DEFAULT NULL, -- v4 or v6
`user_agent` varchar(255) DEFAULT NULL,
`referrer` varchar(255) DEFAULT NULL,
`created_at` datetime NOT NULL DEFAULT current_timestamp(),
`updated_at` datetime NOT NULL DEFAULT current_timestamp()
ON UPDATE current_timestamp(),
PRIMARY KEY (`contact_id`),
KEY `idx_cja_contact_status` (`status`, `created_at`),
KEY `idx_cja_contact_email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;