2026-04-25 13:21:39 +08:00

140 lines
5.3 KiB
SQL

CREATE DATABASE IF NOT EXISTS hy_user DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE hy_user;
CREATE TABLE IF NOT EXISTS users (
user_id BIGINT NOT NULL PRIMARY KEY,
default_display_user_id VARCHAR(32) NOT NULL,
current_display_user_id VARCHAR(32) NOT NULL,
current_display_user_id_kind VARCHAR(32) NOT NULL,
current_display_user_id_expires_at_ms BIGINT NULL,
status VARCHAR(32) NOT NULL,
created_at_ms BIGINT NOT NULL,
updated_at_ms BIGINT NOT NULL,
UNIQUE KEY uk_users_default_display_user_id (default_display_user_id),
UNIQUE KEY uk_users_current_display_user_id (current_display_user_id),
KEY idx_users_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS user_display_user_ids (
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
display_user_id VARCHAR(32) NOT NULL,
user_id BIGINT NOT NULL,
display_user_id_kind VARCHAR(32) NOT NULL,
status VARCHAR(32) NOT NULL,
assigned_at_ms BIGINT NOT NULL,
activated_at_ms BIGINT NULL,
expires_at_ms BIGINT NULL,
released_at_ms BIGINT NULL,
release_reason VARCHAR(64) NULL,
created_at_ms BIGINT NOT NULL,
updated_at_ms BIGINT NOT NULL,
live_display_user_id VARCHAR(32)
GENERATED ALWAYS AS (
CASE
WHEN status IN ('active', 'held', 'reserved', 'blocked') THEN display_user_id
ELSE NULL
END
) STORED,
active_user_id BIGINT
GENERATED ALWAYS AS (
CASE WHEN status = 'active' THEN user_id ELSE NULL END
) STORED,
UNIQUE KEY uk_user_display_user_ids_live (live_display_user_id),
UNIQUE KEY uk_user_display_user_ids_active_user (active_user_id),
KEY idx_user_display_user_ids_user_id (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS pretty_display_user_id_leases (
lease_id VARCHAR(64) NOT NULL PRIMARY KEY,
display_user_id VARCHAR(32) NOT NULL,
user_id BIGINT NOT NULL,
status VARCHAR(32) NOT NULL,
starts_at_ms BIGINT NOT NULL,
expires_at_ms BIGINT NOT NULL,
payment_receipt_id VARCHAR(64) NULL,
source VARCHAR(32) NOT NULL,
created_at_ms BIGINT NOT NULL,
updated_at_ms BIGINT NOT NULL,
active_display_user_id VARCHAR(32)
GENERATED ALWAYS AS (
CASE WHEN status = 'active' THEN display_user_id ELSE NULL END
) STORED,
active_user_id BIGINT
GENERATED ALWAYS AS (
CASE WHEN status = 'active' THEN user_id ELSE NULL END
) STORED,
UNIQUE KEY uk_pretty_display_user_id_active (active_display_user_id),
UNIQUE KEY uk_pretty_display_user_id_active_user (active_user_id),
KEY idx_pretty_display_user_id_leases_user (user_id, status),
KEY idx_pretty_display_user_id_leases_expire (status, expires_at_ms)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS display_user_id_change_logs (
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT NOT NULL,
old_display_user_id VARCHAR(32) NOT NULL,
new_display_user_id VARCHAR(32) NOT NULL,
old_display_user_id_kind VARCHAR(32) NOT NULL,
new_display_user_id_kind VARCHAR(32) NOT NULL,
change_type VARCHAR(32) NOT NULL,
lease_id VARCHAR(64) NULL,
reason VARCHAR(64) NOT NULL,
operator_user_id BIGINT NULL,
request_id VARCHAR(96) NOT NULL,
created_at_ms BIGINT NOT NULL,
KEY idx_display_user_id_change_logs_user_id (user_id),
KEY idx_display_user_id_change_logs_request_id (request_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS password_accounts (
user_id BIGINT NOT NULL,
password_hash VARCHAR(255) NOT NULL,
hash_alg VARCHAR(32) NOT NULL,
created_at_ms BIGINT NOT NULL,
updated_at_ms BIGINT NOT NULL,
PRIMARY KEY (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS third_party_identities (
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT NOT NULL,
provider VARCHAR(64) NOT NULL,
provider_subject VARCHAR(191) NOT NULL,
provider_union_id VARCHAR(191) NULL,
created_at_ms BIGINT NOT NULL,
updated_at_ms BIGINT NOT NULL,
UNIQUE KEY uk_third_party_provider_subject (provider, provider_subject),
KEY idx_third_party_user_id (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS auth_sessions (
session_id VARCHAR(96) NOT NULL PRIMARY KEY,
user_id BIGINT NOT NULL,
refresh_token_hash VARCHAR(128) NOT NULL,
device_id VARCHAR(128) NOT NULL,
expires_at_ms BIGINT NOT NULL,
revoked_at_ms BIGINT NULL,
created_at_ms BIGINT NOT NULL,
updated_at_ms BIGINT NOT NULL,
UNIQUE KEY uk_auth_sessions_refresh_token_hash (refresh_token_hash),
KEY idx_auth_sessions_user_id (user_id),
KEY idx_auth_sessions_expires_at (expires_at_ms)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS login_audit (
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
request_id VARCHAR(96) NOT NULL,
user_id BIGINT NULL,
login_type VARCHAR(32) NOT NULL,
provider VARCHAR(64) NULL,
result VARCHAR(32) NOT NULL,
failure_code VARCHAR(64) NULL,
client_ip VARCHAR(64) NULL,
user_agent VARCHAR(512) NULL,
created_at_ms BIGINT NOT NULL,
KEY idx_login_audit_user_id (user_id),
KEY idx_login_audit_request_id (request_id),
KEY idx_login_audit_created_at (created_at_ms)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;