File size: 3,704 Bytes
b4f2238 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | """
案件日志 API 层
符合三层架构规范:只做请求/响应处理,业务逻辑在 Service 层
"""
from __future__ import annotations
from typing import Any, cast
from django.http import HttpRequest
from ninja import Router
from apps.cases.schemas import CaseLogIn, CaseLogOut, CaseLogUpdate
from apps.cases.services.log.caselog_service import CaseLogService
from apps.core.dto.request_context import extract_request_context
router = Router()
def _get_caselog_service() -> CaseLogService:
"""工厂函数:创建 CaseLogService 实例"""
return CaseLogService()
@router.get("/logs", response=list[CaseLogOut])
def list_logs(request: HttpRequest, case_id: int | None = None) -> list[CaseLogOut]:
"""获取日志列表"""
service = _get_caselog_service()
ctx = extract_request_context(request)
return cast(
list[CaseLogOut],
service.list_logs(
case_id=case_id,
user=ctx.user,
org_access=ctx.org_access,
perm_open_access=ctx.perm_open_access,
),
)
@router.post("/logs", response=CaseLogOut)
def create_log(request: HttpRequest, payload: CaseLogIn) -> CaseLogOut:
"""创建日志"""
service = _get_caselog_service()
ctx = extract_request_context(request)
reminder_time = service.parse_reminder_time(payload.reminder_time) # type: ignore[attr-defined]
return cast(
CaseLogOut,
service.create_log(
case_id=payload.case_id,
content=payload.content,
user=ctx.user,
reminder_type=payload.reminder_type, # type: ignore[attr-defined]
reminder_time=reminder_time,
),
)
@router.get("/logs/{log_id}", response=CaseLogOut)
def get_log(request: HttpRequest, log_id: int) -> CaseLogOut:
"""获取单个日志"""
service = _get_caselog_service()
ctx = extract_request_context(request)
return cast(
CaseLogOut,
service.get_log(
log_id=log_id,
user=ctx.user,
org_access=ctx.org_access,
perm_open_access=ctx.perm_open_access,
),
)
@router.put("/logs/{log_id}", response=CaseLogOut)
def update_log(request: HttpRequest, log_id: int, payload: CaseLogUpdate) -> CaseLogOut:
"""更新日志"""
service = _get_caselog_service()
ctx = extract_request_context(request)
data = payload.dict(exclude_unset=True)
if "reminder_time" in data and isinstance(data["reminder_time"], str):
data["reminder_time"] = service.parse_reminder_time(data["reminder_time"])
return cast(
CaseLogOut,
service.update_log(
log_id=log_id,
data=data,
user=ctx.user,
org_access=ctx.org_access,
perm_open_access=ctx.perm_open_access,
),
)
@router.delete("/logs/{log_id}")
def delete_log(request: HttpRequest, log_id: int) -> Any:
"""删除日志"""
service = _get_caselog_service()
ctx = extract_request_context(request)
return service.delete_log(
log_id=log_id,
user=ctx.user,
org_access=ctx.org_access,
perm_open_access=ctx.perm_open_access,
)
@router.post("/logs/{log_id}/attachments")
def upload_log_attachments(request: HttpRequest, log_id: int) -> Any:
"""上传日志附件"""
service = _get_caselog_service()
ctx = extract_request_context(request)
files = request.FILES.getlist("files") if hasattr(request, "FILES") else []
return service.upload_attachments(
log_id=log_id,
files=files,
user=ctx.user,
org_access=ctx.org_access,
perm_open_access=ctx.perm_open_access,
)
|