Update routes/approvals.py
Browse files- routes/approvals.py +59 -9
routes/approvals.py
CHANGED
@@ -64,9 +64,9 @@ async def verify_admin_token(user_token: str) -> str:
|
|
64 |
return user_id
|
65 |
|
66 |
async def get_users_pending_approval() -> Dict[str, Any]:
|
67 |
-
"""Obtém todos os usuários que ainda não foram aprovados
|
68 |
try:
|
69 |
-
|
70 |
f"{SUPABASE_URL}/rest/v1/User"
|
71 |
"?select=id,name,avatar,role,blurhash"
|
72 |
"&approved_account=eq.false"
|
@@ -79,16 +79,66 @@ async def get_users_pending_approval() -> Dict[str, Any]:
|
|
79 |
headers["Accept"] = "application/json; charset=utf-8"
|
80 |
|
81 |
async with aiohttp.ClientSession() as session:
|
82 |
-
|
|
|
83 |
if response.status != 200:
|
84 |
-
logger.error(f"❌ Erro ao buscar usuários pendentes
|
85 |
-
raise HTTPException(status_code=500, detail="Erro ao consultar
|
86 |
-
|
87 |
users = await response.json()
|
88 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
89 |
|
90 |
except Exception as e:
|
91 |
-
logger.error(f"❌ Erro ao buscar usuários
|
92 |
raise HTTPException(status_code=500, detail="Erro interno do servidor")
|
93 |
|
94 |
@router.get("/admin/pending-approvals")
|
@@ -97,7 +147,7 @@ async def pending_approvals_endpoint(
|
|
97 |
):
|
98 |
"""
|
99 |
Endpoint para listar usuários que ainda não foram aprovados,
|
100 |
-
|
101 |
"""
|
102 |
try:
|
103 |
await verify_admin_token(user_token)
|
|
|
64 |
return user_id
|
65 |
|
66 |
async def get_users_pending_approval() -> Dict[str, Any]:
|
67 |
+
"""Obtém todos os usuários que ainda não foram aprovados e suas respostas de onboarding"""
|
68 |
try:
|
69 |
+
query_users = (
|
70 |
f"{SUPABASE_URL}/rest/v1/User"
|
71 |
"?select=id,name,avatar,role,blurhash"
|
72 |
"&approved_account=eq.false"
|
|
|
79 |
headers["Accept"] = "application/json; charset=utf-8"
|
80 |
|
81 |
async with aiohttp.ClientSession() as session:
|
82 |
+
# Busca os usuários pendentes
|
83 |
+
async with session.get(query_users, headers=headers) as response:
|
84 |
if response.status != 200:
|
85 |
+
logger.error(f"❌ Erro ao buscar usuários pendentes: {response.status}")
|
86 |
+
raise HTTPException(status_code=500, detail="Erro ao consultar usuários")
|
87 |
+
|
88 |
users = await response.json()
|
89 |
+
|
90 |
+
# Se nenhum usuário, retornar vazio
|
91 |
+
if not users:
|
92 |
+
return {"users": [], "count": 0}
|
93 |
+
|
94 |
+
user_ids = [f"id=eq.{user['id']}" for user in users]
|
95 |
+
user_ids_query = ",".join(user_ids)
|
96 |
+
|
97 |
+
# Busca as respostas desses usuários
|
98 |
+
query_answers = (
|
99 |
+
f"{SUPABASE_URL}/rest/v1/User answers"
|
100 |
+
f"?select=user_id,question_id,answers"
|
101 |
+
f"&or=({user_ids_query})"
|
102 |
+
)
|
103 |
+
|
104 |
+
async with session.get(query_answers, headers=headers) as response:
|
105 |
+
if response.status != 200:
|
106 |
+
logger.warning("⚠️ Erro ao buscar respostas de usuários")
|
107 |
+
user_answers = []
|
108 |
+
else:
|
109 |
+
user_answers = await response.json()
|
110 |
+
|
111 |
+
# Busca as perguntas
|
112 |
+
query_questions = f"{SUPABASE_URL}/rest/v1/Onboarding?select=id,title"
|
113 |
+
async with session.get(query_questions, headers=headers) as response:
|
114 |
+
if response.status != 200:
|
115 |
+
logger.warning("⚠️ Erro ao buscar perguntas")
|
116 |
+
questions = []
|
117 |
+
else:
|
118 |
+
questions = await response.json()
|
119 |
+
|
120 |
+
# Mapeia perguntas por ID
|
121 |
+
question_map = {q["id"]: q["title"] for q in questions}
|
122 |
+
|
123 |
+
# Agrupa respostas por usuário
|
124 |
+
from collections import defaultdict
|
125 |
+
grouped_answers = defaultdict(list)
|
126 |
+
|
127 |
+
for answer in user_answers:
|
128 |
+
title = question_map.get(answer["question_id"], "Pergunta desconhecida")
|
129 |
+
grouped_answers[answer["user_id"]].append({
|
130 |
+
"question": title,
|
131 |
+
"answer": answer.get("answers", [])
|
132 |
+
})
|
133 |
+
|
134 |
+
# Enriquecer usuários com respostas
|
135 |
+
for user in users:
|
136 |
+
user["answers"] = grouped_answers.get(user["id"], [])
|
137 |
+
|
138 |
+
return {"users": users, "count": len(users)}
|
139 |
|
140 |
except Exception as e:
|
141 |
+
logger.error(f"❌ Erro ao buscar usuários e respostas: {str(e)}")
|
142 |
raise HTTPException(status_code=500, detail="Erro interno do servidor")
|
143 |
|
144 |
@router.get("/admin/pending-approvals")
|
|
|
147 |
):
|
148 |
"""
|
149 |
Endpoint para listar usuários que ainda não foram aprovados,
|
150 |
+
com respostas das perguntas de onboarding.
|
151 |
"""
|
152 |
try:
|
153 |
await verify_admin_token(user_token)
|