-- db/init.sql -- Создаёт таблицы для хранения пользователей, ключей маркетплейсов, кейсов и файлов CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, password_hash TEXT NOT NULL, plan VARCHAR(20) DEFAULT 'free', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS credentials ( user_id INT REFERENCES users(id) ON DELETE CASCADE, platform VARCHAR(50), api_key TEXT, client_id TEXT, client_secret TEXT, other_data JSONB, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (user_id, platform) ); CREATE TABLE IF NOT EXISTS cases ( id SERIAL PRIMARY KEY, user_id INT REFERENCES users(id) ON DELETE CASCADE, platform VARCHAR(50) NOT NULL DEFAULT 'ozon', violator_url TEXT NOT NULL, violator_article VARCHAR(50) NOT NULL, my_article VARCHAR(50), comment TEXT, status VARCHAR(20) DEFAULT 'new', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS files ( id SERIAL PRIMARY KEY, case_id INT REFERENCES cases(id) ON DELETE CASCADE, file_path TEXT NOT NULL, uploaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS audit_log ( id SERIAL PRIMARY KEY, user_id INT REFERENCES users(id) ON DELETE CASCADE, action VARCHAR(100) NOT NULL, details JSONB, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS seo_keywords ( id SERIAL PRIMARY KEY, user_id INT REFERENCES users(id) ON DELETE CASCADE, keyword VARCHAR(255) NOT NULL, article VARCHAR(100) NOT NULL, platform VARCHAR(50) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS seo_history ( id SERIAL PRIMARY KEY, keyword_id INT REFERENCES seo_keywords(id) ON DELETE CASCADE, position INT, checked_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS reference_images ( id SERIAL PRIMARY KEY, user_id INT REFERENCES users(id) ON DELETE CASCADE, file_path TEXT NOT NULL, image_hash VARCHAR(64), article VARCHAR(100), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );