63 lines
2.3 KiB
Python
63 lines
2.3 KiB
Python
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))
|
|
|