Files
sehuatang/server/sql/001_init.sql
2026-03-18 00:27:04 +08:00

131 lines
5.3 KiB
SQL

CREATE DATABASE IF NOT EXISTS magnet_cloud CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE magnet_cloud;
CREATE TABLE IF NOT EXISTS users (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
email VARCHAR(191) NOT NULL,
password_hash VARCHAR(255) NOT NULL,
status TINYINT NOT NULL DEFAULT 1,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uk_users_email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS devices (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
user_id BIGINT UNSIGNED NOT NULL,
device_name VARCHAR(191) NOT NULL,
device_fingerprint VARCHAR(191) NOT NULL,
last_seen_at TIMESTAMP NULL DEFAULT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uk_devices_user_fp (user_id, device_fingerprint),
CONSTRAINT fk_devices_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS auth_tokens (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
user_id BIGINT UNSIGNED NOT NULL,
token_hash CHAR(64) NOT NULL,
device_fingerprint VARCHAR(191) DEFAULT NULL,
expires_at TIMESTAMP NOT NULL,
last_seen_at TIMESTAMP NULL DEFAULT NULL,
revoked_at TIMESTAMP NULL DEFAULT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uk_auth_tokens_hash (token_hash),
KEY idx_auth_tokens_user (user_id),
KEY idx_auth_tokens_exp (expires_at),
CONSTRAINT fk_auth_tokens_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS user_keyrings (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
user_id BIGINT UNSIGNED NOT NULL,
wrapped_dek TEXT NOT NULL,
kdf_salt VARCHAR(255) NOT NULL,
kdf_params JSON NULL,
key_version INT NOT NULL DEFAULT 1,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uk_user_keyrings_user (user_id),
CONSTRAINT fk_user_keyrings_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS vault_items (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
user_id BIGINT UNSIGNED NOT NULL,
item_type VARCHAR(64) NOT NULL,
item_key VARCHAR(191) NOT NULL,
payload_ciphertext LONGTEXT NOT NULL,
payload_iv VARCHAR(64) NOT NULL,
payload_tag VARCHAR(64) NOT NULL,
payload_hash CHAR(64) NOT NULL,
key_version INT NOT NULL DEFAULT 1,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uk_vault_user_item (user_id, item_type, item_key),
KEY idx_vault_user_type (user_id, item_type),
CONSTRAINT fk_vault_items_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS shared_thread_cache (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
forum_key VARCHAR(128) NOT NULL,
thread_key VARCHAR(191) NOT NULL,
url_hash CHAR(64) NOT NULL,
title_hash CHAR(64) NOT NULL,
magnet_count INT NOT NULL DEFAULT 0,
payload_ciphertext LONGTEXT NOT NULL,
payload_iv VARCHAR(64) NOT NULL,
payload_tag VARCHAR(64) NOT NULL,
payload_hash CHAR(64) NOT NULL,
last_seen_at TIMESTAMP NULL DEFAULT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uk_shared_thread (forum_key, thread_key),
KEY idx_shared_thread_seen (forum_key, last_seen_at),
KEY idx_shared_thread_hash (payload_hash)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS shared_coverage_cache (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
forum_key VARCHAR(128) NOT NULL,
start_page INT NOT NULL,
end_page INT NOT NULL,
strategy VARCHAR(64) NOT NULL,
thread_count INT NOT NULL DEFAULT 0,
crawled_at TIMESTAMP NULL DEFAULT NULL,
payload_ciphertext LONGTEXT NOT NULL,
payload_iv VARCHAR(64) NOT NULL,
payload_tag VARCHAR(64) NOT NULL,
payload_hash CHAR(64) NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uk_shared_coverage (forum_key, start_page, end_page, strategy),
KEY idx_shared_coverage_crawled (forum_key, crawled_at),
KEY idx_shared_coverage_hash (payload_hash)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS shared_page_cache (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
forum_key VARCHAR(128) NOT NULL,
page INT NOT NULL,
thread_count INT NOT NULL DEFAULT 0,
crawled_at TIMESTAMP NULL DEFAULT NULL,
payload_ciphertext LONGTEXT NOT NULL,
payload_iv VARCHAR(64) NOT NULL,
payload_tag VARCHAR(64) NOT NULL,
payload_hash CHAR(64) NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uk_shared_page (forum_key, page),
KEY idx_shared_page_crawled (forum_key, crawled_at),
KEY idx_shared_page_hash (payload_hash)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;