CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL,
full_name VARCHAR(255) NOT NULL,
is_admin TINYINT(1) NOT NULL DEFAULT 0,
status ENUM('pending','active','suspended') NOT NULL DEFAULT 'pending',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
last_login_at DATETIME NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS member_profiles (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
display_name VARCHAR(255) NOT NULL,
photo_url VARCHAR(255) NULL,
short_bio TEXT NULL,
city VARCHAR(255) NULL,
links_json TEXT NULL,
CONSTRAINT fk_member_profiles_user
FOREIGN KEY (user_id) REFERENCES users(id)
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS uploads (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
image_url VARCHAR(255) NOT NULL,
quote_text TEXT NOT NULL,
attribution VARCHAR(255) NULL,
is_approved TINYINT(1) NOT NULL DEFAULT 0,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_uploads_user
FOREIGN KEY (user_id) REFERENCES users(id)
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS visits (
id INT AUTO_INCREMENT PRIMARY KEY,
path VARCHAR(255) NOT NULL,
user_id INT NULL,
ip_address VARCHAR(45) NOT NULL,
user_agent VARCHAR(255) NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
INDEX idx_visits_path (path),
INDEX idx_visits_created_at (created_at),
CONSTRAINT fk_visits_user
FOREIGN KEY (user_id) REFERENCES users(id)
ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS contact_messages (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL,
message TEXT NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Post interactions (likes/dislikes/comments) for uploaded posts
-- Reactions: one reaction per user per upload
CREATE TABLE IF NOT EXISTS upload_reactions (
id INT AUTO_INCREMENT PRIMARY KEY,
upload_id INT NOT NULL,
user_id INT NOT NULL,
reaction ENUM('like', 'dislike') NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_upload_reactions_upload
FOREIGN KEY (upload_id) REFERENCES uploads(id)
ON DELETE CASCADE,
CONSTRAINT fk_upload_reactions_user
FOREIGN KEY (user_id) REFERENCES users(id)
ON DELETE CASCADE,
UNIQUE KEY uq_upload_reactions_upload_user (upload_id, user_id),
INDEX idx_upload_reactions_upload (upload_id),
INDEX idx_upload_reactions_user (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Comments: multiple per user per upload
CREATE TABLE IF NOT EXISTS upload_comments (
id INT AUTO_INCREMENT PRIMARY KEY,
upload_id INT NOT NULL,
user_id INT NOT NULL,
body TEXT NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_upload_comments_upload
FOREIGN KEY (upload_id) REFERENCES uploads(id)
ON DELETE CASCADE,
CONSTRAINT fk_upload_comments_user
FOREIGN KEY (user_id) REFERENCES users(id)
ON DELETE CASCADE,
INDEX idx_upload_comments_upload_created (upload_id, created_at),
INDEX idx_upload_comments_user_created (user_id, created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- RSVPs per dinner date (one row per user per date)
CREATE TABLE IF NOT EXISTS rsvps (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
dinner_date DATE NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_rsvps_user
FOREIGN KEY (user_id) REFERENCES users(id)
ON DELETE CASCADE,
UNIQUE KEY uq_rsvps_user_date (user_id, dinner_date),
INDEX idx_rsvps_dinner_date (dinner_date),
INDEX idx_rsvps_user (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Chat messages per dinner date (last 24 hours are shown in UI)
CREATE TABLE IF NOT EXISTS chat_messages (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
dinner_date DATE NOT NULL,
body TEXT NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_chat_messages_user
FOREIGN KEY (user_id) REFERENCES users(id)
ON DELETE CASCADE,
INDEX idx_chat_messages_dinner_date_created (dinner_date, created_at),
INDEX idx_chat_messages_user (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;