Update routes/subscription.py
Browse files- routes/subscription.py +39 -7
routes/subscription.py
CHANGED
@@ -476,12 +476,14 @@ def cancel_subscription(data: CancelSubscriptionRequest):
|
|
476 |
|
477 |
@router.post("/check_subscription")
|
478 |
async def check_subscription(
|
479 |
-
data: CheckSubscriptionRequest
|
480 |
):
|
481 |
try:
|
|
|
|
|
482 |
# 🔹 Buscar o stripe_id do usuário no Supabase
|
483 |
response_user = await async_request(
|
484 |
-
f"{SUPABASE_URL}/rest/v1/User?id=eq.{
|
485 |
SUPABASE_HEADERS
|
486 |
)
|
487 |
user_data = response_user.json()
|
@@ -503,11 +505,11 @@ async def check_subscription(
|
|
503 |
|
504 |
if not subscriptions or not subscriptions["data"]:
|
505 |
# Se não houver assinaturas para o cliente, desativa as assinaturas associadas ao estilista no banco de dados
|
506 |
-
logger.info(f"No active subscription found for user {
|
507 |
|
508 |
# 🔹 Buscar todas as assinaturas do estilista no banco de dados para este cliente
|
509 |
response_subscriptions = await async_request(
|
510 |
-
f"{SUPABASE_URL}/rest/v1/Subscriptions?customer_id=eq.{
|
511 |
SUPABASE_HEADERS
|
512 |
)
|
513 |
if response_subscriptions.status_code == 200:
|
@@ -516,7 +518,7 @@ async def check_subscription(
|
|
516 |
*(update_subscription_status(sub['id'], False) for sub in subscriptions_data)
|
517 |
)
|
518 |
else:
|
519 |
-
logger.error(f"❌ Failed to fetch subscriptions from Supabase for stylist {data.stylist_id} and user {
|
520 |
|
521 |
return {"status": "inactive", "message": "No active subscription found for stylist."}
|
522 |
|
@@ -546,7 +548,7 @@ async def check_subscription(
|
|
546 |
# 🔹 Atualiza o banco de dados Supabase com os dados da assinatura
|
547 |
subscription_data = {
|
548 |
"stylist_id": data.stylist_id,
|
549 |
-
"customer_id":
|
550 |
"active": status == "active",
|
551 |
"sub_id": subscription_id,
|
552 |
"price_id": price_id,
|
@@ -595,4 +597,34 @@ async def check_subscription(
|
|
595 |
raise HTTPException(status_code=500, detail=f"Stripe error: {str(e)}")
|
596 |
except Exception as e:
|
597 |
logger.error(f"Error checking subscription: {str(e)}")
|
598 |
-
raise HTTPException(status_code=500, detail="Error checking subscription.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
476 |
|
477 |
@router.post("/check_subscription")
|
478 |
async def check_subscription(
|
479 |
+
data: CheckSubscriptionRequest # Agora recebemos user_id diretamente do corpo
|
480 |
):
|
481 |
try:
|
482 |
+
user_id = data.user_id # Não precisamos mais verificar o token, pois user_id vem na requisição
|
483 |
+
|
484 |
# 🔹 Buscar o stripe_id do usuário no Supabase
|
485 |
response_user = await async_request(
|
486 |
+
f"{SUPABASE_URL}/rest/v1/User?id=eq.{user_id}",
|
487 |
SUPABASE_HEADERS
|
488 |
)
|
489 |
user_data = response_user.json()
|
|
|
505 |
|
506 |
if not subscriptions or not subscriptions["data"]:
|
507 |
# Se não houver assinaturas para o cliente, desativa as assinaturas associadas ao estilista no banco de dados
|
508 |
+
logger.info(f"No active subscription found for user {user_id}. Deactivating all subscriptions for stylist {data.stylist_id}.")
|
509 |
|
510 |
# 🔹 Buscar todas as assinaturas do estilista no banco de dados para este cliente
|
511 |
response_subscriptions = await async_request(
|
512 |
+
f"{SUPABASE_URL}/rest/v1/Subscriptions?customer_id=eq.{user_id}&stylist_id=eq.{data.stylist_id}",
|
513 |
SUPABASE_HEADERS
|
514 |
)
|
515 |
if response_subscriptions.status_code == 200:
|
|
|
518 |
*(update_subscription_status(sub['id'], False) for sub in subscriptions_data)
|
519 |
)
|
520 |
else:
|
521 |
+
logger.error(f"❌ Failed to fetch subscriptions from Supabase for stylist {data.stylist_id} and user {user_id}.")
|
522 |
|
523 |
return {"status": "inactive", "message": "No active subscription found for stylist."}
|
524 |
|
|
|
548 |
# 🔹 Atualiza o banco de dados Supabase com os dados da assinatura
|
549 |
subscription_data = {
|
550 |
"stylist_id": data.stylist_id,
|
551 |
+
"customer_id": user_id,
|
552 |
"active": status == "active",
|
553 |
"sub_id": subscription_id,
|
554 |
"price_id": price_id,
|
|
|
597 |
raise HTTPException(status_code=500, detail=f"Stripe error: {str(e)}")
|
598 |
except Exception as e:
|
599 |
logger.error(f"Error checking subscription: {str(e)}")
|
600 |
+
raise HTTPException(status_code=500, detail="Error checking subscription.")
|
601 |
+
|
602 |
+
|
603 |
+
# Função assíncrona para fazer requisições de rede
|
604 |
+
async def async_request(url, headers, json=None, method='GET'):
|
605 |
+
method_func = requests.post if method == 'POST' else requests.get
|
606 |
+
response = method_func(url, headers=headers, json=json)
|
607 |
+
return response
|
608 |
+
|
609 |
+
# Função assíncrona para chamar a Stripe API
|
610 |
+
async def async_stripe_request(func, **kwargs):
|
611 |
+
loop = asyncio.get_event_loop()
|
612 |
+
response = await loop.run_in_executor(None, lambda: func(**kwargs))
|
613 |
+
return response
|
614 |
+
|
615 |
+
# Função assíncrona para atualizar o status de uma assinatura
|
616 |
+
async def update_subscription_status(subscription_id, status):
|
617 |
+
update_data = {
|
618 |
+
"active": status
|
619 |
+
}
|
620 |
+
subscription_url = f"{SUPABASE_URL}/rest/v1/Subscriptions?id=eq.{subscription_id}"
|
621 |
+
update_response = await async_request(
|
622 |
+
subscription_url,
|
623 |
+
SUPABASE_HEADERS,
|
624 |
+
json=update_data,
|
625 |
+
method='PATCH'
|
626 |
+
)
|
627 |
+
if update_response.status_code == 200:
|
628 |
+
logger.info(f"✅ Subscription {subscription_id} deactivated successfully.")
|
629 |
+
else:
|
630 |
+
logger.error(f"❌ Failed to deactivate subscription {subscription_id}.")
|