from fastapi import APIRouter, Depends, Form from sqlalchemy.orm import Session from datetime import datetime from typing import Optional from database import get_db import models 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 # ── 관리자 설정 저장 (신고공개정책 + 이미지설정 통합) @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"), 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), ] for key, val in pairs: upsert(db, key, val) db.commit() return {"ok": True}