124 lines
3.8 KiB
Python
Executable File
124 lines
3.8 KiB
Python
Executable File
# app.py
|
|
from fastapi import FastAPI
|
|
from contextlib import asynccontextmanager
|
|
from utils.workflow import ElasticHelper, Formatter, RequestManager
|
|
from fastapi.middleware.cors import CORSMiddleware
|
|
from router.bale_bot import router as bale_router
|
|
from router.bale_bot import initialize_webhook
|
|
from utils.main 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()
|