""" app.py — Точка входа и сборка слоёв. Бизнес-логики НОЛЬ. Только: 1. Инициализация схемы БД (schema.ensure_schema) 2. Регистрация Blueprint-ов (test, api — будут добавляться) Правило: если в app.py появляется if/for или бизнес-слово — это лишнее. """ import os from dotenv import load_dotenv from flask import Flask, render_template import db import schema from test_routes import test_bp from upload import upload_bp from api import api_bp load_dotenv() class ContractsApp: """ Главный класс приложения. Собирает все слои вместе, не содержит логики. """ def __init__(self): self.app = Flask(__name__) # 1. Создать таблицы при старте (если их ещё нет) schema.ensure_schema() # 2. Собрать маршруты self._add_routes() def _add_routes(self): """Регистрация всех Blueprint-ов и системных маршрутов.""" # -- Системные маршруты -- self.app.add_url_rule("/", "index", self._index) self.app.add_url_rule("/health", "health", self._health) self.app.add_url_rule("/upload", "upload_page", self._upload_page) # -- Blueprint-ы (каждый слой — отдельный Blueprint) -- self.app.register_blueprint(test_bp) self.app.register_blueprint(upload_bp) self.app.register_blueprint(api_bp) def _index(self): """Главная страница — статус сервиса.""" conn, _ = db.connect() db_status = "connected" if conn else "no DB" return render_template("index.html", db_status=db_status) def _health(self): """Health check для платформы.""" return "OK", 200, {"Content-Type": "text/plain"} def _upload_page(self): """Страница загрузки договора (UI).""" return render_template("upload.html") def run(self): """Запуск Flask (только для разработки, в production — gunicorn).""" self.app.run(host="0.0.0.0", port=5000) # ── Точка входа ───────────────────────────────────────────────── if __name__ == "__main__": app_instance = ContractsApp() app_instance.run() if __name__ == "__main__": app_instance = ContractsApp() app_instance.run()