- contact.php now inserts submissions into MySQL via PDO prepared statements; raw values stored (htmlspecialchars moved to output only) - www/includes/db.php: shared PDO helper with auto-migration that adds the is_read column to existing deployments without a full DB reset - docker/mysql/init.sql: added is_read TINYINT column to contacts table for fresh deploys - www/pages/admin-inbox.php: self-contained staff inbox at /staff-portal with session-based password login, per-message mark-as-read, and mark-all-read; unread count shown in browser tab title - index.php: routes /staff-portal before public header/footer so the admin page is fully standalone - docker-compose.yml: ADMIN_PASS env var wired to web container Set ADMIN_PASS in .env (gitignored) before deploying. If the DB volume already exists, the auto-migration in db.php will add the is_read column automatically on first request. https://claude.ai/code/session_015wpwmheufcxkBuXivrSHhd
25 lines
884 B
SQL
25 lines
884 B
SQL
-- ALWISP Database Schema (skeleton)
|
|
CREATE DATABASE IF NOT EXISTS `alwisp` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
|
USE `alwisp`;
|
|
|
|
-- Contact form submissions
|
|
CREATE TABLE IF NOT EXISTS `contacts` (
|
|
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
`name` VARCHAR(120) NOT NULL,
|
|
`email` VARCHAR(255) NOT NULL,
|
|
`phone` VARCHAR(30),
|
|
`subject` VARCHAR(255),
|
|
`message` TEXT NOT NULL,
|
|
`is_read` TINYINT(1) NOT NULL DEFAULT 0,
|
|
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
) ENGINE=InnoDB;
|
|
|
|
-- Service availability zones (placeholder)
|
|
CREATE TABLE IF NOT EXISTS `coverage_zones` (
|
|
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
`zone_name` VARCHAR(120) NOT NULL,
|
|
`description` TEXT,
|
|
`active` TINYINT(1) DEFAULT 1,
|
|
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
) ENGINE=InnoDB;
|