habulaj commited on
Commit
f2f36ae
·
verified ·
1 Parent(s): a65980c

Update routes/users.py

Browse files
Files changed (1) hide show
  1. routes/users.py +63 -4
routes/users.py CHANGED
@@ -1,7 +1,9 @@
1
  import os
 
2
  import logging
3
  import asyncio
4
  import aiohttp
 
5
  from pydantic import BaseModel
6
  from fastapi import APIRouter, HTTPException, Header, Query
7
  from functools import lru_cache
@@ -9,13 +11,17 @@ from typing import List, Dict, Any, Optional
9
 
10
  router = APIRouter()
11
 
 
 
 
 
12
  # Configuração do Supabase
13
  SUPABASE_URL = "https://ussxqnifefkgkaumjann.supabase.co"
14
  SUPABASE_KEY = os.getenv("SUPA_KEY")
15
  SUPABASE_ROLE_KEY = os.getenv("SUPA_SERVICE_KEY")
16
-
17
- if not SUPABASE_KEY or not SUPABASE_ROLE_KEY:
18
- raise ValueError("❌ SUPA_KEY ou SUPA_SERVICE_KEY não foram definidos no ambiente!")
19
 
20
  SUPABASE_HEADERS = {
21
  "apikey": SUPABASE_KEY,
@@ -195,4 +201,57 @@ async def get_recent_users_endpoint(
195
 
196
  except Exception as e:
197
  logger.error(f"❌ Erro ao obter usuários: {str(e)}")
198
- raise HTTPException(status_code=500, detail=str(e))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import os
2
+ import stripe
3
  import logging
4
  import asyncio
5
  import aiohttp
6
+ from datetime import datetime
7
  from pydantic import BaseModel
8
  from fastapi import APIRouter, HTTPException, Header, Query
9
  from functools import lru_cache
 
11
 
12
  router = APIRouter()
13
 
14
+ # 🔥 Pegando as chaves do ambiente
15
+ stripe.api_key = os.getenv("STRIPE_KEY") # Lendo do ambiente
16
+ stripe.api_version = "2023-10-16"
17
+
18
  # Configuração do Supabase
19
  SUPABASE_URL = "https://ussxqnifefkgkaumjann.supabase.co"
20
  SUPABASE_KEY = os.getenv("SUPA_KEY")
21
  SUPABASE_ROLE_KEY = os.getenv("SUPA_SERVICE_KEY")
22
+
23
+ if not stripe.api_key or not SUPABASE_KEY or not SUPABASE_ROLE_KEY:
24
+ raise ValueError("❌ STRIPE_KEY, SUPA_KEY ou SUPA_SERVICE_KEY não foram definidos no ambiente!")
25
 
26
  SUPABASE_HEADERS = {
27
  "apikey": SUPABASE_KEY,
 
201
 
202
  except Exception as e:
203
  logger.error(f"❌ Erro ao obter usuários: {str(e)}")
204
+ raise HTTPException(status_code=500, detail=str(e))
205
+
206
+ @router.get("/admin/user-transfers")
207
+ async def get_user_transfer_history(
208
+ user_token: str = Header(None, alias="User-key"),
209
+ user_id: str = Query(..., description="ID do usuário no Supabase")
210
+ ):
211
+ """
212
+ Retorna o histórico de transferências ou pagamentos associados ao Stripe ID do usuário.
213
+ Apenas para administradores ou usuários com permissão 'view_users'.
214
+ """
215
+ try:
216
+ # Verifica se o token tem permissão
217
+ await verify_token_with_permissions(user_token, "view_users")
218
+
219
+ # Buscar stripe_id do usuário
220
+ user_url = f"{SUPABASE_URL}/rest/v1/User?id=eq.{user_id}&select=stripe_id"
221
+ async with aiohttp.ClientSession() as session:
222
+ async with session.get(user_url, headers=SUPABASE_HEADERS) as response:
223
+ if response.status != 200:
224
+ raise HTTPException(status_code=404, detail="Usuário não encontrado")
225
+ data = await response.json()
226
+ if not data or not data[0].get("stripe_id"):
227
+ raise HTTPException(status_code=404, detail="Stripe ID não encontrado para o usuário")
228
+ stripe_id = data[0]["stripe_id"]
229
+
230
+ # Buscar pagamentos no Stripe associados ao customer
231
+ charges = stripe.Charge.list(customer=stripe_id, limit=100)
232
+
233
+ formatted = []
234
+ for charge in charges.auto_paging_iter():
235
+ formatted.append({
236
+ "id": charge["id"],
237
+ "amount": charge["amount"] / 100, # Stripe trabalha em centavos
238
+ "currency": charge["currency"].upper(),
239
+ "status": charge["status"],
240
+ "created_at": datetime.fromtimestamp(charge["created"]).isoformat(),
241
+ "description": charge.get("description"),
242
+ "payment_method": charge.get("payment_method_details", {}).get("type"),
243
+ "receipt_url": charge.get("receipt_url"),
244
+ })
245
+
246
+ return {
247
+ "stripe_id": stripe_id,
248
+ "transfers": formatted,
249
+ "count": len(formatted)
250
+ }
251
+
252
+ except HTTPException as he:
253
+ raise he
254
+
255
+ except Exception as e:
256
+ logger.error(f"❌ Erro ao obter transferências: {str(e)}")
257
+ raise HTTPException(status_code=500, detail="Erro interno ao consultar o histórico de transferências.")