guardia-itsm/routers/system.py

93 lines
2.6 KiB
Python

"""
시스템 정보 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),
}