44 lines
1.2 KiB
Python
44 lines
1.2 KiB
Python
"""CRM / Leads API — Spec 012."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException, Query
|
|
|
|
from app import auth, crm_leads
|
|
from app.permissions import can_read_crm_leads
|
|
|
|
router = APIRouter(prefix="/api/v1/crm", tags=["crm"])
|
|
|
|
|
|
def _db():
|
|
from app.main import db
|
|
|
|
return db()
|
|
|
|
|
|
@router.get("/leads")
|
|
def list_crm_leads(user: auth.DeskUser = Depends(auth.get_current_user)):
|
|
if not can_read_crm_leads(user.role):
|
|
raise HTTPException(403, "insufficient permissions")
|
|
with _db() as conn:
|
|
leads = crm_leads.list_leads(conn)
|
|
stale_hours = crm_leads.ONBOARD_STALE_HOURS
|
|
return {
|
|
"leads": leads,
|
|
"total": len(leads),
|
|
"stale_hours": stale_hours,
|
|
}
|
|
|
|
|
|
@router.post("/leads/sync")
|
|
def sync_stale_leads(
|
|
stale_hours: int | None = Query(default=None, ge=0, le=720),
|
|
user: auth.DeskUser = Depends(auth.require_internal_or_user),
|
|
):
|
|
if user.username != "worker" and not can_read_crm_leads(user.role):
|
|
raise HTTPException(403, "insufficient permissions")
|
|
with _db() as conn:
|
|
result = crm_leads.promote_stale_leads(conn, stale_hours=stale_hours)
|
|
total = crm_leads.count_leads(conn)
|
|
result["leads_total"] = total
|
|
return result
|