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