Initial commit: FunConnect project with server, relay, client and admin panel
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
66
server/migrations/20240101000001_initial.sql
Normal file
66
server/migrations/20240101000001_initial.sql
Normal file
@@ -0,0 +1,66 @@
|
||||
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
||||
|
||||
CREATE TABLE users (
|
||||
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||
username VARCHAR(32) NOT NULL UNIQUE,
|
||||
email VARCHAR(255) NOT NULL UNIQUE,
|
||||
password_hash TEXT NOT NULL,
|
||||
avatar_seed VARCHAR(64) NOT NULL DEFAULT '',
|
||||
last_seen TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE TABLE friendships (
|
||||
requester_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
addressee_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
status VARCHAR(16) NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'accepted', 'blocked')),
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
PRIMARY KEY (requester_id, addressee_id)
|
||||
);
|
||||
|
||||
CREATE TABLE rooms (
|
||||
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||
name VARCHAR(64) NOT NULL,
|
||||
owner_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
max_players INTEGER NOT NULL DEFAULT 10,
|
||||
is_public BOOLEAN NOT NULL DEFAULT TRUE,
|
||||
password_hash TEXT,
|
||||
game_version VARCHAR(32) NOT NULL DEFAULT '1.20',
|
||||
status VARCHAR(16) NOT NULL DEFAULT 'open' CHECK (status IN ('open', 'in_game', 'closed')),
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE TABLE room_members (
|
||||
room_id UUID NOT NULL REFERENCES rooms(id) ON DELETE CASCADE,
|
||||
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
role VARCHAR(16) NOT NULL DEFAULT 'member' CHECK (role IN ('owner', 'member')),
|
||||
joined_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
PRIMARY KEY (room_id, user_id)
|
||||
);
|
||||
|
||||
CREATE TABLE refresh_tokens (
|
||||
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
token_hash TEXT NOT NULL UNIQUE,
|
||||
device_id VARCHAR(128),
|
||||
expires_at TIMESTAMPTZ NOT NULL,
|
||||
revoked_at TIMESTAMPTZ,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE TABLE relay_sessions (
|
||||
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||
room_id UUID REFERENCES rooms(id) ON DELETE SET NULL,
|
||||
initiator_id UUID REFERENCES users(id) ON DELETE SET NULL,
|
||||
peer_id UUID REFERENCES users(id) ON DELETE SET NULL,
|
||||
session_type VARCHAR(8) NOT NULL DEFAULT 'relay' CHECK (session_type IN ('p2p', 'relay')),
|
||||
bytes_transferred BIGINT NOT NULL DEFAULT 0,
|
||||
started_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
ended_at TIMESTAMPTZ
|
||||
);
|
||||
|
||||
CREATE INDEX idx_friendships_addressee ON friendships(addressee_id);
|
||||
CREATE INDEX idx_room_members_user ON room_members(user_id);
|
||||
CREATE INDEX idx_refresh_tokens_user ON refresh_tokens(user_id);
|
||||
CREATE INDEX idx_relay_sessions_room ON relay_sessions(room_id);
|
||||
17
server/migrations/20240101000002_relay_nodes.sql
Normal file
17
server/migrations/20240101000002_relay_nodes.sql
Normal file
@@ -0,0 +1,17 @@
|
||||
-- Relay server nodes registry
|
||||
CREATE TABLE relay_nodes (
|
||||
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||
name VARCHAR(64) NOT NULL,
|
||||
url TEXT NOT NULL UNIQUE,
|
||||
region VARCHAR(32) NOT NULL DEFAULT 'auto',
|
||||
is_active BOOLEAN NOT NULL DEFAULT TRUE,
|
||||
priority INTEGER NOT NULL DEFAULT 0,
|
||||
last_ping_ms INTEGER, -- measured RTT in ms
|
||||
last_checked_at TIMESTAMPTZ,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Seed with official relay nodes
|
||||
INSERT INTO relay_nodes (name, url, region, priority) VALUES
|
||||
('官方节点 - 主线路', 'funmc.com:7900', 'auto', 100),
|
||||
('官方节点 - 备用线路', 'funmc.com:7901', 'auto', 50);
|
||||
54
server/migrations/20240101000003_add_user_ban.sql
Normal file
54
server/migrations/20240101000003_add_user_ban.sql
Normal file
@@ -0,0 +1,54 @@
|
||||
-- 添加用户封禁字段
|
||||
ALTER TABLE users ADD COLUMN IF NOT EXISTS is_banned BOOLEAN NOT NULL DEFAULT FALSE;
|
||||
|
||||
-- 添加房间邀请码
|
||||
ALTER TABLE rooms ADD COLUMN IF NOT EXISTS invite_code VARCHAR(8);
|
||||
|
||||
-- 添加用户最后在线 IP(用于安全审计)
|
||||
ALTER TABLE users ADD COLUMN IF NOT EXISTS last_ip VARCHAR(45);
|
||||
|
||||
-- 创建房间邀请表
|
||||
CREATE TABLE IF NOT EXISTS room_invites (
|
||||
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||
room_id UUID NOT NULL REFERENCES rooms(id) ON DELETE CASCADE,
|
||||
inviter_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
invitee_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
status VARCHAR(16) NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'accepted', 'declined', 'expired')),
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
expires_at TIMESTAMPTZ NOT NULL DEFAULT NOW() + INTERVAL '24 hours'
|
||||
);
|
||||
|
||||
-- 创建服务器配置表(持久化配置)
|
||||
CREATE TABLE IF NOT EXISTS server_config (
|
||||
key VARCHAR(64) PRIMARY KEY,
|
||||
value TEXT NOT NULL,
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- 创建操作日志表(管理审计)
|
||||
CREATE TABLE IF NOT EXISTS admin_logs (
|
||||
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||
admin_user VARCHAR(64) NOT NULL,
|
||||
action VARCHAR(64) NOT NULL,
|
||||
target_type VARCHAR(32),
|
||||
target_id UUID,
|
||||
details JSONB,
|
||||
ip_address VARCHAR(45),
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- 创建下载统计表
|
||||
CREATE TABLE IF NOT EXISTS download_stats (
|
||||
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||
filename VARCHAR(255) NOT NULL,
|
||||
platform VARCHAR(32) NOT NULL,
|
||||
ip_address VARCHAR(45),
|
||||
user_agent TEXT,
|
||||
downloaded_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- 索引
|
||||
CREATE INDEX IF NOT EXISTS idx_room_invites_invitee ON room_invites(invitee_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_room_invites_room ON room_invites(room_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_admin_logs_created ON admin_logs(created_at DESC);
|
||||
CREATE INDEX IF NOT EXISTS idx_download_stats_filename ON download_stats(filename);
|
||||
Reference in New Issue
Block a user