File size: 3,909 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
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
from fastapi import APIRouter, HTTPException, Depends
from pydantic import BaseModel
from typing import List, Dict, Any, Optional
import json
import os

from backend.app.middleware.auth import (
    get_current_user, get_current_user_optional, get_user_or_guest,
    require_role, require_expert, User, GuestUser
)

router = APIRouter()

DOMAIN_SCHEMAS_PATH = "domain_schemas.json"


class DomainAxis(BaseModel):
    name: str
    description: str
    keywords: List[str]


class DomainSchema(BaseModel):
    domain_id: str
    name: str
    description: str
    axes: List[DomainAxis]


class DomainListResponse(BaseModel):
    domains: List[Dict[str, Any]]


def load_schemas() -> Dict:
    """ドメインスキーマファイルを読み込む"""
    if os.path.exists(DOMAIN_SCHEMAS_PATH):
        with open(DOMAIN_SCHEMAS_PATH, 'r', encoding='utf-8') as f:
            return json.load(f)
    return {"domains": {}}


def save_schemas(schemas: Dict):
    """ドメインスキーマファイルを保存"""
    with open(DOMAIN_SCHEMAS_PATH, 'w', encoding='utf-8') as f:
        json.dump(schemas, f, ensure_ascii=False, indent=2)


@router.get("/", response_model=DomainListResponse)
async def list_domains(
    current_user: User = Depends(get_user_or_guest)
):
    """利用可能なドメイン一覧を取得(ゲストアクセス可)"""
    schemas = load_schemas()
    domains = []

    for domain_id, schema in schemas.get("domains", {}).items():
        domains.append({
            "domain_id": domain_id,
            "name": schema.get("name", domain_id),
            "description": schema.get("description", ""),
            "axis_count": len(schema.get("axes", []))
        })

    return {"domains": domains}


@router.get("/{domain_id}")
async def get_domain(
    domain_id: str,
    current_user: User = Depends(get_user_or_guest)
):
    """特定のドメインスキーマを取得(ゲストアクセス可)"""
    schemas = load_schemas()

    if domain_id not in schemas.get("domains", {}):
        raise HTTPException(status_code=404, detail=f"Domain '{domain_id}' not found")

    schema = schemas["domains"][domain_id]
    return {
        "domain_id": domain_id,
        **schema
    }


@router.put("/{domain_id}")
async def update_domain(
    domain_id: str,
    domain: DomainSchema,
    current_user: User = Depends(require_role("editor"))
):
    """
    ドメインスキーマを更新(または新規作成)。
    editorまたはadminロールが必要。
    """
    schemas = load_schemas()

    if "domains" not in schemas:
        schemas["domains"] = {}

    schemas["domains"][domain_id] = {
        "name": domain.name,
        "description": domain.description,
        "axes": [
            {
                "name": axis.name,
                "description": axis.description,
                "keywords": axis.keywords
            }
            for axis in domain.axes
        ]
    }

    save_schemas(schemas)

    return {
        "message": f"Domain '{domain_id}' updated successfully",
        "domain_id": domain_id,
        "updated_by": current_user.id
    }


@router.delete("/{domain_id}")
async def delete_domain(
    domain_id: str,
    current_user: User = Depends(require_role("admin"))
):
    """ドメインを削除(adminのみ)"""
    schemas = load_schemas()

    if domain_id not in schemas.get("domains", {}):
        raise HTTPException(status_code=404, detail=f"Domain '{domain_id}' not found")

    # 基本ドメインは削除不可
    protected_domains = ["medical", "legal", "economics"]
    if domain_id in protected_domains:
        raise HTTPException(status_code=403, detail=f"Cannot delete protected domain '{domain_id}'")

    del schemas["domains"][domain_id]
    save_schemas(schemas)

    return {
        "message": f"Domain '{domain_id}' deleted successfully",
        "deleted_by": current_user.id
    }