from fastapi import APIRouter, HTTPException from .. import database as db, config router = APIRouter(prefix="/api/campaigns", tags=["campaigns"]) @router.get("") def list_campaigns(): return db.list_campaigns() @router.post("") def create_campaign(body: dict): name = body.get("name", "").strip() if not name: raise HTTPException(400, "Name is required") desc = body.get("description", "").strip() return db.create_campaign(name, desc) @router.get("/{campaign_id}") def get_campaign(campaign_id: str): campaign = db.get_campaign(campaign_id) if not campaign: raise HTTPException(404, "Campaign not found") return campaign @router.put("/{campaign_id}") def update_campaign(campaign_id: str, body: dict): if not db.get_campaign(campaign_id): raise HTTPException(404, "Campaign not found") updated = db.update_campaign( campaign_id, name=body.get("name"), description=body.get("description"), ) return updated @router.delete("/{campaign_id}") def delete_campaign(campaign_id: str): if not db.get_campaign(campaign_id): raise HTTPException(404, "Campaign not found") db.delete_campaign(campaign_id) return {"ok": True} @router.get("/{campaign_id}/settings") def get_campaign_settings(campaign_id: str): if not db.get_campaign(campaign_id): raise HTTPException(404, "Campaign not found") raw = db.get_campaign_settings(campaign_id) # return defaults for any missing keys merged = {**config.CAMPAIGN_SETTINGS, **raw} return merged @router.post("/{campaign_id}/settings") def update_campaign_settings(campaign_id: str, body: dict): if not db.get_campaign(campaign_id): raise HTTPException(404, "Campaign not found") clean = {k: str(v) for k, v in body.items() if k in config.CAMPAIGN_SETTINGS} db.update_campaign_settings(campaign_id, clean) raw = db.get_campaign_settings(campaign_id) merged = {**config.CAMPAIGN_SETTINGS, **raw} return merged