from fastapi import APIRouter, Depends, HTTPException, Form, Request from sqlalchemy.orm import Session from sqlalchemy import extract from database import get_db from auth import require_admin import models from datetime import date as date_type router = APIRouter(prefix="/api/holidays", tags=["holidays"]) @router.get("") def list_holidays(year: int = None, db: Session = Depends(get_db), _=Depends(require_admin)): q = db.query(models.Holiday) if year: q = q.filter(extract('year', models.Holiday.holiday_date) == year) rows = q.order_by(models.Holiday.holiday_date).all() return [{"date": str(r.holiday_date), "name": r.name} for r in rows] @router.post("") def add_holiday( holiday_date: str = Form(...), name: str = Form(...), db: Session = Depends(get_db), _=Depends(require_admin), ): try: d = date_type.fromisoformat(holiday_date) except ValueError: raise HTTPException(400, "날짜 형식이 올바르지 않습니다 (YYYY-MM-DD).") if db.query(models.Holiday).filter_by(holiday_date=d).first(): raise HTTPException(400, "이미 등록된 날짜입니다.") db.add(models.Holiday(holiday_date=d, name=name)) db.commit() return {"ok": True} @router.post("/bulk") async def bulk_add_holidays(request: Request, db: Session = Depends(get_db), _=Depends(require_admin)): """JSON body: [{"date": "YYYY-MM-DD", "name": "공휴일명"}, ...]""" items = await request.json() if not isinstance(items, list): raise HTTPException(400, "배열 형식이어야 합니다.") added = 0 for item in items: try: d = date_type.fromisoformat(item["date"]) except (KeyError, ValueError): continue if not db.query(models.Holiday).filter_by(holiday_date=d).first(): db.add(models.Holiday(holiday_date=d, name=item.get("name", "공휴일"))) added += 1 db.commit() return {"ok": True, "added": added} @router.delete("/{holiday_date}") def delete_holiday( holiday_date: str, db: Session = Depends(get_db), _=Depends(require_admin), ): try: d = date_type.fromisoformat(holiday_date) except ValueError: raise HTTPException(400, "날짜 형식이 올바르지 않습니다.") h = db.query(models.Holiday).filter_by(holiday_date=d).first() if not h: raise HTTPException(404, "등록된 공휴일이 아닙니다.") db.delete(h); db.commit() return {"ok": True}