Fix: Edge Function non-2xx status code

The "Assinar Agora" button was not working, returning a non-2xx status code.
This commit is contained in:
gpt-engineer-app[bot] 2025-06-15 20:12:02 +00:00
parent de3dc3363f
commit f91efb3823
2 changed files with 41 additions and 15 deletions

View File

@ -1,3 +1,4 @@
import { Tabs, TabsList, TabsTrigger, TabsContent } from "@/components/ui/tabs";
import MeuCadastroForm from "@/components/settings/MeuCadastroForm";
import { useState } from "react";
@ -29,8 +30,18 @@ const Configuracoes = () => {
const handleSubscribe = async () => {
setIsSubscribing(true);
try {
// A edge function buscará o e-mail do usuário a partir da sessão de autenticação.
const { data, error } = await supabase.functions.invoke('mercado-pago-subscribe');
const userEmail = localStorage.getItem('userEmail');
const userId = localStorage.getItem('userId');
if (!userEmail || !userId) {
toast.error("Sessão inválida. Por favor, faça login novamente.");
setIsSubscribing(false);
return;
}
const { data, error } = await supabase.functions.invoke('mercado-pago-subscribe', {
body: { email: userEmail, userId: userId },
});
if (error) {
// Lida com erros de rede ou falhas na invocação da função.

View File

@ -14,23 +14,39 @@ serve(async (req) => {
}
try {
// Cria um cliente Supabase com o contexto de autenticação do usuário logado.
const supabaseClient = createClient(
const { email, userId } = await req.json();
if (!email || !userId) {
return new Response(JSON.stringify({ error: 'E-mail ou ID do usuário não fornecido.' }), {
headers: { ...corsHeaders, 'Content-Type': 'application/json' },
status: 400,
});
}
// Cria um cliente Supabase com a service_role_key para verificar o usuário
const supabaseAdmin = createClient(
Deno.env.get('SUPABASE_URL') ?? '',
Deno.env.get('SUPABASE_ANON_KEY') ?? '',
{ global: { headers: { Authorization: req.headers.get('Authorization')! } } }
)
Deno.env.get('SUPABASE_SERVICE_ROLE_KEY') ?? '',
{ auth: { persistSession: false } }
);
// Verifica se o usuário existe no banco de dados
const { data: userData, error: userError } = await supabaseAdmin
.from('usuarios')
.select('id')
.eq('id', userId)
.eq('email', email)
.single();
// Obtém o usuário a partir da sessão
const { data: { user } } = await supabaseClient.auth.getUser()
if (!user || !user.email) {
return new Response(JSON.stringify({ error: 'Usuário não autenticado ou e-mail não encontrado.' }), {
if (userError || !userData) {
console.error('Falha na verificação do usuário:', userError);
return new Response(JSON.stringify({ error: 'Usuário não autorizado.' }), {
headers: { ...corsHeaders, 'Content-Type': 'application/json' },
status: 401,
})
});
}
const MERCADO_PAGO_ACCESS_TOKEN = Deno.env.get('MERCADO_PAGO_ACCESS_TOKEN')
if (!MERCADO_PAGO_ACCESS_TOKEN) {
return new Response(JSON.stringify({ error: 'Chave de acesso do Mercado Pago não configurada no servidor.' }), {
@ -48,7 +64,7 @@ serve(async (req) => {
currency_id: "BRL"
},
back_url: req.headers.get("origin") || "http://localhost:5173/configuracoes",
payer_email: user.email
payer_email: email
};
const mpResponse = await fetch("https://api.mercadopago.com/preapproval", {
@ -83,4 +99,3 @@ serve(async (req) => {
})
}
})