37 lines
1.5 KiB
MySQL
37 lines
1.5 KiB
MySQL
|
|
-- 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;
|