64 lines
3.1 KiB
SQL
64 lines
3.1 KiB
SQL
-- ============================================================================
|
|
-- CryptoWallet API — Database Schema
|
|
-- Idempotent: safe to run multiple times (CREATE IF NOT EXISTS).
|
|
--
|
|
-- Применение:
|
|
-- psql "postgresql://user:pass@host:5432/db" -f deployserver/db/schema.sql
|
|
-- ============================================================================
|
|
|
|
-- ── users ───────────────────────────────────────────────────────────────────
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id VARCHAR(26) PRIMARY KEY,
|
|
email VARCHAR(255) NOT NULL UNIQUE,
|
|
password_hash VARCHAR(255) NOT NULL,
|
|
last_name VARCHAR(128),
|
|
first_name VARCHAR(128),
|
|
middle_name VARCHAR(128),
|
|
birth_date DATE,
|
|
crypto_wallet VARCHAR(255),
|
|
phone VARCHAR(16),
|
|
bik VARCHAR(9),
|
|
account_number VARCHAR(20),
|
|
card_number VARCHAR(19),
|
|
inn VARCHAR(12),
|
|
kyc_verified BOOLEAN NOT NULL DEFAULT FALSE,
|
|
kyc_verified_at TIMESTAMPTZ,
|
|
is_deleted BOOLEAN NOT NULL DEFAULT FALSE,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- ── wallets ─────────────────────────────────────────────────────────────────
|
|
CREATE TABLE IF NOT EXISTS wallets (
|
|
id VARCHAR(26) PRIMARY KEY,
|
|
user_id VARCHAR(26) NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
chain VARCHAR(10) NOT NULL,
|
|
address VARCHAR(256) NOT NULL,
|
|
derivation_path VARCHAR(64) NOT NULL,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
CONSTRAINT wallets_user_id_chain_unique UNIQUE (user_id, chain)
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_wallets_user_id ON wallets(user_id);
|
|
CREATE INDEX IF NOT EXISTS idx_wallets_address ON wallets(address);
|
|
|
|
-- ── sessions ────────────────────────────────────────────────────────────────
|
|
CREATE TABLE IF NOT EXISTS sessions (
|
|
id VARCHAR(26) PRIMARY KEY,
|
|
sid VARCHAR(26) NOT NULL UNIQUE,
|
|
user_id VARCHAR(26) NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
device_id VARCHAR(26),
|
|
user_agent VARCHAR(500),
|
|
first_ip VARCHAR(64),
|
|
last_ip VARCHAR(64),
|
|
last_seen_at TIMESTAMPTZ,
|
|
revoked_at TIMESTAMPTZ,
|
|
refresh_jti_hash VARCHAR(255),
|
|
refresh_expires_at TIMESTAMPTZ,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_sessions_user_id ON sessions(user_id);
|
|
CREATE INDEX IF NOT EXISTS idx_sessions_sid ON sessions(sid);
|