This commit is contained in:
debu-2 2026-10-13 01:33:49 +05:30
parent bb9fc9a9cf
commit 9dbda69db1
5 changed files with 222 additions and 3 deletions

View file

@ -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 {