127 lines
5.1 KiB
Python
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)
|