-- BuhApp database schema -- Sprint 1: users, consents, audit CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; CREATE EXTENSION IF NOT EXISTS "pgcrypto"; -- USERS CREATE TABLE IF NOT EXISTS users ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), email TEXT UNIQUE, phone TEXT UNIQUE, password_hash TEXT NOT NULL, name TEXT NOT NULL, birthdate DATE, gender TEXT CHECK (gender IN ('m','f','o')), city TEXT, bio TEXT, photo_url TEXT, is_verified BOOLEAN DEFAULT FALSE, is_blocked BOOLEAN DEFAULT FALSE, created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW(), last_seen_at TIMESTAMPTZ ); CREATE INDEX IF NOT EXISTS idx_users_last_seen ON users(last_seen_at); -- CONSENT LOG (юр. документы, согласия при регистрации) CREATE TABLE IF NOT EXISTS consent_log ( id BIGSERIAL PRIMARY KEY, user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, doc_type TEXT NOT NULL CHECK (doc_type IN ('terms','privacy','disclaimer','adult')), doc_version TEXT NOT NULL, ip INET, user_agent TEXT, accepted_at TIMESTAMPTZ DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_consent_user ON consent_log(user_id); -- AUDIT LOG (журнал действий для разборов) CREATE TABLE IF NOT EXISTS audit_log ( id BIGSERIAL PRIMARY KEY, user_id UUID REFERENCES users(id) ON DELETE SET NULL, action TEXT NOT NULL, target_type TEXT, target_id TEXT, metadata JSONB, ip INET, user_agent TEXT, created_at TIMESTAMPTZ DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_audit_user ON audit_log(user_id); CREATE INDEX IF NOT EXISTS idx_audit_action ON audit_log(action); CREATE INDEX IF NOT EXISTS idx_audit_created ON audit_log(created_at);