File size: 4,956 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 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 | """
案件 API
API 层职责:
1. 接收 HTTP 请求,验证参数(通过 Schema)
2. 调用 Service 层方法
3. 返回响应
不包含:业务逻辑、权限检查、异常处理(依赖全局异常处理器)
"""
from __future__ import annotations
from typing import Any, cast
from django.http import HttpRequest
from ninja import Router
from apps.cases.schemas import CaseCreateFull, CaseFullOut, CaseIn, CaseOut, CaseUpdate
from apps.cases.services import CaseService
from apps.core.dto.request_context import extract_request_context
router = Router()
def _get_case_service() -> CaseService:
from apps.contracts.services.contract.wiring import get_contract_service
return CaseService(contract_service=get_contract_service())
def _get_case_query_facade() -> CaseService:
return _get_case_service()
def _get_case_mutation_facade() -> CaseService:
return _get_case_service()
@router.get("/cases/search", response=list[CaseOut])
def search_cases(
request: HttpRequest,
q: str,
limit: int | None = 10,
) -> list[CaseOut]:
"""搜索案件"""
service = _get_case_query_facade()
ctx = extract_request_context(request)
return cast(
list[CaseOut],
service.search_cases(
query=q,
limit=limit, # type: ignore[arg-type]
user=ctx.user,
org_access=ctx.org_access,
perm_open_access=ctx.perm_open_access,
),
)
@router.get("/cases", response=list[CaseOut])
def list_cases(
request: HttpRequest,
case_type: str | None = None,
status: str | None = None,
case_number: str | None = None,
) -> list[CaseOut]:
"""获取案件列表"""
service = _get_case_query_facade()
ctx = extract_request_context(request)
if case_number:
return cast(
list[CaseOut],
service.search_by_case_number(
case_number=case_number,
user=ctx.user,
org_access=ctx.org_access,
perm_open_access=ctx.perm_open_access,
),
)
return cast(
list[CaseOut],
service.list_cases(
case_type=case_type,
status=status,
user=ctx.user,
org_access=ctx.org_access,
perm_open_access=ctx.perm_open_access,
),
)
@router.get("/cases/{case_id}", response=CaseOut)
def get_case(request: HttpRequest, case_id: int) -> CaseOut:
"""获取单个案件"""
service = _get_case_query_facade()
ctx = extract_request_context(request)
return cast(
CaseOut,
service.get_case(
case_id=case_id,
user=ctx.user,
org_access=ctx.org_access,
perm_open_access=ctx.perm_open_access,
),
)
@router.post("/cases", response=CaseOut)
def create_case(request: HttpRequest, payload: CaseIn) -> CaseOut:
"""创建案件"""
service = _get_case_mutation_facade()
ctx = extract_request_context(request)
data = payload.dict()
return cast(CaseOut, service.create_case(data, user=ctx.user))
@router.put("/cases/{case_id}", response=CaseOut)
def update_case(request: HttpRequest, case_id: int, payload: CaseUpdate) -> CaseOut:
"""更新案件"""
service = _get_case_mutation_facade()
ctx = extract_request_context(request)
data = payload.dict(exclude_unset=True)
return cast(CaseOut, service.update_case(case_id, data, user=ctx.user))
@router.delete("/cases/{case_id}")
def delete_case(request: HttpRequest, case_id: int) -> dict[str, bool]:
"""删除案件"""
service = _get_case_mutation_facade()
ctx = extract_request_context(request)
service.delete_case(case_id, user=ctx.user)
return {"success": True}
@router.post("/cases/full", response=CaseFullOut)
def create_case_full(request: HttpRequest, payload: CaseCreateFull) -> CaseFullOut:
"""创建完整案件(包含当事人、指派、日志)"""
service = _get_case_mutation_facade()
ctx = extract_request_context(request)
actor_id = getattr(ctx.user, "id", None) if ctx.user else None
data: dict[str, Any] = {
"case": payload.case.dict(),
"parties": [p.dict() for p in payload.parties] if payload.parties else [],
"assignments": [a.dict() for a in payload.assignments] if payload.assignments else [],
"logs": [log.dict() for log in payload.logs] if payload.logs else [],
"supervising_authorities": (
[s.dict() for s in payload.supervising_authorities] if payload.supervising_authorities else []
),
}
result = service.create_case_full(data, actor_id=actor_id, user=ctx.user)
return CaseFullOut(
case=result["case"],
parties=result["parties"],
assignments=result["assignments"],
logs=result["logs"],
case_numbers=[],
supervising_authorities=result.get("supervising_authorities", []),
)
|