Update routes/subscription.py
Browse files- routes/subscription.py +41 -51
routes/subscription.py
CHANGED
@@ -473,17 +473,16 @@ def cancel_subscription(data: CancelSubscriptionRequest):
|
|
473 |
except Exception as e:
|
474 |
raise HTTPException(status_code=500, detail=str(e))
|
475 |
|
476 |
-
# 🚀 Verificação de Assinatura
|
477 |
@router.post("/check_subscription")
|
478 |
def check_subscription(
|
479 |
data: CheckSubscriptionRequest,
|
480 |
-
user_token: str = Header(None, alias="User-key")
|
481 |
):
|
482 |
try:
|
483 |
if not user_token:
|
484 |
raise HTTPException(status_code=401, detail="Missing User-key header")
|
485 |
|
486 |
-
# 🔹 Validar o token
|
487 |
user_id = verify_token(user_token)
|
488 |
|
489 |
# 🔹 Buscar o stripe_id do usuário no Supabase
|
@@ -499,82 +498,73 @@ def check_subscription(
|
|
499 |
if not user_stripe_id:
|
500 |
raise HTTPException(status_code=404, detail="Stripe customer not found for user")
|
501 |
|
502 |
-
# 🔹 Buscar todas as assinaturas ativas para o
|
503 |
subscriptions = stripe.Subscription.list(
|
504 |
-
customer=user_stripe_id,
|
505 |
-
|
506 |
-
expand=["data.items"] # Expande os dados para pegar os itens e o metadata
|
507 |
)
|
508 |
|
509 |
-
# Logando a resposta do Stripe para verificar sua estrutura
|
510 |
logger.info(f"Stripe response data: {subscriptions}")
|
511 |
|
512 |
if not subscriptions or "data" not in subscriptions or not subscriptions["data"]:
|
513 |
-
return {
|
514 |
-
"status": "inactive",
|
515 |
-
"message": "No active subscription found for this stylist."
|
516 |
-
}
|
517 |
|
518 |
-
# 🔹 Verificar se existe uma assinatura ativa para o estilista
|
519 |
for subscription in subscriptions["data"]:
|
520 |
-
# Verifica se o stylist_id está presente no metadata da assinatura
|
521 |
if subscription["metadata"].get("stylist_id") == data.stylist_id:
|
522 |
-
|
523 |
-
|
524 |
-
|
525 |
-
|
526 |
-
|
|
|
|
|
|
|
527 |
nyc_tz = pytz.timezone('America/New_York')
|
528 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
529 |
|
530 |
-
# 🔹
|
531 |
subscription_data = {
|
532 |
-
"stylist_id": data.stylist_id,
|
533 |
-
"customer_id": user_id,
|
534 |
-
"active":
|
535 |
-
"
|
536 |
-
"
|
537 |
-
"
|
538 |
-
|
539 |
-
|
540 |
-
# Configuração do cabeçalho de autenticação para o Supabase
|
541 |
-
supabase_headers = {
|
542 |
-
"Authorization": f"Bearer {SUPABASE_KEY}",
|
543 |
-
"apikey": SUPABASE_KEY,
|
544 |
-
"Content-Type": "application/json"
|
545 |
}
|
546 |
|
547 |
-
# Inserir nova linha na tabela Subscriptions
|
548 |
-
subscription_url = f"{SUPABASE_URL}/rest/v1/Subscriptions"
|
549 |
response_subscription = requests.post(
|
550 |
-
|
551 |
-
headers=
|
552 |
json=subscription_data
|
553 |
)
|
554 |
|
555 |
-
# Verificando a resposta da inserção
|
556 |
if response_subscription.status_code == 201:
|
557 |
-
logger.info(f"✅ Subscription
|
558 |
else:
|
559 |
-
logger.error(f"❌ Failed to
|
560 |
|
561 |
return {
|
562 |
-
"status":
|
563 |
-
"subscription_id":
|
564 |
-
"consultations_per_month": subscription["metadata"].get("consultations_per_month", None)
|
|
|
|
|
|
|
565 |
}
|
566 |
|
567 |
-
|
568 |
-
return {
|
569 |
-
"status": "inactive",
|
570 |
-
"message": "No active subscription found for this stylist."
|
571 |
-
}
|
572 |
|
573 |
except stripe.error.StripeError as e:
|
574 |
-
# Captura erros específicos do Stripe
|
575 |
logger.error(f"Stripe error: {str(e)}")
|
576 |
raise HTTPException(status_code=500, detail=f"Stripe error: {str(e)}")
|
577 |
except Exception as e:
|
578 |
-
# Captura outros erros genéricos
|
579 |
logger.error(f"Error checking subscription: {str(e)}")
|
580 |
raise HTTPException(status_code=500, detail="Error checking subscription.")
|
|
|
473 |
except Exception as e:
|
474 |
raise HTTPException(status_code=500, detail=str(e))
|
475 |
|
|
|
476 |
@router.post("/check_subscription")
|
477 |
def check_subscription(
|
478 |
data: CheckSubscriptionRequest,
|
479 |
+
user_token: str = Header(None, alias="User-key")
|
480 |
):
|
481 |
try:
|
482 |
if not user_token:
|
483 |
raise HTTPException(status_code=401, detail="Missing User-key header")
|
484 |
|
485 |
+
# 🔹 Validar o token e obter user_id do cliente
|
486 |
user_id = verify_token(user_token)
|
487 |
|
488 |
# 🔹 Buscar o stripe_id do usuário no Supabase
|
|
|
498 |
if not user_stripe_id:
|
499 |
raise HTTPException(status_code=404, detail="Stripe customer not found for user")
|
500 |
|
501 |
+
# 🔹 Buscar todas as assinaturas ativas para o cliente
|
502 |
subscriptions = stripe.Subscription.list(
|
503 |
+
customer=user_stripe_id,
|
504 |
+
expand=["data.items"]
|
|
|
505 |
)
|
506 |
|
|
|
507 |
logger.info(f"Stripe response data: {subscriptions}")
|
508 |
|
509 |
if not subscriptions or "data" not in subscriptions or not subscriptions["data"]:
|
510 |
+
return {"status": "inactive", "message": "No active subscription found for this stylist."}
|
|
|
|
|
|
|
511 |
|
|
|
512 |
for subscription in subscriptions["data"]:
|
|
|
513 |
if subscription["metadata"].get("stylist_id") == data.stylist_id:
|
514 |
+
subscription_id = subscription["id"]
|
515 |
+
price_id = subscription["items"]["data"][0]["price"]["id"]
|
516 |
+
status = subscription.get("status")
|
517 |
+
cancel_at_period_end = subscription.get("cancel_at_period_end", False)
|
518 |
+
canceled_at = subscription.get("canceled_at")
|
519 |
+
current_period_end = subscription.get("current_period_end")
|
520 |
+
|
521 |
+
# 🔹 Converte timestamps para data legível
|
522 |
nyc_tz = pytz.timezone('America/New_York')
|
523 |
+
canceled_at_date = (
|
524 |
+
datetime.utcfromtimestamp(canceled_at).replace(tzinfo=pytz.utc).astimezone(nyc_tz).isoformat()
|
525 |
+
if canceled_at else None
|
526 |
+
)
|
527 |
+
expiration_date = (
|
528 |
+
datetime.utcfromtimestamp(current_period_end).replace(tzinfo=pytz.utc).astimezone(nyc_tz).isoformat()
|
529 |
+
if current_period_end else None
|
530 |
+
)
|
531 |
|
532 |
+
# 🔹 Atualiza o banco de dados Supabase com os dados de cancelamento
|
533 |
subscription_data = {
|
534 |
+
"stylist_id": data.stylist_id,
|
535 |
+
"customer_id": user_id,
|
536 |
+
"active": status == "active",
|
537 |
+
"sub_id": subscription_id,
|
538 |
+
"price_id": price_id,
|
539 |
+
"canceled": cancel_at_period_end or (status == "canceled"),
|
540 |
+
"canceled_date": canceled_at_date
|
|
|
|
|
|
|
|
|
|
|
|
|
541 |
}
|
542 |
|
|
|
|
|
543 |
response_subscription = requests.post(
|
544 |
+
f"{SUPABASE_URL}/rest/v1/Subscriptions",
|
545 |
+
headers=SUPABASE_HEADERS,
|
546 |
json=subscription_data
|
547 |
)
|
548 |
|
|
|
549 |
if response_subscription.status_code == 201:
|
550 |
+
logger.info(f"✅ Subscription updated successfully for user {user_id}")
|
551 |
else:
|
552 |
+
logger.error(f"❌ Failed to update subscription: {response_subscription.status_code} - {response_subscription.text}")
|
553 |
|
554 |
return {
|
555 |
+
"status": status,
|
556 |
+
"subscription_id": subscription_id,
|
557 |
+
"consultations_per_month": subscription["metadata"].get("consultations_per_month", None),
|
558 |
+
"cancel_at_period_end": cancel_at_period_end,
|
559 |
+
"canceled_at": canceled_at_date,
|
560 |
+
"expiration_date": expiration_date
|
561 |
}
|
562 |
|
563 |
+
return {"status": "inactive", "message": "No active subscription found for this stylist."}
|
|
|
|
|
|
|
|
|
564 |
|
565 |
except stripe.error.StripeError as e:
|
|
|
566 |
logger.error(f"Stripe error: {str(e)}")
|
567 |
raise HTTPException(status_code=500, detail=f"Stripe error: {str(e)}")
|
568 |
except Exception as e:
|
|
|
569 |
logger.error(f"Error checking subscription: {str(e)}")
|
570 |
raise HTTPException(status_code=500, detail="Error checking subscription.")
|