# app.py from fastapi import FastAPI from contextlib import asynccontextmanager from core.core import ElasticHelper, Formatter, RequestManager from fastapi.middleware.cors import CORSMiddleware from router.bale.bale import router as bale_router from router.bale.bale import initialize_webhook from router.bale.bale_handle import BaleBot, UserManager from dotenv import load_dotenv import os # --- Lifespan manager --- @asynccontextmanager async def lifespan(app: FastAPI): # 🚀 Startup — همه موارد مقداردهی اولیه باید اینجا باشند print("🚀 Starting up Bale-Bot Backend system...") # فقط یک بار در ابتدای برنامه `.env` را بارگذاری کنیم load_dotenv() TOKEN = os.getenv("BALE_TOKEN") ES_URL = os.getenv("ES_URL") ES_PASSWORD = os.getenv("ES_PASSWORD") ES_USER_NAME = os.getenv("ES_USER_NAME") ES_INDEX_NAME = os.getenv("ES_INDEX_NAME") GLOBAL_DOMAIN = os.getenv("GLOBAL_DOMAIN") BACK_END_HOST= os.getenv("BACK_END_HOST") BACK_END_PORT= os.getenv("BACK_END_PORT") BACK_END_URL = f"http://{BACK_END_HOST}:{BACK_END_PORT}" # 🔍 گرفتن تنظیمات required_vars = { "TOKEN": TOKEN, "ES_URL": ES_URL, "ES_PASSWORD": ES_PASSWORD, "ES_USER_NAME": ES_USER_NAME, "ES_INDEX_NAME": ES_INDEX_NAME, "GLOBAL_DOMAIN": GLOBAL_DOMAIN, } missing = [k for k, v in required_vars.items() if not v] if missing: raise EnvironmentError( f"Missing required environment variables: {missing}\nPLZ add the required field in the .env file !" ) app.state.es_helper = ElasticHelper( es_url=ES_URL, es_pass=ES_PASSWORD, es_user=ES_USER_NAME, ) app.state.base_url = f"https://tapi.bale.ai/bot{TOKEN}" app.state.webhook_url = f"{GLOBAL_DOMAIN}/webhook/{TOKEN}" app.state.set_webhook_url = f"https://tapi.bale.ai/bot{TOKEN}/setWebhook" app.state.es_index_name = ES_INDEX_NAME app.state.bale_token = TOKEN # اجباری است برای ربات initialize_webhook( webhook_url=app.state.webhook_url, set_webhook_url=app.state.set_webhook_url, ) app.state.user_manager = UserManager() app.state.formatter = Formatter() app.state.request_manager = RequestManager( host_url=BACK_END_URL, ) # بله بات bale_bot = BaleBot( user_manager=app.state.user_manager, es_helper=app.state.es_helper, es_index_name=app.state.es_index_name, token=app.state.bale_token, formatter= app.state.formatter, back_end_url = BACK_END_URL, request_manager = app.state.request_manager, ) app.state.bale_bot = bale_bot print("=== Bale-Bot Initialized ===") yield # برنامه در این حالت اجرا می‌شود print("🛑 Shutting down Bale-Bot Backend system...") # --- Application factory --- def create_app() -> FastAPI: app = FastAPI( title="Bale-Bot Backend", version="0.1.0", lifespan=lifespan, # برای محیط production، می‌توانید docs + redoc را غیرفعال کنید # docs_url=None, redoc_url=None ) # 🌐 CORS app.add_middleware( CORSMiddleware, allow_origins=["*"], # فقط در dev — در prod لیست دقیق دامنه‌ها را بگذارید allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # 🏠 Health routes @app.get("/", include_in_schema=False) async def health_check(): return {"status": "ok", "message": "Bale-Bot Backend is running"} @app.get("/ping", include_in_schema=False) async def ping(): return {"pong": True} # 📦 روت‌ها app.include_router(bale_router) return app ############## Create app app = create_app()