from __future__ import annotations from fastapi import APIRouter, Depends, HTTPException, Request from app.core.map_index_reader import MapIndexReader from app.core.elastic_query_builder import ElasticQueryBuilder from app.core.field_processor import FieldProcessor from app.core.response_helper import ResponseHelper from app.routes.v1.models import ( SearchRequest, InsertRequest, UpdateByQueryRequest, DeleteByQueryRequest, ) router = APIRouter(tags=["elasticsearch"]) def get_elastic_helper(request: Request): helper = getattr(request.app.state, "elastic_helper", None) if helper is None: raise RuntimeError("Elasticsearch helper not initialized") return helper @router.post("/indices/{type_name}/create-index") async def create_index(type_name: str, request: Request): reader = MapIndexReader(type_name) helper = get_elastic_helper(request) try: res = await helper.create_index_if_not_exists(reader.get_index_name(), reader.mapping) return ResponseHelper().merge_related({"success": True, "result": res}, None) except Exception as exc: # noqa: BLE001 raise HTTPException(status_code=400, detail=str(exc)) @router.post("/indices/{type_name}/update-by-query") async def update_by_query(type_name: str, payload: UpdateByQueryRequest, request: Request): reader = MapIndexReader(type_name) helper = get_elastic_helper(request) builder = ElasticQueryBuilder() body = builder.build_update_by_query(reader, payload) try: es_res = await helper.update_by_query(reader.get_index_name(), body, refresh=True) return {"success": True, "result": es_res} except Exception as exc: # noqa: BLE001 raise HTTPException(status_code=400, detail=str(exc)) @router.post("/indices/{type_name}/delete-by-query") async def delete_by_query(type_name: str, payload: DeleteByQueryRequest, request: Request): reader = MapIndexReader(type_name) helper = get_elastic_helper(request) builder = ElasticQueryBuilder() body = builder.build_delete_by_query(reader, payload) try: es_res = await helper.delete_by_query(reader.get_index_name(), body, refresh=True) return {"success": True, "result": es_res} except Exception as exc: # noqa: BLE001 raise HTTPException(status_code=400, detail=str(exc))