token
This commit is contained in:
parent
bb9fc9a9cf
commit
9dbda69db1
5 changed files with 222 additions and 3 deletions
|
|
@ -5,7 +5,7 @@ from uuid import UUID
|
|||
from fastapi import APIRouter, Depends, HTTPException, Query, Response, status
|
||||
from pydantic import BaseModel, Field
|
||||
from sqlalchemy import select
|
||||
from sqlalchemy.orm import Session, joinedload
|
||||
from sqlalchemy.orm import Session, joinedload, selectinload
|
||||
|
||||
from .auth import ADMIN_COOKIE_NAME, create_admin_token, current_admin
|
||||
from .config import settings
|
||||
|
|
@ -23,7 +23,10 @@ from .models import (
|
|||
TemplateConfig,
|
||||
UrmiOtpProject,
|
||||
UserAccount,
|
||||
WhatsAppBusinessAccount,
|
||||
WhatsAppMessage,
|
||||
WhatsAppMetaConnection,
|
||||
MetaConnection,
|
||||
)
|
||||
from .phone_number_validators import normalize_phone_number, validate_per_min_price, validate_price
|
||||
from .routes_urmiotp import serialize_project
|
||||
|
|
@ -578,6 +581,77 @@ def _whatsapp_client(db: Session) -> WhatsAppGraphClient:
|
|||
)
|
||||
|
||||
|
||||
def _token_account(connection: WhatsAppMetaConnection, account: WhatsAppBusinessAccount) -> dict:
|
||||
return {
|
||||
"id": str(account.id),
|
||||
"name": account.name,
|
||||
"status": account.status,
|
||||
"source": "token" if connection.granted_scopes == "manual" else "signup",
|
||||
"access_token": connection.access_token or "",
|
||||
"waba_id": account.waba_id,
|
||||
"phones": [
|
||||
{
|
||||
"id": str(phone.id),
|
||||
"display_phone": phone.display_phone,
|
||||
"phone_number_id": phone.phone_number_id,
|
||||
"status": phone.status,
|
||||
}
|
||||
for phone in account.phones
|
||||
],
|
||||
"updated_at": account.updated_at,
|
||||
}
|
||||
|
||||
|
||||
@router.get("/connection-tokens")
|
||||
def admin_connection_tokens(db: Session = Depends(get_db), _: str = Depends(current_admin)) -> dict:
|
||||
"""Every customer's saved WhatsApp and Facebook tokens. Admin session only."""
|
||||
users = db.scalars(select(UserAccount).order_by(UserAccount.email.asc())).all()
|
||||
whatsapp_rows = db.scalars(
|
||||
select(WhatsAppMetaConnection).options(
|
||||
selectinload(WhatsAppMetaConnection.accounts).selectinload(WhatsAppBusinessAccount.phones)
|
||||
)
|
||||
).all()
|
||||
facebook_rows = db.scalars(select(MetaConnection)).all()
|
||||
whatsapp_by_user: dict = {}
|
||||
for connection in whatsapp_rows:
|
||||
saved = [_token_account(connection, account) for account in connection.accounts]
|
||||
if not saved and connection.access_token:
|
||||
saved.append({
|
||||
"id": str(connection.id),
|
||||
"name": connection.business_name or "WhatsApp",
|
||||
"status": connection.status,
|
||||
"source": "token" if connection.granted_scopes == "manual" else "signup",
|
||||
"access_token": connection.access_token,
|
||||
"waba_id": "",
|
||||
"phones": [],
|
||||
"updated_at": connection.updated_at,
|
||||
})
|
||||
if saved:
|
||||
whatsapp_by_user.setdefault(connection.user_id, []).extend(saved)
|
||||
facebook_by_user = {row.user_id: row for row in facebook_rows}
|
||||
payload = []
|
||||
for user in users:
|
||||
facebook = facebook_by_user.get(user.id)
|
||||
accounts = whatsapp_by_user.get(user.id, [])
|
||||
facebook_token = facebook.access_token if facebook and facebook.status != "disconnected" else ""
|
||||
if not accounts and not facebook_token:
|
||||
continue
|
||||
payload.append({
|
||||
"id": str(user.id),
|
||||
"name": user.display_name,
|
||||
"email": user.email,
|
||||
"whatsapp_accounts": accounts,
|
||||
"facebook": None if facebook is None or not facebook_token else {
|
||||
"status": facebook.status,
|
||||
"user_name": facebook.meta_user_name,
|
||||
"access_token": facebook_token,
|
||||
"expires_at": facebook.token_expires_at,
|
||||
"connected_at": facebook.connected_at,
|
||||
},
|
||||
})
|
||||
return {"users": payload}
|
||||
|
||||
|
||||
@router.get("/whatsapp/config")
|
||||
def admin_whatsapp_config(db: Session = Depends(get_db), _: str = Depends(current_admin)) -> dict:
|
||||
return {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue