36 lines
1.7 KiB
Python
36 lines
1.7 KiB
Python
from typing import Optional
|
|
from fastapi import APIRouter, Request, Depends, HTTPException
|
|
from fastapi.responses import HTMLResponse
|
|
from fastapi.templating import Jinja2Templates
|
|
import pathlib
|
|
from .. import jmap
|
|
|
|
router = APIRouter()
|
|
templates = Jinja2Templates(directory=str(pathlib.Path(__file__).resolve().parent.parent / "templates"))
|
|
|
|
def require_user(request: Request):
|
|
user = request.session.get("user")
|
|
if not user:
|
|
raise HTTPException(status_code=401)
|
|
return user
|
|
|
|
@router.get("/contacts", response_class=HTMLResponse)
|
|
async def contacts(request: Request, q: Optional[str] = None, user=Depends(require_user)):
|
|
async with jmap.client() as ac:
|
|
api = user["api_url"]
|
|
account_id = None
|
|
filter_cond = {"text": q} if q else {}
|
|
res = await jmap.call(ac, api, tuple(user["auth"]), [
|
|
["Contact/query", {"accountId": account_id, "filter": filter_cond, "limit": 100}, "c1"],
|
|
["Contact/get", {"accountId": account_id, "#ids": {"resultOf":"c1","name":"Contact/query","path":"ids"}, "properties":["id","firstName","lastName","emails","company"]}, "c2"]
|
|
])
|
|
contacts = []
|
|
for name, data, _ in res.get("methodResponses", []):
|
|
if name == "Contact/get":
|
|
for c in data.get("list", []):
|
|
emails = [e.get("email","") for e in (c.get("emails") or [])]
|
|
contacts.append({"name": f"{c.get('firstName','')} {c.get('lastName','')}".strip() or (emails[0] if emails else ""),
|
|
"email": ", ".join(emails),
|
|
"org": c.get("company")})
|
|
return templates.TemplateResponse("contacts.html", {"request": request, "contacts": contacts, "q": q, "user": user})
|