routes.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. from datetime import datetime
  2. from typing import TypeVar
  3. from uuid import uuid4
  4. from core_domain import ServiceHealth
  5. from core_shared import error_detail
  6. from fastapi import APIRouter, Depends, HTTPException, Request
  7. from sqlalchemy import text
  8. from sqlalchemy.orm import Session
  9. from app.application.services import MemoryApplicationService, build_memory_application_service
  10. from app.bootstrap.settings import MemoryServiceSettings
  11. from app.db.session import get_db
  12. from app.schemas.memory import (
  13. ApiResponse,
  14. DeleteData,
  15. MemoryCreateRequestDto,
  16. MemoryDeleteRequestDto,
  17. MemoryDetailRequestDto,
  18. MemoryItemDto,
  19. MemoryListRequestDto,
  20. MemorySearchRequestDto,
  21. MemorySearchResultDto,
  22. MemoryStatusRequestDto,
  23. MemoryUpdateRequestDto,
  24. PageResult,
  25. )
  26. router = APIRouter()
  27. T = TypeVar("T")
  28. def ok(data: T) -> ApiResponse[T]:
  29. return ApiResponse(
  30. success=True,
  31. data=data,
  32. error=None,
  33. requestId=str(uuid4()),
  34. serverTime=datetime.utcnow())
  35. def get_memory_application_service(
  36. request: Request,
  37. db: Session = Depends(get_db)) -> MemoryApplicationService:
  38. settings: MemoryServiceSettings = request.app.state.settings
  39. return build_memory_application_service(db=db, settings=settings)
  40. @router.get("/health", response_model=ServiceHealth)
  41. def health_check(db: Session = Depends(get_db)) -> ServiceHealth:
  42. db.execute(text("SELECT 1"))
  43. return ServiceHealth(service="memory-service", status="ok", database="ok")
  44. @router.post("/list", response_model=ApiResponse[PageResult[MemoryItemDto]])
  45. def list_memories_contract(
  46. payload: MemoryListRequestDto,
  47. service: MemoryApplicationService = Depends(get_memory_application_service)) -> ApiResponse[PageResult[MemoryItemDto]]:
  48. items, total = service.list_memories_contract(payload)
  49. return ok(PageResult[MemoryItemDto].from_items(
  50. items=[MemoryItemDto.from_entity(item) for item in items],
  51. total=total,
  52. page=payload.page,
  53. page_size=payload.pageSize))
  54. @router.post("/create", response_model=ApiResponse[MemoryItemDto])
  55. def create_memory_contract(
  56. payload: MemoryCreateRequestDto,
  57. service: MemoryApplicationService = Depends(get_memory_application_service)) -> ApiResponse[MemoryItemDto]:
  58. return ok(MemoryItemDto.from_entity(service.create_memory_from_contract(payload)))
  59. @router.post("/detail", response_model=ApiResponse[MemoryItemDto])
  60. def detail_memory_contract(
  61. payload: MemoryDetailRequestDto,
  62. service: MemoryApplicationService = Depends(get_memory_application_service)) -> ApiResponse[MemoryItemDto]:
  63. entity = service.get_memory(memory_id=payload.memoryId)
  64. if entity is None:
  65. raise HTTPException(status_code=404, detail=error_detail("error.memory.not_found", id=payload.memoryId))
  66. return ok(MemoryItemDto.from_entity(entity))
  67. @router.post("/update", response_model=ApiResponse[MemoryItemDto])
  68. def update_memory_contract(
  69. payload: MemoryUpdateRequestDto,
  70. service: MemoryApplicationService = Depends(get_memory_application_service)) -> ApiResponse[MemoryItemDto]:
  71. entity = service.update_memory(payload)
  72. if entity is None:
  73. raise HTTPException(status_code=404, detail=error_detail("error.memory.not_found", id=payload.memoryId))
  74. return ok(MemoryItemDto.from_entity(entity))
  75. @router.post("/status", response_model=ApiResponse[MemoryItemDto])
  76. def update_memory_status_contract(
  77. payload: MemoryStatusRequestDto,
  78. service: MemoryApplicationService = Depends(get_memory_application_service)) -> ApiResponse[MemoryItemDto]:
  79. entity = service.update_memory_status(
  80. memory_id=payload.memoryId,
  81. payload=payload)
  82. if entity is None:
  83. raise HTTPException(status_code=404, detail=error_detail("error.memory.not_found", id=payload.memoryId))
  84. return ok(MemoryItemDto.from_entity(entity))
  85. @router.post("/delete", response_model=ApiResponse[DeleteData])
  86. def delete_memory_contract(
  87. payload: MemoryDeleteRequestDto,
  88. service: MemoryApplicationService = Depends(get_memory_application_service)) -> ApiResponse[DeleteData]:
  89. entity = service.delete_memory(memory_id=payload.memoryId)
  90. if entity is None:
  91. raise HTTPException(status_code=404, detail=error_detail("error.memory.not_found", id=payload.memoryId))
  92. return ok(DeleteData(deleted=True, memoryId=payload.memoryId))
  93. @router.post("/search/query", response_model=ApiResponse[list[MemorySearchResultDto]])
  94. def search_memories_contract(
  95. payload: MemorySearchRequestDto,
  96. service: MemoryApplicationService = Depends(get_memory_application_service)) -> ApiResponse[list[MemorySearchResultDto]]:
  97. return ok([
  98. MemorySearchResultDto(
  99. item=MemoryItemDto.from_entity(item),
  100. score=score,
  101. scoreDetails=score_json)
  102. for item, score, score_json in service.search_memories_contract(payload)
  103. ])