elastic_backend_fast/app/main.py
2025-11-29 15:48:25 +03:30

127 lines
5.1 KiB
Python

from fastapi import FastAPI, Request, Response
# from app.permit.permit import FactorySelector
from app.routes.v1.elastic import router as elastic_router
from app.routes.v1.elastic_map import router as elastic_map_router
from app.routes.v1.elastic_admin import router as elastic_admin_router
from app.routes.rag.rag_chat import router as rag_chat
from app.routes.voice.voice import router as voice_routers
from app.routes.tree.tree_base import router as tree_base_routers
from app.config.settings import get_settings, Settings
from app.core.elastic_client_helper import ElasticClientHelper, create_async_elastic_client
from starlette.middleware.base import BaseHTTPMiddleware
from app.core.response_helper import ResponseHelper
from app.lib.general_functions import extract_jwt_user_id
def create_app() -> FastAPI:
app = FastAPI(title="Flexible Elasticsearch Backend", version="0.1.0")
app.state.settings = get_settings()
@app.on_event("startup")
async def on_startup() -> None:
# settings:Settings = app.state.settings
# create_async_redis_client(settings)
app.state.elastic_client = await create_async_elastic_client(app.state.settings)
app.state.elastic_helper = ElasticClientHelper(app.state.elastic_client)
# permit = getattr(app.state, "permit_client", None)
# if permit is None:
# app.state.permit_client = await FactorySelector.get_factory("db",
# type=settings.permit_db_type,
# host=settings.permit_database_host,
# port=settings.permit_database_port,
# username=settings.permit_database_user,
# db_name=settings.permit_database_name,
# )
@app.on_event("shutdown")
async def on_shutdown() -> None:
client = getattr(app.state, "elastic_client", None)
if client is not None:
await client.close()
@app.get("/")
async def Ping():
return "Elasticsearch Backend Service"
@app.get("/ping")
async def Ping():
return "Elasticsearch Backend ping"
app.include_router(elastic_router, prefix="/v1")
app.include_router(rag_chat, prefix="/rag")
app.include_router(voice_routers, prefix="/voice")
app.include_router(tree_base_routers, prefix="/tree")
#---------------------------------------------
# برای نسخه نهایی نیاز است با دسترسی فعال شود
if app.state.settings.is_mode_develop :
app.include_router(elastic_map_router, prefix="/v1/map")
app.include_router(elastic_admin_router, prefix="/v1/admin")
return app
app = create_app()
class TavasiMiddleware(BaseHTTPMiddleware):
# routes_to_reroute = ["/indices/entity/insert/{entity_type}/{data_type}/{ref_key}"]
routes_to_reroute = ["/indices/entity/insert"]
async def test_rewrite(self, request: Request, call_next):
if request.url.path in self.routes_to_reroute:
request.scope['path'] = '/welcome'
headers = dict(request.scope['headers'])
headers[b'custom-header'] = b'my custom header'
request.scope['headers'] = [(k, v) for k, v in headers.items()]
return await request
# return await call_next(request)
async def rewriteUrls(self, request):
request.state.app = app
user_id = extract_jwt_user_id(request, app.state.settings.jwtKey, "HS256" )
if user_id:
# ذخیره موقت در settings یا context
app.state.settings.current_user_id = user_id
return request
async def responseNormal(self, response):
responseHelper = ResponseHelper()
return await responseHelper.general(response)
async def dispatch(self, request: Request, call_next):
# قبل از پردازش درخواست
# print("قبل از پردازش درخواست:", request.url)
await self.rewriteUrls(request)
# پردازش درخواست
response = await call_next(request)
# بعد از پردازش درخواست
response = await self.responseNormal(response)
# print("بعد از پردازش درخواست:", response.status_code)
return response
# @app.middleware("http")
# async def check_permit(request: Request, call_next):
# # client = app.state.permit_client
# # print(await client.ping())
# # result = await client.check_perm(
# # user_id=2, action_tag='item_new'
# # )
# if app.state.settings.enable_back_permition:
# return Response(content={"detail":"The server is temporarily limited."},status_code=503)
# else:
# response = await call_next(request)
# return response
app.add_middleware(TavasiMiddleware)