from __future__ import annotations from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from app.database import get_db from app.auth import get_current_user from app.models.winter_camp import WinterCampConfig, WinterCampHotel, WinterCampItinerary, WinterCampFaq from app.schemas.winter_camp import ( WinterCampConfigSchema, WinterCampHotelSchema, WinterCampHotelResponse, WinterCampItinerarySchema, WinterCampItineraryResponse, WinterCampFaqSchema, WinterCampFaqResponse, ) router = APIRouter(prefix="/api/winter-camp", tags=["冬季营"], dependencies=[Depends(get_current_user)]) def _get_config(db: Session) -> WinterCampConfig: config = db.query(WinterCampConfig).first() if not config: config = WinterCampConfig() db.add(config) db.flush() return config @router.get("/config", response_model=WinterCampConfigSchema) def get_config(db: Session = Depends(get_db)): c = _get_config(db) return WinterCampConfigSchema( name=c.name, positioning=c.positioning, days=c.days, nights=c.nights, max_families=c.max_families, total_sessions=c.total_sessions, age_range=c.age_range, deposit=c.deposit, season=c.season, route=c.route, why_hulunbuir=c.why_hulunbuir, closing_note=c.closing_note, photographer=c.photographer, winter_clothing=c.winter_clothing, camp_advantages=c.camp_advantages or [], service_config=c.service_config or [], camp_essentials=c.camp_essentials or [], ) @router.put("/config") def update_config(req: WinterCampConfigSchema, db: Session = Depends(get_db)): c = _get_config(db) c.name = req.name c.positioning = req.positioning c.days = req.days c.nights = req.nights c.max_families = req.max_families c.total_sessions = req.total_sessions c.age_range = req.age_range c.deposit = req.deposit c.season = req.season c.route = req.route c.why_hulunbuir = req.why_hulunbuir c.closing_note = req.closing_note c.photographer = req.photographer c.winter_clothing = req.winter_clothing c.camp_advantages = req.camp_advantages c.service_config = req.service_config c.camp_essentials = req.camp_essentials db.commit() return {"message": "冬季营配置更新成功"} # --- Hotels --- @router.get("/hotels", response_model=list[WinterCampHotelResponse]) def list_hotels(db: Session = Depends(get_db)): rows = db.query(WinterCampHotel).order_by(WinterCampHotel.sort_order).all() return [WinterCampHotelResponse(id=h.id, name=h.name, star=h.star, nights=h.nights, description=h.description, sort_order=h.sort_order) for h in rows] @router.put("/hotels") def update_hotels(items: list[WinterCampHotelSchema], db: Session = Depends(get_db)): db.query(WinterCampHotel).delete() for i, h in enumerate(items): db.add(WinterCampHotel(name=h.name, star=h.star, nights=h.nights, description=h.description, sort_order=i)) db.commit() return {"message": "酒店信息更新成功"} # --- Itinerary --- @router.get("/itinerary", response_model=list[WinterCampItineraryResponse]) def list_itinerary(db: Session = Depends(get_db)): rows = db.query(WinterCampItinerary).order_by(WinterCampItinerary.sort_order).all() return [ WinterCampItineraryResponse(id=d.id, day=d.day, title=d.title, summary=d.summary, highlights=d.highlights or [], hotel=d.hotel, sort_order=d.sort_order) for d in rows ] @router.put("/itinerary") def update_itinerary(items: list[WinterCampItinerarySchema], db: Session = Depends(get_db)): db.query(WinterCampItinerary).delete() for i, d in enumerate(items): db.add(WinterCampItinerary(day=d.day, title=d.title, summary=d.summary, highlights=d.highlights, hotel=d.hotel, sort_order=i)) db.commit() return {"message": "行程更新成功"} # --- FAQ --- @router.get("/faq", response_model=list[WinterCampFaqResponse]) def list_faq(db: Session = Depends(get_db)): rows = db.query(WinterCampFaq).order_by(WinterCampFaq.sort_order).all() return [WinterCampFaqResponse(id=f.id, question=f.question, answer=f.answer, sort_order=f.sort_order) for f in rows] @router.post("/faq", response_model=WinterCampFaqResponse, status_code=201) def create_faq(req: WinterCampFaqSchema, db: Session = Depends(get_db)): f = WinterCampFaq(question=req.question, answer=req.answer) db.add(f) db.commit() db.refresh(f) return WinterCampFaqResponse(id=f.id, question=f.question, answer=f.answer, sort_order=f.sort_order) @router.put("/faq/{f_id}") def update_faq(f_id: int, req: WinterCampFaqSchema, db: Session = Depends(get_db)): f = db.query(WinterCampFaq).get(f_id) if not f: raise HTTPException(status_code=404, detail="FAQ不存在") f.question = req.question f.answer = req.answer db.commit() return {"message": "更新成功"} @router.delete("/faq/{f_id}") def delete_faq(f_id: int, db: Session = Depends(get_db)): f = db.query(WinterCampFaq).get(f_id) if not f: raise HTTPException(status_code=404, detail="FAQ不存在") db.delete(f) db.commit() return {"message": "删除成功"}