from fastapi import APIRouter, Depends, Form, Request from sqlalchemy.orm import Session from datetime import datetime from typing import Optional from database import get_db import models, json from auth import require_admin router = APIRouter(prefix="/api/settings", tags=["settings"]) # 이미지 설정 기본값 IMAGE_DEFAULTS = { "image_compress_enabled": "true", "image_max_px": "1024", "image_quality": "85", } def upsert(db, key, value): s = db.query(models.SystemSetting).filter_by(key=key).first() if s: s.value = value s.updated_at = datetime.now() else: db.add(models.SystemSetting(key=key, value=value)) # ── 공개 엔드포인트: 이미지 설정만 반환 (인증 불필요 — 신고 페이지에서 사용) @router.get("/public") def get_public_settings(db: Session = Depends(get_db)): rows = db.query(models.SystemSetting).filter( models.SystemSetting.key.in_(IMAGE_DEFAULTS.keys()) ).all() result = dict(IMAGE_DEFAULTS) # 기본값으로 채운 뒤 for r in rows: result[r.key] = r.value # DB 값으로 덮어쓰기 return { "image_compress_enabled": result["image_compress_enabled"] == "true", "image_max_px": int(result["image_max_px"]), "image_quality": int(result["image_quality"]), } # ── 관리자 전체 설정 조회 @router.get("") def get_settings(db: Session = Depends(get_db), _=Depends(require_admin)): rows = db.query(models.SystemSetting).all() result = dict(IMAGE_DEFAULTS) for r in rows: result[r.key] = r.value return result DEFAULT_ISSUE_TYPES = [ {"key": "충전불가", "label": "⚡ 충전 불가"}, {"key": "화면오류", "label": "🖥 화면 오류"}, {"key": "케이블불량", "label": "🔌 케이블 불량"}, {"key": "결제오류", "label": "💳 결제 오류"}, {"key": "외관손상", "label": "🔨 외관 손상"}, {"key": "에러발생", "label": "⚠️ 에러 발생"}, {"key": "기타", "label": "📋 기타"}, ] @router.get("/issue-types") def get_issue_types(db: Session = Depends(get_db)): row = db.query(models.SystemSetting).filter_by(key="issue_types").first() if row: return json.loads(row.value) return DEFAULT_ISSUE_TYPES @router.put("/issue-types") async def update_issue_types(request: Request, db: Session = Depends(get_db), _=Depends(require_admin)): items = await request.json() if not isinstance(items, list): from fastapi import HTTPException raise HTTPException(400, "배열 형식이어야 합니다.") upsert(db, "issue_types", json.dumps(items, ensure_ascii=False)) db.commit() return {"ok": True} DEFAULT_REPAIR_TYPES = [ {"key": "부품교체", "label": "🔩 부품 교체"}, {"key": "재시작", "label": "🔄 재시작"}, {"key": "설정변경", "label": "⚙️ 설정 변경"}, {"key": "청소", "label": "🧹 청소"}, {"key": "배선정리", "label": "🔌 배선 정리"}, {"key": "펌웨어", "label": "💾 펌웨어 업데이트"}, {"key": "기타", "label": "📋 기타"}, ] @router.get("/repair-types") def get_repair_types(db: Session = Depends(get_db)): row = db.query(models.SystemSetting).filter_by(key="repair_types").first() if row: return json.loads(row.value) return DEFAULT_REPAIR_TYPES @router.put("/repair-types") async def update_repair_types(request: Request, db: Session = Depends(get_db), _=Depends(require_admin)): items = await request.json() if not isinstance(items, list): from fastapi import HTTPException raise HTTPException(400, "배열 형식이어야 합니다.") upsert(db, "repair_types", json.dumps(items, ensure_ascii=False)) db.commit() return {"ok": True} # ── 관리자 설정 저장 (신고공개정책 + 이미지설정 + 처리시간기준 통합) @router.put("") def update_settings( report_visibility_policy: str = Form(...), image_compress_enabled: str = Form("true"), image_max_px: str = Form("1024"), image_quality: str = Form("85"), time_metric_base: str = Form("occurred"), time_metric_worktime: str = Form("false"), db: Session = Depends(get_db), _ = Depends(require_admin) ): pairs = [ ("report_visibility_policy", report_visibility_policy), ("image_compress_enabled", image_compress_enabled), ("image_max_px", image_max_px), ("image_quality", image_quality), ("time_metric_base", time_metric_base), ("time_metric_worktime", time_metric_worktime), ] for key, val in pairs: upsert(db, key, val) db.commit() return {"ok": True}