M11: implement operational booking lifecycle
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
from fastapi import APIRouter, Depends, Query
|
||||
from sqlalchemy import or_, select
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.api.deps import get_current_user, get_db
|
||||
from app.models.customer import Customer
|
||||
from app.schemas import CurrentUser, CustomerOptionOut
|
||||
|
||||
router = APIRouter(prefix="/api/v1/customers", tags=["customers"])
|
||||
|
||||
|
||||
@router.get("", response_model=list[CustomerOptionOut])
|
||||
def search_customers(
|
||||
query: str = Query(min_length=2, max_length=100),
|
||||
limit: int = Query(default=20, ge=1, le=50),
|
||||
db: Session = Depends(get_db),
|
||||
_user: CurrentUser = Depends(get_current_user),
|
||||
) -> list[CustomerOptionOut]:
|
||||
term = f"%{query.strip()}%"
|
||||
customers = db.scalars(
|
||||
select(Customer)
|
||||
.where(
|
||||
Customer.merged_into_customer_id.is_(None),
|
||||
or_(
|
||||
Customer.public_ref.ilike(term),
|
||||
Customer.first_name.ilike(term),
|
||||
Customer.last_name.ilike(term),
|
||||
Customer.email.ilike(term),
|
||||
),
|
||||
)
|
||||
.order_by(Customer.last_name, Customer.first_name)
|
||||
.limit(limit)
|
||||
).all()
|
||||
return [
|
||||
CustomerOptionOut(
|
||||
public_ref=customer.public_ref,
|
||||
display_name=f"{customer.first_name} {customer.last_name}",
|
||||
email=customer.email,
|
||||
)
|
||||
for customer in customers
|
||||
]
|
||||
Reference in New Issue
Block a user