routes.py 4.7 KB

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