This commit is contained in:
5
server-node/sql/schema/00_schema_migrations.sql
Normal file
5
server-node/sql/schema/00_schema_migrations.sql
Normal file
@@ -0,0 +1,5 @@
|
||||
CREATE TABLE IF NOT EXISTS schema_migrations (
|
||||
id TEXT PRIMARY KEY,
|
||||
name TEXT NOT NULL,
|
||||
applied_at TEXT NOT NULL
|
||||
);
|
||||
16
server-node/sql/schema/01_users.sql
Normal file
16
server-node/sql/schema/01_users.sql
Normal file
@@ -0,0 +1,16 @@
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
id TEXT PRIMARY KEY,
|
||||
username TEXT NOT NULL UNIQUE,
|
||||
password_hash TEXT NOT NULL,
|
||||
token_version INTEGER NOT NULL DEFAULT 1,
|
||||
display_name TEXT NOT NULL,
|
||||
login_provider TEXT NOT NULL DEFAULT 'password',
|
||||
account_status TEXT NOT NULL DEFAULT 'active',
|
||||
phone_number TEXT,
|
||||
phone_verified_at TEXT,
|
||||
created_at TEXT NOT NULL,
|
||||
updated_at TEXT NOT NULL
|
||||
);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS users_phone_number_unique_idx
|
||||
ON users (phone_number);
|
||||
10
server-node/sql/schema/02_save_snapshots.sql
Normal file
10
server-node/sql/schema/02_save_snapshots.sql
Normal file
@@ -0,0 +1,10 @@
|
||||
CREATE TABLE IF NOT EXISTS save_snapshots (
|
||||
user_id TEXT PRIMARY KEY,
|
||||
version INTEGER NOT NULL,
|
||||
saved_at TEXT NOT NULL,
|
||||
bottom_tab TEXT NOT NULL,
|
||||
game_state_json JSONB NOT NULL,
|
||||
current_story_json JSONB,
|
||||
updated_at TEXT NOT NULL,
|
||||
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
||||
);
|
||||
6
server-node/sql/schema/03_runtime_settings.sql
Normal file
6
server-node/sql/schema/03_runtime_settings.sql
Normal file
@@ -0,0 +1,6 @@
|
||||
CREATE TABLE IF NOT EXISTS runtime_settings (
|
||||
user_id TEXT PRIMARY KEY,
|
||||
music_volume REAL NOT NULL,
|
||||
updated_at TEXT NOT NULL,
|
||||
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
||||
);
|
||||
24
server-node/sql/schema/04_custom_world_profiles.sql
Normal file
24
server-node/sql/schema/04_custom_world_profiles.sql
Normal file
@@ -0,0 +1,24 @@
|
||||
CREATE TABLE IF NOT EXISTS custom_world_profiles (
|
||||
user_id TEXT NOT NULL,
|
||||
profile_id TEXT NOT NULL,
|
||||
payload_json JSONB NOT NULL,
|
||||
visibility TEXT NOT NULL DEFAULT 'draft',
|
||||
published_at TEXT,
|
||||
author_display_name TEXT NOT NULL DEFAULT '玩家',
|
||||
world_name TEXT NOT NULL DEFAULT '',
|
||||
subtitle TEXT NOT NULL DEFAULT '',
|
||||
summary_text TEXT NOT NULL DEFAULT '',
|
||||
cover_image_src TEXT,
|
||||
theme_mode TEXT NOT NULL DEFAULT 'mythic',
|
||||
playable_npc_count INTEGER NOT NULL DEFAULT 0,
|
||||
landmark_count INTEGER NOT NULL DEFAULT 0,
|
||||
updated_at TEXT NOT NULL,
|
||||
PRIMARY KEY (user_id, profile_id),
|
||||
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS custom_world_profiles_user_updated_idx
|
||||
ON custom_world_profiles (user_id, updated_at DESC);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS custom_world_profiles_published_idx
|
||||
ON custom_world_profiles (visibility, published_at DESC, updated_at DESC);
|
||||
24
server-node/sql/schema/05_auth_identities.sql
Normal file
24
server-node/sql/schema/05_auth_identities.sql
Normal file
@@ -0,0 +1,24 @@
|
||||
CREATE TABLE IF NOT EXISTS auth_identities (
|
||||
id TEXT PRIMARY KEY,
|
||||
user_id TEXT NOT NULL,
|
||||
provider TEXT NOT NULL,
|
||||
provider_uid TEXT NOT NULL,
|
||||
provider_unionid TEXT,
|
||||
display_name TEXT,
|
||||
avatar_url TEXT,
|
||||
is_verified BOOLEAN NOT NULL DEFAULT TRUE,
|
||||
meta_json JSONB,
|
||||
created_at TEXT NOT NULL,
|
||||
updated_at TEXT NOT NULL,
|
||||
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS auth_identities_provider_uid_unique_idx
|
||||
ON auth_identities (provider, provider_uid);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS auth_identities_provider_unionid_unique_idx
|
||||
ON auth_identities (provider, provider_unionid)
|
||||
WHERE provider_unionid IS NOT NULL;
|
||||
|
||||
CREATE INDEX IF NOT EXISTS auth_identities_user_idx
|
||||
ON auth_identities (user_id, provider);
|
||||
17
server-node/sql/schema/06_user_sessions.sql
Normal file
17
server-node/sql/schema/06_user_sessions.sql
Normal file
@@ -0,0 +1,17 @@
|
||||
CREATE TABLE IF NOT EXISTS user_sessions (
|
||||
id TEXT PRIMARY KEY,
|
||||
user_id TEXT NOT NULL,
|
||||
refresh_token_hash TEXT NOT NULL UNIQUE,
|
||||
client_type TEXT NOT NULL,
|
||||
user_agent TEXT,
|
||||
ip TEXT,
|
||||
expires_at TEXT NOT NULL,
|
||||
revoked_at TEXT,
|
||||
created_at TEXT NOT NULL,
|
||||
updated_at TEXT NOT NULL,
|
||||
last_seen_at TEXT NOT NULL,
|
||||
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS user_sessions_user_idx
|
||||
ON user_sessions (user_id, expires_at DESC);
|
||||
14
server-node/sql/schema/07_auth_audit_logs.sql
Normal file
14
server-node/sql/schema/07_auth_audit_logs.sql
Normal file
@@ -0,0 +1,14 @@
|
||||
CREATE TABLE IF NOT EXISTS auth_audit_logs (
|
||||
id TEXT PRIMARY KEY,
|
||||
user_id TEXT NOT NULL,
|
||||
event_type TEXT NOT NULL,
|
||||
detail TEXT NOT NULL,
|
||||
ip TEXT,
|
||||
user_agent TEXT,
|
||||
meta_json JSONB,
|
||||
created_at TEXT NOT NULL,
|
||||
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS auth_audit_logs_user_created_idx
|
||||
ON auth_audit_logs (user_id, created_at DESC);
|
||||
16
server-node/sql/schema/08_sms_auth_events.sql
Normal file
16
server-node/sql/schema/08_sms_auth_events.sql
Normal file
@@ -0,0 +1,16 @@
|
||||
CREATE TABLE IF NOT EXISTS sms_auth_events (
|
||||
id TEXT PRIMARY KEY,
|
||||
phone_number TEXT NOT NULL,
|
||||
scene TEXT NOT NULL,
|
||||
action TEXT NOT NULL,
|
||||
success BOOLEAN NOT NULL,
|
||||
ip TEXT,
|
||||
user_agent TEXT,
|
||||
created_at TEXT NOT NULL
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS sms_auth_events_phone_created_idx
|
||||
ON sms_auth_events (phone_number, created_at DESC);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS sms_auth_events_ip_created_idx
|
||||
ON sms_auth_events (ip, created_at DESC);
|
||||
13
server-node/sql/schema/09_auth_risk_blocks.sql
Normal file
13
server-node/sql/schema/09_auth_risk_blocks.sql
Normal file
@@ -0,0 +1,13 @@
|
||||
CREATE TABLE IF NOT EXISTS auth_risk_blocks (
|
||||
id TEXT PRIMARY KEY,
|
||||
scope_type TEXT NOT NULL,
|
||||
scope_key TEXT NOT NULL,
|
||||
reason TEXT NOT NULL,
|
||||
expires_at TEXT NOT NULL,
|
||||
lifted_at TEXT,
|
||||
created_at TEXT NOT NULL,
|
||||
updated_at TEXT NOT NULL
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS auth_risk_blocks_scope_idx
|
||||
ON auth_risk_blocks (scope_type, scope_key, expires_at DESC);
|
||||
8
server-node/sql/schema/README.md
Normal file
8
server-node/sql/schema/README.md
Normal file
@@ -0,0 +1,8 @@
|
||||
# Final Schema SQL
|
||||
|
||||
This folder contains the final PostgreSQL table definitions, one table per file.
|
||||
|
||||
Notes:
|
||||
- These files keep only the final schema shape.
|
||||
- They do not preserve historical migration steps.
|
||||
- The current runtime migration logic in `server-node/src/db/migrations.ts` is unchanged.
|
||||
Reference in New Issue
Block a user