File size: 2,655 Bytes
594ed40
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from typing import List, Optional
from pydantic import BaseModel
from datetime import datetime

# Pydanticモデルを更新
class VerificationMark(BaseModel):
    verification_type: str = "none"
    is_expert_verified: bool
    expert_orcid_id: Optional[str] = None
    expert_name: Optional[str] = None
    verification_date: Optional[datetime] = None
    verification_count: int = 0
    
    class Config:
        from_attributes = True

class KnowledgeTile(BaseModel):
    tile_id: str
    domain_id: str
    topic: str
    content_preview: str
    created_at: datetime
    updated_at: datetime
    verification_mark: VerificationMark
    contributor_id: Optional[str] = None
    confidence_score: float = 0.0
    tags: List[str] = []
    coordinates: Optional[List[float]] = None  # 6D coordinates [x, y, z, c, g, v]

    # ORMモデルからPydanticモデルへの変換を補助
    @classmethod
    def from_orm(cls, orm_obj):
        content_preview = orm_obj.content[:200] + "..." if len(orm_obj.content) > 200 else orm_obj.content
        
        is_expert_verified = orm_obj.verification_type in ["expert", "multi_expert"]
        expert_orcid = None
        expert_name = None
        if is_expert_verified and orm_obj.last_verified_by:
            expert_orcid = orm_obj.last_verified_by.orcid_id
            expert_name = orm_obj.last_verified_by.display_name

        verification_mark = VerificationMark(
            verification_type=orm_obj.verification_type,
            is_expert_verified=is_expert_verified,
            expert_orcid_id=expert_orcid,
            expert_name=expert_name,
            verification_date=orm_obj.last_verified_at,
            verification_count=orm_obj.verification_count
        )

        return cls(
            tile_id=orm_obj.id,
            domain_id=orm_obj.domain_id,
            topic=orm_obj.topic,
            content_preview=content_preview,
            created_at=orm_obj.created_at,
            updated_at=orm_obj.updated_at,
            verification_mark=verification_mark,
            contributor_id=orm_obj.contributor_id,
            confidence_score=orm_obj.confidence_score,
            tags=orm_obj.tags or [],
            coordinates=orm_obj.coordinates
        )

class KnowledgeListResponse(BaseModel):
    tiles: List[KnowledgeTile]
    total_count: int
    page: int
    page_size: int
    has_more: bool


class KnowledgeDetailResponse(BaseModel):
    tile: KnowledgeTile
    full_content: str
    sources: List[str] = []
    related_tiles: List[str] = []
    edit_history: List[dict] = []


class EditRequest(BaseModel):
    content: str
    edit_reason: Optional[str] = None