""" 시스템 정보 API (모바일 기능 #77). GET /api/system/release-notes — 버전별 릴리즈 노트 목록 GET /api/system/version — 현재 버전 정보 릴리즈 노트는 정적 정의(코드 내장)로 제공한다. """ from __future__ import annotations from typing import List, Optional from fastapi import APIRouter, Depends from pydantic import BaseModel from core.auth import get_current_user from models import User router = APIRouter(prefix="/api/system", tags=["System"]) CURRENT_VERSION = "2.0.0" # 최신 → 과거 순서 _RELEASE_NOTES: List[dict] = [ { "version": "2.0.0", "date": "2026-06-06", "changes": [ "모바일 100기능 백엔드 API 추가 (알림규칙·통합검색·SR채팅·부품재고)", "SR 에스컬레이션/구독/만족도/현장서명/체크인 지원", "보안 이벤트 로그 및 디바이스 관리 추가", "다단계 승인 현황 및 변경 달력 API 추가", ], "breaking_changes": [], }, { "version": "1.5.0", "date": "2026-06-01", "changes": [ "CI/CD 배포 트리거 연동", "tmux 세션 관리·하네스 빌더 추가", "AI-SOC·데이터 거버넌스 영역 확장", ], "breaking_changes": [], }, { "version": "1.0.0", "date": "2026-05-20", "changes": [ "GUARDiA ITSM 정식 출시", "SR 라이프사이클·CMDB·KB·SLA·승인 워크플로우", ], "breaking_changes": [], }, ] class ReleaseNote(BaseModel): version: str date: str changes: List[str] breaking_changes: List[str] = [] @router.get("/release-notes", response_model=List[ReleaseNote]) async def list_release_notes( since: Optional[str] = None, _u: User = Depends(get_current_user), ): """버전별 릴리즈 노트 목록 (최신순). since 지정 시 해당 버전 이후만.""" notes = _RELEASE_NOTES if since: # since 버전 이후(미포함)만 반환 filtered = [] for n in notes: if n["version"] == since: break filtered.append(n) notes = filtered return notes @router.get("/version") async def get_version(_u: User = Depends(get_current_user)): """현재 버전 정보.""" latest = _RELEASE_NOTES[0] if _RELEASE_NOTES else None return { "name": "GUARDiA ITSM", "version": CURRENT_VERSION, "latest_release_date": latest["date"] if latest else None, "release_count": len(_RELEASE_NOTES), }