feature/patiente-medical-assignment #45
@ -1,182 +0,0 @@
|
||||
# 🚨 ERRO CRÍTICO NA EDGE FUNCTION - BACKEND
|
||||
|
||||
## Resumo do Problema
|
||||
|
||||
A Edge Function `/functions/v1/create-user` está retornando **erro 500** com mensagem:
|
||||
```json
|
||||
{ "error": "Failed to assign user role" }
|
||||
```
|
||||
|
||||
## Evidências
|
||||
|
||||
### Console do Frontend
|
||||
```
|
||||
XHRPOST https://yuanqfswhberkoevtmfr.supabase.co/functions/v1/create-user
|
||||
[HTTP/3 500 1065ms]
|
||||
|
||||
[API ERROR] https://yuanqfswhberkoevtmfr.supabase.co/functions/v1/create-user 500
|
||||
Object { error: "Failed to assign user role" }
|
||||
```
|
||||
|
||||
### Request Enviado (CORRETO)
|
||||
```json
|
||||
{
|
||||
"email": "dipar64745@fanlvr.com",
|
||||
"password": "senha789!",
|
||||
"full_name": "Jonas Francisco Nascimento Bonfim",
|
||||
"phone": "(79) 99649-8907",
|
||||
"role": "medico"
|
||||
}
|
||||
```
|
||||
|
||||
### Response Recebido (ERRO)
|
||||
```json
|
||||
{
|
||||
"error": "Failed to assign user role"
|
||||
}
|
||||
```
|
||||
|
||||
## Fluxo Atual (Correto segundo documentação)
|
||||
|
||||
1. ✅ Frontend cria perfil na tabela `doctors`
|
||||
2. ✅ Frontend gera senha aleatória
|
||||
3. ✅ Frontend chama `/functions/v1/create-user` com dados corretos
|
||||
4. ❌ **Edge Function falha ao atribuir role na tabela `user_roles`**
|
||||
|
||||
## O Que a Edge Function DEVE Fazer
|
||||
|
||||
Segundo a documentação da API (`Documentação API.md`), a Edge Function `/functions/v1/create-user` deve:
|
||||
|
||||
1. ✅ Criar usuário no Supabase Auth (isso está funcionando)
|
||||
2. ❌ **Inserir registro na tabela `user_roles`** (isso está falhando)
|
||||
3. ✅ Retornar `{ success: true, user: {...} }`
|
||||
|
||||
## Possíveis Causas do Erro
|
||||
|
||||
### 1. SUPABASE_SERVICE_ROLE_KEY não configurada
|
||||
A Edge Function precisa da `SUPABASE_SERVICE_ROLE_KEY` para ter permissão de:
|
||||
- Inserir na tabela `user_roles`
|
||||
- Fazer operações administrativas
|
||||
|
||||
**Como verificar:**
|
||||
1. Acesse o Supabase Dashboard
|
||||
2. Vá em **Edge Functions** > `create-user`
|
||||
3. Verifique se a variável de ambiente `SUPABASE_SERVICE_ROLE_KEY` está configurada
|
||||
4. Copie a chave de: **Settings** > **API** > **service_role key (secret)**
|
||||
|
||||
### 2. Tabela `user_roles` sem permissões corretas
|
||||
A tabela pode estar bloqueando inserções da Edge Function.
|
||||
|
||||
**Como verificar:**
|
||||
1. Acesse o Supabase Dashboard
|
||||
2. Vá em **Database** > **user_roles**
|
||||
3. Clique em **RLS Policies**
|
||||
4. Verifique se existe uma policy permitindo:
|
||||
- Service role pode inserir
|
||||
- OU Edge Function pode inserir usando service key
|
||||
|
||||
**Policy esperada:**
|
||||
```sql
|
||||
-- Permitir que service role insira roles
|
||||
CREATE POLICY "service_role_insert_user_roles"
|
||||
ON user_roles FOR INSERT
|
||||
TO service_role
|
||||
WITH CHECK (true);
|
||||
```
|
||||
|
||||
### 3. Código da Edge Function com bug
|
||||
O código da Edge Function pode ter erro de lógica ao tentar inserir na tabela.
|
||||
|
||||
**Onde encontrar:**
|
||||
- Supabase Dashboard > **Edge Functions** > `create-user` > **Editor**
|
||||
|
||||
**O que verificar:**
|
||||
```typescript
|
||||
// A Edge Function deve ter algo assim:
|
||||
const { data, error } = await supabaseAdmin
|
||||
.from('user_roles')
|
||||
.insert({
|
||||
user_id: newUser.id,
|
||||
role: role
|
||||
});
|
||||
|
||||
if (error) {
|
||||
console.error('Erro ao inserir role:', error);
|
||||
return new Response(
|
||||
JSON.stringify({ error: 'Failed to assign user role' }),
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
```
|
||||
|
||||
## Como Testar Cada Possibilidade
|
||||
|
||||
### Teste 1: Verificar se service key está funcionando
|
||||
Execute no SQL Editor do Supabase:
|
||||
```sql
|
||||
-- Teste de inserção manual
|
||||
INSERT INTO user_roles (user_id, role)
|
||||
VALUES ('00000000-0000-0000-0000-000000000000', 'medico');
|
||||
|
||||
-- Se der erro, mostrará a mensagem de permissão
|
||||
```
|
||||
|
||||
### Teste 2: Verificar logs da Edge Function
|
||||
1. Acesse **Edge Functions** > `create-user`
|
||||
2. Clique em **Logs**
|
||||
3. Procure por erros detalhados quando o frontend faz a chamada
|
||||
|
||||
### Teste 3: Verificar estrutura da tabela
|
||||
```sql
|
||||
-- Verificar estrutura da tabela user_roles
|
||||
SELECT column_name, data_type, is_nullable
|
||||
FROM information_schema.columns
|
||||
WHERE table_name = 'user_roles';
|
||||
```
|
||||
|
||||
Campos esperados:
|
||||
- `id` (uuid, primary key)
|
||||
- `user_id` (uuid, not null, foreign key para auth.users)
|
||||
- `role` (text ou enum, not null)
|
||||
- `created_at` (timestamp, default now())
|
||||
|
||||
## Solução Esperada do Backend
|
||||
|
||||
A equipe de backend precisa:
|
||||
|
||||
1. **URGENTE**: Configurar `SUPABASE_SERVICE_ROLE_KEY` na Edge Function
|
||||
2. **URGENTE**: Adicionar RLS policy para permitir inserções via service role
|
||||
3. **Recomendado**: Adicionar logs detalhados na Edge Function para debug
|
||||
4. **Recomendado**: Retornar erro mais específico (ex: "Permission denied to insert into user_roles")
|
||||
|
||||
## Status do Frontend
|
||||
|
||||
✅ **O código do frontend está 100% correto e seguindo a documentação!**
|
||||
|
||||
Não há nada a fazer no frontend. O erro está exclusivamente no backend.
|
||||
|
||||
## Workaround Temporário (NÃO RECOMENDADO)
|
||||
|
||||
Se o backend não puder resolver urgentemente, podemos:
|
||||
1. Criar usuários sem role (ou role padrão)
|
||||
2. Administrador atribui roles manualmente depois
|
||||
|
||||
Mas isso **NÃO É RECOMENDADO** porque:
|
||||
- Usuários não terão permissões corretas
|
||||
- Aumenta trabalho manual
|
||||
- Pode gerar problemas de segurança
|
||||
|
||||
## Contato
|
||||
|
||||
Frontend: ✅ Implementação completa e correta
|
||||
Backend: ❌ Precisa corrigir Edge Function `create-user`
|
||||
|
||||
**Prioridade:** 🔴 CRÍTICA - Sistema não consegue criar novos usuários
|
||||
|
||||
---
|
||||
|
||||
**Data do erro:** 10/10/2025
|
||||
**Ambiente:** https://yuanqfswhberkoevtmfr.supabase.co
|
||||
**Edge Function:** `/functions/v1/create-user`
|
||||
**Status Code:** 500
|
||||
**Mensagem:** "Failed to assign user role"
|
||||
@ -273,10 +273,10 @@ export function PatientRegistrationForm({
|
||||
// --- NOVA LÓGICA DE CRIAÇÃO ---
|
||||
const patientPayload = toPayload();
|
||||
const savedPatientProfile = await criarPaciente(patientPayload);
|
||||
console.log("✅ Perfil do paciente criado:", savedPatientProfile);
|
||||
console.log(" Perfil do paciente criado:", savedPatientProfile);
|
||||
|
||||
if (form.email && form.email.includes('@')) {
|
||||
console.log("🔐 Criando usuário de autenticação (paciente)...");
|
||||
console.log(" Criando usuário de autenticação (paciente)...");
|
||||
try {
|
||||
const userResponse = await criarUsuarioPaciente({
|
||||
email: form.email,
|
||||
@ -285,7 +285,7 @@ export function PatientRegistrationForm({
|
||||
});
|
||||
|
||||
if (userResponse.success && userResponse.user) {
|
||||
console.log("✅ Usuário de autenticação criado:", userResponse.user);
|
||||
console.log(" Usuário de autenticação criado:", userResponse.user);
|
||||
|
||||
// Mostra credenciais no dialog usando as credenciais retornadas
|
||||
setCredentials({
|
||||
@ -306,7 +306,7 @@ export function PatientRegistrationForm({
|
||||
throw new Error((userResponse as any).message || "Falhou ao criar o usuário de acesso.");
|
||||
}
|
||||
} catch (userError: any) {
|
||||
console.error("❌ Erro ao criar usuário via signup:", userError);
|
||||
console.error(" Erro ao criar usuário via signup:", userError);
|
||||
|
||||
// Mensagem de erro específica para email duplicado
|
||||
const errorMsg = userError?.message || String(userError);
|
||||
@ -315,14 +315,14 @@ export function PatientRegistrationForm({
|
||||
errorMsg.toLowerCase().includes('já está cadastrado') ||
|
||||
errorMsg.toLowerCase().includes('já existe')) {
|
||||
alert(
|
||||
`⚠️ Este email já está cadastrado no sistema.\n\n` +
|
||||
`✅ O perfil do paciente foi salvo com sucesso.\n\n` +
|
||||
` Este email já está cadastrado no sistema.\n\n` +
|
||||
` O perfil do paciente foi salvo com sucesso.\n\n` +
|
||||
`Para criar acesso ao sistema, use um email diferente ou recupere a senha do email existente.`
|
||||
);
|
||||
} else {
|
||||
alert(
|
||||
`✅ Paciente cadastrado com sucesso!\n\n` +
|
||||
`⚠️ Porém houve um problema ao criar o acesso:\n${errorMsg}\n\n` +
|
||||
` Paciente cadastrado com sucesso!\n\n` +
|
||||
` Porém houve um problema ao criar o acesso:\n${errorMsg}\n\n` +
|
||||
`O cadastro do paciente foi salvo, mas será necessário criar o acesso manualmente.`
|
||||
);
|
||||
}
|
||||
|
||||
@ -523,8 +523,8 @@ export async function buscarMedicoPorId(id: string | number): Promise<Medico> {
|
||||
const res = await fetch(url, { method: "GET", headers: baseHeaders() });
|
||||
const arr = await parse<Medico[]>(res);
|
||||
if (arr && arr.length > 0) {
|
||||
console.log('✅ Médico encontrado no Supabase:', arr[0]);
|
||||
console.log('🔍 Campo especialidade no médico:', {
|
||||
console.log('Médico encontrado no Supabase:', arr[0]);
|
||||
console.log('Campo especialidade no médico:', {
|
||||
especialidade: arr[0].especialidade,
|
||||
specialty: (arr[0] as any).specialty,
|
||||
hasEspecialidade: !!arr[0].especialidade,
|
||||
@ -533,7 +533,7 @@ export async function buscarMedicoPorId(id: string | number): Promise<Medico> {
|
||||
return arr[0];
|
||||
}
|
||||
} catch (error) {
|
||||
console.warn('⚠️ Erro ao buscar no Supabase, tentando mock API:', error);
|
||||
console.warn('Erro ao buscar no Supabase, tentando mock API:', error);
|
||||
}
|
||||
|
||||
// Se não encontrar no Supabase, tenta o mock API
|
||||
@ -554,10 +554,10 @@ export async function buscarMedicoPorId(id: string | number): Promise<Medico> {
|
||||
}
|
||||
|
||||
const medico = await res.json();
|
||||
console.log('✅ Médico encontrado no Mock API:', medico);
|
||||
console.log('Médico encontrado no Mock API:', medico);
|
||||
return medico as Medico;
|
||||
} catch (error) {
|
||||
console.error('❌ Erro ao buscar médico em ambas as APIs:', error);
|
||||
console.error('Erro ao buscar médico em ambas as APIs:', error);
|
||||
throw new Error("404: Médico não encontrado");
|
||||
}
|
||||
}
|
||||
@ -581,8 +581,8 @@ export async function criarMedico(input: MedicoInput): Promise<Medico> {
|
||||
|
||||
|
||||
export async function atualizarMedico(id: string | number, input: MedicoInput): Promise<Medico> {
|
||||
console.log(`🔄 Tentando atualizar médico ID: ${id}`);
|
||||
console.log(`📤 Payload original:`, input);
|
||||
console.log(`Tentando atualizar médico ID: ${id}`);
|
||||
console.log(`Payload original:`, input);
|
||||
|
||||
// Criar um payload limpo apenas com campos básicos que sabemos que existem
|
||||
const cleanPayload = {
|
||||
@ -600,12 +600,12 @@ export async function atualizarMedico(id: string | number, input: MedicoInput):
|
||||
active: input.active ?? true
|
||||
};
|
||||
|
||||
console.log(`📤 Payload limpo:`, cleanPayload);
|
||||
console.log(`Payload limpo:`, cleanPayload);
|
||||
|
||||
// Atualizar apenas no Supabase (dados reais)
|
||||
try {
|
||||
const url = `${REST}/doctors?id=eq.${id}`;
|
||||
console.log(`🌐 URL de atualização: ${url}`);
|
||||
console.log(`URL de atualização: ${url}`);
|
||||
|
||||
const res = await fetch(url, {
|
||||
method: "PATCH",
|
||||
@ -613,17 +613,17 @@ export async function atualizarMedico(id: string | number, input: MedicoInput):
|
||||
body: JSON.stringify(cleanPayload),
|
||||
});
|
||||
|
||||
console.log(`📡 Resposta do servidor: ${res.status} ${res.statusText}`);
|
||||
console.log(`Resposta do servidor: ${res.status} ${res.statusText}`);
|
||||
|
||||
if (res.ok) {
|
||||
const arr = await parse<Medico[] | Medico>(res);
|
||||
const result = Array.isArray(arr) ? arr[0] : (arr as Medico);
|
||||
console.log('✅ Médico atualizado no Supabase:', result);
|
||||
console.log('Médico atualizado no Supabase:', result);
|
||||
return result;
|
||||
} else {
|
||||
// Vamos tentar ver o erro detalhado
|
||||
const errorText = await res.text();
|
||||
console.error(`❌ Erro detalhado do Supabase:`, {
|
||||
console.error(`Erro detalhado do Supabase:`, {
|
||||
status: res.status,
|
||||
statusText: res.statusText,
|
||||
response: errorText,
|
||||
@ -632,7 +632,7 @@ export async function atualizarMedico(id: string | number, input: MedicoInput):
|
||||
throw new Error(`Supabase error: ${res.status} ${res.statusText} - ${errorText}`);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('❌ Erro ao atualizar médico:', error);
|
||||
console.error('Erro ao atualizar médico:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
@ -682,20 +682,6 @@ export async function listarPatientAssignments(params?: { page?: number; limit?:
|
||||
return await parse<PatientAssignment[]>(res);
|
||||
}
|
||||
|
||||
// NOTE: role assignments MUST be done server-side with service role credentials.
|
||||
// The client should NOT attempt to POST to /rest/v1/user_roles because this
|
||||
// endpoint typically requires elevated permissions (service role) and is not
|
||||
// exposed in the public OpenAPI for client usage. Any role assignment must be
|
||||
// implemented in an authenticated server function (Edge Function) and called
|
||||
// from the backend. Keeping a client-side POST here caused confusion with the
|
||||
// API documentation which only lists GET for `/rest/v1/user_roles`.
|
||||
|
||||
// If you need to retry role assignment from the frontend, call your backend
|
||||
// service (e.g. an Edge Function) that performs the assignment using the
|
||||
// service role key. Do not add client-side POSTs to `user_roles`.
|
||||
|
||||
// Nota: o endpoint POST /rest/v1/patient_assignments não existe na documentação fornecida.
|
||||
// Se for necessário criar assignments, isso deve ser feito via função server-side segura.
|
||||
|
||||
export type User = {
|
||||
id: string;
|
||||
@ -816,7 +802,7 @@ export async function criarUsuarioDirectAuth(input: {
|
||||
role: UserRoleEnum;
|
||||
userType?: 'profissional' | 'paciente';
|
||||
}): Promise<CreateUserWithPasswordResponse> {
|
||||
console.log('🔐 [DIRECT AUTH] Criando usuário diretamente via Supabase Auth...');
|
||||
console.log('[DIRECT AUTH] Criando usuário diretamente via Supabase Auth...');
|
||||
|
||||
const signupUrl = `${API_BASE}/auth/v1/signup`;
|
||||
|
||||
@ -856,7 +842,7 @@ export async function criarUsuarioDirectAuth(input: {
|
||||
const responseData = await response.json();
|
||||
const userId = responseData.user?.id || responseData.id;
|
||||
|
||||
console.log('✅ [DIRECT AUTH] Usuário criado:', userId);
|
||||
console.log('[DIRECT AUTH] Usuário criado:', userId);
|
||||
|
||||
// NOTE: Role assignments MUST be done by the backend (Edge Function or server)
|
||||
// when creating the user. The frontend should NOT attempt to assign roles.
|
||||
@ -876,7 +862,7 @@ export async function criarUsuarioDirectAuth(input: {
|
||||
};
|
||||
|
||||
} catch (error: any) {
|
||||
console.error('❌ [DIRECT AUTH] Erro ao criar usuário:', error);
|
||||
console.error('[DIRECT AUTH] Erro ao criar usuário:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
@ -895,11 +881,11 @@ export async function criarUsuarioMedico(medico: {
|
||||
|
||||
const senha = gerarSenhaAleatoria();
|
||||
|
||||
console.log('🏥 [CRIAR MÉDICO] Iniciando criação no Supabase Auth...');
|
||||
console.log('📧 Email:', medico.email);
|
||||
console.log('👤 Nome:', medico.full_name);
|
||||
console.log('📱 Telefone:', medico.phone_mobile);
|
||||
console.log('🔑 Senha gerada:', senha);
|
||||
console.log('[CRIAR MÉDICO] Iniciando criação no Supabase Auth...');
|
||||
console.log('Email:', medico.email);
|
||||
console.log('Nome:', medico.full_name);
|
||||
console.log('Telefone:', medico.phone_mobile);
|
||||
console.log('Senha gerada:', senha);
|
||||
|
||||
// Endpoint do Supabase Auth (mesmo que auth.ts usa)
|
||||
const signupUrl = `${ENV_CONFIG.SUPABASE_URL}/auth/v1/signup`;
|
||||
@ -914,7 +900,7 @@ export async function criarUsuarioMedico(medico: {
|
||||
}
|
||||
};
|
||||
|
||||
console.log('📤 [CRIAR MÉDICO] Enviando para:', signupUrl);
|
||||
console.log('[CRIAR MÉDICO] Enviando para:', signupUrl);
|
||||
|
||||
try {
|
||||
const response = await fetch(signupUrl, {
|
||||
@ -927,11 +913,11 @@ export async function criarUsuarioMedico(medico: {
|
||||
body: JSON.stringify(payload),
|
||||
});
|
||||
|
||||
console.log('📋 [CRIAR MÉDICO] Status da resposta:', response.status, response.statusText);
|
||||
console.log('[CRIAR MÉDICO] Status da resposta:', response.status, response.statusText);
|
||||
|
||||
if (!response.ok) {
|
||||
const errorText = await response.text();
|
||||
console.error('❌ [CRIAR MÉDICO] Erro na resposta:', errorText);
|
||||
console.error('[CRIAR MÉDICO] Erro na resposta:', errorText);
|
||||
|
||||
// Tenta parsear o erro para pegar mensagem específica
|
||||
let errorMsg = `Erro ao criar usuário (${response.status})`;
|
||||
@ -955,17 +941,17 @@ export async function criarUsuarioMedico(medico: {
|
||||
}
|
||||
|
||||
const responseData = await response.json();
|
||||
console.log('✅ [CRIAR MÉDICO] Usuário criado com sucesso no Supabase Auth!');
|
||||
console.log('🆔 User ID:', responseData.user?.id || responseData.id);
|
||||
console.log('[CRIAR MÉDICO] Usuário criado com sucesso no Supabase Auth!');
|
||||
console.log('User ID:', responseData.user?.id || responseData.id);
|
||||
|
||||
// 🔧 AUTO-CONFIRMAR EMAIL: Fazer login automático logo após criar usuário
|
||||
// Isso força o Supabase a confirmar o email automaticamente
|
||||
if (responseData.user?.email_confirmed_at === null || !responseData.user?.email_confirmed_at) {
|
||||
console.warn('⚠️ [CRIAR MÉDICO] Email NÃO confirmado - tentando auto-confirmar via login...');
|
||||
console.warn('[CRIAR MÉDICO] Email NÃO confirmado - tentando auto-confirmar via login...');
|
||||
|
||||
try {
|
||||
const loginUrl = `${ENV_CONFIG.SUPABASE_URL}/auth/v1/token?grant_type=password`;
|
||||
console.log('🔧 [AUTO-CONFIRMAR] Fazendo login automático para confirmar email...');
|
||||
console.log('[AUTO-CONFIRMAR] Fazendo login automático para confirmar email...');
|
||||
|
||||
const loginResponse = await fetch(loginUrl, {
|
||||
method: 'POST',
|
||||
@ -981,8 +967,8 @@ export async function criarUsuarioMedico(medico: {
|
||||
|
||||
if (loginResponse.ok) {
|
||||
const loginData = await loginResponse.json();
|
||||
console.log('✅ [AUTO-CONFIRMAR] Login automático realizado com sucesso!');
|
||||
console.log('📦 [AUTO-CONFIRMAR] Email confirmado:', loginData.user?.email_confirmed_at ? 'SIM ✅' : 'NÃO ❌');
|
||||
console.log('[AUTO-CONFIRMAR] Login automático realizado com sucesso!');
|
||||
console.log('[AUTO-CONFIRMAR] Email confirmado:', loginData.user?.email_confirmed_at ? 'SIM' : 'NÃO');
|
||||
|
||||
// Atualizar responseData com dados do login (que tem email confirmado)
|
||||
if (loginData.user) {
|
||||
@ -990,24 +976,24 @@ export async function criarUsuarioMedico(medico: {
|
||||
}
|
||||
} else {
|
||||
const errorText = await loginResponse.text();
|
||||
console.error('❌ [AUTO-CONFIRMAR] Falha no login automático:', loginResponse.status, errorText);
|
||||
console.warn('⚠️ [AUTO-CONFIRMAR] Usuário pode não conseguir fazer login imediatamente!');
|
||||
console.error('[AUTO-CONFIRMAR] Falha no login automático:', loginResponse.status, errorText);
|
||||
console.warn('[AUTO-CONFIRMAR] Usuário pode não conseguir fazer login imediatamente!');
|
||||
}
|
||||
} catch (confirmError) {
|
||||
console.error('❌ [AUTO-CONFIRMAR] Erro ao tentar fazer login automático:', confirmError);
|
||||
console.warn('⚠️ [AUTO-CONFIRMAR] Continuando sem confirmação automática...');
|
||||
console.error('[AUTO-CONFIRMAR] Erro ao tentar fazer login automático:', confirmError);
|
||||
console.warn('[AUTO-CONFIRMAR] Continuando sem confirmação automática...');
|
||||
}
|
||||
} else {
|
||||
console.log('✅ [CRIAR MÉDICO] Email confirmado automaticamente!');
|
||||
console.log('[CRIAR MÉDICO] Email confirmado automaticamente!');
|
||||
}
|
||||
|
||||
// Log bem visível com as credenciais para teste
|
||||
console.log('🔐🔐🔐 ========================================');
|
||||
console.log('🔐 CREDENCIAIS DO MÉDICO CRIADO:');
|
||||
console.log('🔐 Email:', medico.email);
|
||||
console.log('🔐 Senha:', senha);
|
||||
console.log('🔐 Pode fazer login?', responseData.user?.email_confirmed_at ? 'SIM ✅' : 'NÃO ❌ (precisa confirmar email)');
|
||||
console.log('🔐 ========================================');
|
||||
console.log('========================================');
|
||||
console.log('CREDENCIAIS DO MÉDICO CRIADO:');
|
||||
console.log('Email:', medico.email);
|
||||
console.log('Senha:', senha);
|
||||
console.log('Pode fazer login?', responseData.user?.email_confirmed_at ? 'SIM' : 'NÃO (precisa confirmar email)');
|
||||
console.log('========================================');
|
||||
|
||||
return {
|
||||
success: true,
|
||||
@ -1017,7 +1003,7 @@ export async function criarUsuarioMedico(medico: {
|
||||
};
|
||||
|
||||
} catch (error: any) {
|
||||
console.error('❌ [CRIAR MÉDICO] Erro ao criar usuário:', error);
|
||||
console.error('[CRIAR MÉDICO] Erro ao criar usuário:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
@ -1031,11 +1017,11 @@ export async function criarUsuarioPaciente(paciente: {
|
||||
|
||||
const senha = gerarSenhaAleatoria();
|
||||
|
||||
console.log('🏥 [CRIAR PACIENTE] Iniciando criação no Supabase Auth...');
|
||||
console.log('📧 Email:', paciente.email);
|
||||
console.log('👤 Nome:', paciente.full_name);
|
||||
console.log('📱 Telefone:', paciente.phone_mobile);
|
||||
console.log('🔑 Senha gerada:', senha);
|
||||
console.log('[CRIAR PACIENTE] Iniciando criação no Supabase Auth...');
|
||||
console.log('Email:', paciente.email);
|
||||
console.log('Nome:', paciente.full_name);
|
||||
console.log('Telefone:', paciente.phone_mobile);
|
||||
console.log('Senha gerada:', senha);
|
||||
|
||||
// Endpoint do Supabase Auth (mesmo que auth.ts usa)
|
||||
const signupUrl = `${ENV_CONFIG.SUPABASE_URL}/auth/v1/signup`;
|
||||
@ -1050,7 +1036,7 @@ export async function criarUsuarioPaciente(paciente: {
|
||||
}
|
||||
};
|
||||
|
||||
console.log('📤 [CRIAR PACIENTE] Enviando para:', signupUrl);
|
||||
console.log('[CRIAR PACIENTE] Enviando para:', signupUrl);
|
||||
|
||||
try {
|
||||
const response = await fetch(signupUrl, {
|
||||
@ -1063,11 +1049,11 @@ export async function criarUsuarioPaciente(paciente: {
|
||||
body: JSON.stringify(payload),
|
||||
});
|
||||
|
||||
console.log('📋 [CRIAR PACIENTE] Status da resposta:', response.status, response.statusText);
|
||||
console.log('[CRIAR PACIENTE] Status da resposta:', response.status, response.statusText);
|
||||
|
||||
if (!response.ok) {
|
||||
const errorText = await response.text();
|
||||
console.error('❌ [CRIAR PACIENTE] Erro na resposta:', errorText);
|
||||
console.error('[CRIAR PACIENTE] Erro na resposta:', errorText);
|
||||
|
||||
// Tenta parsear o erro para pegar mensagem específica
|
||||
let errorMsg = `Erro ao criar usuário (${response.status})`;
|
||||
@ -1091,14 +1077,14 @@ export async function criarUsuarioPaciente(paciente: {
|
||||
}
|
||||
|
||||
const responseData = await response.json();
|
||||
console.log('✅ [CRIAR PACIENTE] Usuário criado com sucesso no Supabase Auth!');
|
||||
console.log('🆔 User ID:', responseData.user?.id || responseData.id);
|
||||
console.log('📦 [CRIAR PACIENTE] Resposta completa do Supabase:', JSON.stringify(responseData, null, 2));
|
||||
console.log('[CRIAR PACIENTE] Usuário criado com sucesso no Supabase Auth!');
|
||||
console.log('User ID:', responseData.user?.id || responseData.id);
|
||||
console.log('[CRIAR PACIENTE] Resposta completa do Supabase:', JSON.stringify(responseData, null, 2));
|
||||
|
||||
// VERIFICAÇÃO CRÍTICA: O usuário foi realmente criado?
|
||||
if (!responseData.user && !responseData.id) {
|
||||
console.error('⚠️⚠️⚠️ AVISO: Supabase retornou sucesso mas SEM user ID!');
|
||||
console.error('Isso pode significar que o usuário NÃO foi criado de verdade!');
|
||||
console.error('AVISO: Supabase retornou sucesso mas sem user ID!');
|
||||
console.error('Isso pode significar que o usuário não foi criado de verdade!');
|
||||
}
|
||||
|
||||
const userId = responseData.user?.id || responseData.id;
|
||||
@ -1106,11 +1092,11 @@ export async function criarUsuarioPaciente(paciente: {
|
||||
// 🔧 AUTO-CONFIRMAR EMAIL: Fazer login automático logo após criar usuário
|
||||
// Isso força o Supabase a confirmar o email automaticamente
|
||||
if (responseData.user?.email_confirmed_at === null || !responseData.user?.email_confirmed_at) {
|
||||
console.warn('⚠️ [CRIAR PACIENTE] Email NÃO confirmado - tentando auto-confirmar via login...');
|
||||
console.warn('[CRIAR PACIENTE] Email NÃO confirmado - tentando auto-confirmar via login...');
|
||||
|
||||
try {
|
||||
const loginUrl = `${ENV_CONFIG.SUPABASE_URL}/auth/v1/token?grant_type=password`;
|
||||
console.log('🔧 [AUTO-CONFIRMAR] Fazendo login automático para confirmar email...');
|
||||
console.log('[AUTO-CONFIRMAR] Fazendo login automático para confirmar email...');
|
||||
|
||||
const loginResponse = await fetch(loginUrl, {
|
||||
method: 'POST',
|
||||
@ -1124,15 +1110,15 @@ export async function criarUsuarioPaciente(paciente: {
|
||||
}),
|
||||
});
|
||||
|
||||
console.log('🔍 [AUTO-CONFIRMAR] Status do login automático:', loginResponse.status);
|
||||
console.log('[AUTO-CONFIRMAR] Status do login automático:', loginResponse.status);
|
||||
|
||||
if (loginResponse.ok) {
|
||||
const loginData = await loginResponse.json();
|
||||
console.log('✅ [AUTO-CONFIRMAR] Login automático realizado com sucesso!');
|
||||
console.log('📦 [AUTO-CONFIRMAR] Dados completos do login:', JSON.stringify(loginData, undefined, 2));
|
||||
console.log('📧 [AUTO-CONFIRMAR] Email confirmado:', loginData.user?.email_confirmed_at ? 'SIM ✅' : 'NÃO ❌');
|
||||
console.log('👤 [AUTO-CONFIRMAR] UserType no metadata:', loginData.user?.user_metadata?.userType);
|
||||
console.log('🎯 [AUTO-CONFIRMAR] Email verified:', loginData.user?.user_metadata?.email_verified);
|
||||
console.log('[AUTO-CONFIRMAR] Login automático realizado com sucesso!');
|
||||
console.log('[AUTO-CONFIRMAR] Dados completos do login:', JSON.stringify(loginData, undefined, 2));
|
||||
console.log('[AUTO-CONFIRMAR] Email confirmado:', loginData.user?.email_confirmed_at ? 'SIM' : 'NÃO');
|
||||
console.log('[AUTO-CONFIRMAR] UserType no metadata:', loginData.user?.user_metadata?.userType);
|
||||
console.log('[AUTO-CONFIRMAR] Email verified:', loginData.user?.user_metadata?.email_verified);
|
||||
|
||||
// Atualizar responseData com dados do login (que tem email confirmado)
|
||||
if (loginData.user) {
|
||||
@ -1140,33 +1126,33 @@ export async function criarUsuarioPaciente(paciente: {
|
||||
}
|
||||
} else {
|
||||
const errorText = await loginResponse.text();
|
||||
console.error('❌ [AUTO-CONFIRMAR] Falha no login automático:', loginResponse.status, errorText);
|
||||
console.warn('⚠️ [AUTO-CONFIRMAR] Usuário pode não conseguir fazer login imediatamente!');
|
||||
console.error('[AUTO-CONFIRMAR] Falha no login automático:', loginResponse.status, errorText);
|
||||
console.warn('[AUTO-CONFIRMAR] Usuário pode não conseguir fazer login imediatamente!');
|
||||
|
||||
// Tentar parsear o erro para entender melhor
|
||||
try {
|
||||
const errorData = JSON.parse(errorText);
|
||||
console.error('📋 [AUTO-CONFIRMAR] Detalhes do erro:', errorData);
|
||||
console.error('[AUTO-CONFIRMAR] Detalhes do erro:', errorData);
|
||||
} catch (e) {
|
||||
console.error('📋 [AUTO-CONFIRMAR] Erro não é JSON:', errorText);
|
||||
console.error('[AUTO-CONFIRMAR] Erro não é JSON:', errorText);
|
||||
}
|
||||
}
|
||||
} catch (confirmError) {
|
||||
console.error('❌ [AUTO-CONFIRMAR] Erro ao tentar fazer login automático:', confirmError);
|
||||
console.warn('⚠️ [AUTO-CONFIRMAR] Continuando sem confirmação automática...');
|
||||
console.error('[AUTO-CONFIRMAR] Erro ao tentar fazer login automático:', confirmError);
|
||||
console.warn('[AUTO-CONFIRMAR] Continuando sem confirmação automática...');
|
||||
}
|
||||
} else {
|
||||
console.log('✅ [CRIAR PACIENTE] Email confirmado automaticamente!');
|
||||
console.log('[CRIAR PACIENTE] Email confirmado automaticamente!');
|
||||
}
|
||||
|
||||
// Log bem visível com as credenciais para teste
|
||||
console.log('🔐🔐🔐 ========================================');
|
||||
console.log('🔐 CREDENCIAIS DO PACIENTE CRIADO:');
|
||||
console.log('🔐 Email:', paciente.email);
|
||||
console.log('🔐 Senha:', senha);
|
||||
console.log('🔐 UserType:', 'paciente');
|
||||
console.log('🔐 Pode fazer login?', responseData.user?.email_confirmed_at ? 'SIM ✅' : 'NÃO ❌ (precisa confirmar email)');
|
||||
console.log('🔐 ========================================');
|
||||
console.log('========================================');
|
||||
console.log('CREDENCIAIS DO PACIENTE CRIADO:');
|
||||
console.log('Email:', paciente.email);
|
||||
console.log('Senha:', senha);
|
||||
console.log('UserType:', 'paciente');
|
||||
console.log('Pode fazer login?', responseData.user?.email_confirmed_at ? 'SIM' : 'NÃO (precisa confirmar email)');
|
||||
console.log('========================================');
|
||||
|
||||
return {
|
||||
success: true,
|
||||
@ -1176,7 +1162,7 @@ export async function criarUsuarioPaciente(paciente: {
|
||||
};
|
||||
|
||||
} catch (error: any) {
|
||||
console.error('❌ [CRIAR PACIENTE] Erro ao criar usuário:', error);
|
||||
console.error('[CRIAR PACIENTE] Erro ao criar usuário:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user