2
This commit is contained in:
@@ -35,6 +35,70 @@ UPLOAD_FOLDER = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'upload
|
|||||||
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
|
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
|
||||||
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
|
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
|
# Register blueprints
|
||||||
from .routes.cases import cases_blueprint
|
from .routes.cases import cases_blueprint
|
||||||
from .routes.credentials import credentials_blueprint
|
from .routes.credentials import credentials_blueprint
|
||||||
|
|||||||
Reference in New Issue
Block a user