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

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))