from fastapi import APIRouter, HTTPException, Body, Query from datetime import datetime, timezone from app.db.database import db router = APIRouter(prefix="/api/admin/daily-quests", tags=["Admin Daily Quests"]) pool = db.daily_quests_pool @router.get("/pool") async def list_pool(enabled: bool | None = Query(None)): q = {} if enabled is not None: q["enabled"] = enabled items = await pool.find(q, {"_id": 0}).sort("key", 1).to_list(1000) return {"ok": True, "items": items, "count": len(items)} @router.post("/pool/upsert") async def upsert_pool_item(payload: dict = Body(...)): # минимальная валидация key = payload.get("key") if not key or not isinstance(key, str): raise HTTPException(status_code=400, detail="Missing key") # дефолты payload.setdefault("enabled", True) payload.setdefault("weight", 1) payload.setdefault("min_required", 1) payload.setdefault("max_required", payload["min_required"]) payload.setdefault("reward_per_unit", 1) # тех.поля payload["updated_at"] = datetime.now(timezone.utc).replace(tzinfo=None) await pool.update_one({"key": key}, {"$set": payload}, upsert=True) item = await pool.find_one({"key": key}, {"_id": 0}) return {"ok": True, "item": item} @router.post("/pool/disable") async def disable_pool_item(key: str = Query(...)): res = await pool.update_one({"key": key}, {"$set": {"enabled": False}}) if res.matched_count == 0: raise HTTPException(status_code=404, detail="Not found") return {"ok": True} @router.post("/pool/enable") async def enable_pool_item(key: str = Query(...)): res = await pool.update_one({"key": key}, {"$set": {"enabled": True}}) if res.matched_count == 0: raise HTTPException(status_code=404, detail="Not found") return {"ok": True} @router.delete("/pool") async def delete_pool_item(key: str = Query(...)): res = await pool.delete_one({"key": key}) if res.deleted_count == 0: raise HTTPException(status_code=404, detail="Not found") return {"ok": True}