habulaj commited on
Commit
3cbd47c
·
verified ·
1 Parent(s): 03be51c

Update routes/subscription.py

Browse files
Files changed (1) hide show
  1. 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") # Recebendo o token do cabeçalho
481
  ):
482
  try:
483
  if not user_token:
484
  raise HTTPException(status_code=401, detail="Missing User-key header")
485
 
486
- # 🔹 Validar o token do cliente e obter user_id (cliente)
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 usuário (cliente) com stripe_id
503
  subscriptions = stripe.Subscription.list(
504
- customer=user_stripe_id, # Usando stripe_id do cliente para buscar assinaturas
505
- status="active", # Assinaturas ativas
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
- # Se encontrou a assinatura ativa, vamos registrar a assinatura no Supabase
523
- subscription_id = subscription["id"] # ID da assinatura
524
- price_id = subscription["items"]["data"][0]["price"]["id"] # ID do preço da assinatura
525
-
526
- # 🔹 Definir o fuso horário de Nova York usando pytz
 
 
 
527
  nyc_tz = pytz.timezone('America/New_York')
528
- created_at = datetime.now().astimezone(nyc_tz) # Hora atual de Nova York
 
 
 
 
 
 
 
529
 
530
- # 🔹 Inserir dados na tabela Subscriptions no Supabase
531
  subscription_data = {
532
- "stylist_id": data.stylist_id, # ID do estilista
533
- "customer_id": user_id, # ID do cliente
534
- "active": True, # Assinatura ativa
535
- "created_at": created_at.isoformat(), # Hora atual em formato ISO 8601
536
- "sub_id": subscription_id, # ID da assinatura
537
- "price_id": price_id # ID do preço
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
- subscription_url,
551
- headers=supabase_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 added successfully for user {user_id}")
558
  else:
559
- logger.error(f"❌ Failed to add subscription: {response_subscription.status_code} - {response_subscription.text}")
560
 
561
  return {
562
- "status": "active",
563
- "subscription_id": subscription["id"],
564
- "consultations_per_month": subscription["metadata"].get("consultations_per_month", None)
 
 
 
565
  }
566
 
567
- # Caso não tenha encontrado assinatura ativa para o estilista
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.")