72 lines
2.3 KiB
Python
72 lines
2.3 KiB
Python
import asyncio
|
|
import logging
|
|
from fastapi import APIRouter, Depends, Query, BackgroundTasks
|
|
from typing import Optional
|
|
|
|
from auth.models import TokenPayload
|
|
from auth.dependencies import require_permission
|
|
from crm.models import CustomerCreate, CustomerUpdate, CustomerInDB, CustomerListResponse
|
|
from crm import service, nextcloud
|
|
from config import settings
|
|
|
|
router = APIRouter(prefix="/api/crm/customers", tags=["crm-customers"])
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
@router.get("", response_model=CustomerListResponse)
|
|
def list_customers(
|
|
search: Optional[str] = Query(None),
|
|
tag: Optional[str] = Query(None),
|
|
_user: TokenPayload = Depends(require_permission("crm", "view")),
|
|
):
|
|
customers = service.list_customers(search=search, tag=tag)
|
|
return CustomerListResponse(customers=customers, total=len(customers))
|
|
|
|
|
|
@router.get("/{customer_id}", response_model=CustomerInDB)
|
|
def get_customer(
|
|
customer_id: str,
|
|
_user: TokenPayload = Depends(require_permission("crm", "view")),
|
|
):
|
|
return service.get_customer(customer_id)
|
|
|
|
|
|
@router.post("", response_model=CustomerInDB, status_code=201)
|
|
async def create_customer(
|
|
body: CustomerCreate,
|
|
background_tasks: BackgroundTasks,
|
|
_user: TokenPayload = Depends(require_permission("crm", "edit")),
|
|
):
|
|
customer = service.create_customer(body)
|
|
if settings.nextcloud_url:
|
|
background_tasks.add_task(_init_nextcloud_folder, customer)
|
|
return customer
|
|
|
|
|
|
async def _init_nextcloud_folder(customer) -> None:
|
|
try:
|
|
nc_path = service.get_customer_nc_path(customer)
|
|
base = f"customers/{nc_path}"
|
|
for sub in ("media", "documents", "sent", "received"):
|
|
await nextcloud.ensure_folder(f"{base}/{sub}")
|
|
await nextcloud.write_info_file(base, customer.name, customer.id)
|
|
except Exception as e:
|
|
logger.warning("Nextcloud folder init failed for customer %s: %s", customer.id, e)
|
|
|
|
|
|
@router.put("/{customer_id}", response_model=CustomerInDB)
|
|
def update_customer(
|
|
customer_id: str,
|
|
body: CustomerUpdate,
|
|
_user: TokenPayload = Depends(require_permission("crm", "edit")),
|
|
):
|
|
return service.update_customer(customer_id, body)
|
|
|
|
|
|
@router.delete("/{customer_id}", status_code=204)
|
|
def delete_customer(
|
|
customer_id: str,
|
|
_user: TokenPayload = Depends(require_permission("crm", "edit")),
|
|
):
|
|
service.delete_customer(customer_id)
|