From 302bb191a3a4d131a727aba4cfa8921939f0fa36 Mon Sep 17 00:00:00 2001 From: Damir Date: Fri, 15 May 2026 20:41:36 +0300 Subject: [PATCH] 2 --- backend/app.py | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/backend/app.py b/backend/app.py index 48af70e..a7289c1 100644 --- a/backend/app.py +++ b/backend/app.py @@ -35,6 +35,70 @@ UPLOAD_FOLDER = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'upload os.makedirs(UPLOAD_FOLDER, exist_ok=True) app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER +# Автоматическая инициализация таблиц при старте +def init_db(): + try: + from .db import get_db_connection, release_db_connection + conn = get_db_connection() + cur = conn.cursor() + cur.execute(""" + CREATE TABLE IF NOT EXISTS users ( + id SERIAL PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, + password_hash TEXT NOT NULL, role VARCHAR(20) DEFAULT 'admin', + parent_id INT REFERENCES users(id) ON DELETE CASCADE, + plan VARCHAR(20) DEFAULT 'free', created_at TIMESTAMP DEFAULT NOW() + ); + 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 NOW(), 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 NOW(), updated_at TIMESTAMP DEFAULT NOW() + ); + 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 NOW() + ); + 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 NOW() + ); + 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 NOW() + ); + 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 NOW() + ); + 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 NOW() + ); + CREATE TABLE IF NOT EXISTS repricer_rules ( + id SERIAL PRIMARY KEY, user_id INT REFERENCES users(id) ON DELETE CASCADE, + product_name VARCHAR(255) NOT NULL, sku VARCHAR(100) NOT NULL, + min_price DECIMAL(10,2) NOT NULL, max_price DECIMAL(10,2) NOT NULL, + strategy VARCHAR(20) DEFAULT 'follow_competitor', + is_active BOOLEAN DEFAULT TRUE, current_price DECIMAL(10,2), + last_run TIMESTAMP, created_at TIMESTAMP DEFAULT NOW() + ); + """) + conn.commit() + release_db_connection(conn) + print("✅ База данных инициализирована успешно") + except Exception as e: + print(f"⚠️ Ошибка инициализации БД: {e}") + +init_db() + # Register blueprints from .routes.cases import cases_blueprint from .routes.credentials import credentials_blueprint