chore(api):remove unnecessary comments
This commit is contained in:
parent
535f400f2d
commit
c62883a5cc
@ -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 ---
|
// --- NOVA LÓGICA DE CRIAÇÃO ---
|
||||||
const patientPayload = toPayload();
|
const patientPayload = toPayload();
|
||||||
const savedPatientProfile = await criarPaciente(patientPayload);
|
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('@')) {
|
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 {
|
try {
|
||||||
const userResponse = await criarUsuarioPaciente({
|
const userResponse = await criarUsuarioPaciente({
|
||||||
email: form.email,
|
email: form.email,
|
||||||
@ -285,7 +285,7 @@ export function PatientRegistrationForm({
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (userResponse.success && userResponse.user) {
|
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
|
// Mostra credenciais no dialog usando as credenciais retornadas
|
||||||
setCredentials({
|
setCredentials({
|
||||||
@ -306,7 +306,7 @@ export function PatientRegistrationForm({
|
|||||||
throw new Error((userResponse as any).message || "Falhou ao criar o usuário de acesso.");
|
throw new Error((userResponse as any).message || "Falhou ao criar o usuário de acesso.");
|
||||||
}
|
}
|
||||||
} catch (userError: any) {
|
} 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
|
// Mensagem de erro específica para email duplicado
|
||||||
const errorMsg = userError?.message || String(userError);
|
const errorMsg = userError?.message || String(userError);
|
||||||
@ -315,14 +315,14 @@ export function PatientRegistrationForm({
|
|||||||
errorMsg.toLowerCase().includes('já está cadastrado') ||
|
errorMsg.toLowerCase().includes('já está cadastrado') ||
|
||||||
errorMsg.toLowerCase().includes('já existe')) {
|
errorMsg.toLowerCase().includes('já existe')) {
|
||||||
alert(
|
alert(
|
||||||
`⚠️ Este email já está cadastrado no sistema.\n\n` +
|
` Este email já está cadastrado no sistema.\n\n` +
|
||||||
`✅ O perfil do paciente foi salvo com sucesso.\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.`
|
`Para criar acesso ao sistema, use um email diferente ou recupere a senha do email existente.`
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
alert(
|
alert(
|
||||||
`✅ Paciente cadastrado com sucesso!\n\n` +
|
` Paciente cadastrado com sucesso!\n\n` +
|
||||||
`⚠️ Porém houve um problema ao criar o acesso:\n${errorMsg}\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.`
|
`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 res = await fetch(url, { method: "GET", headers: baseHeaders() });
|
||||||
const arr = await parse<Medico[]>(res);
|
const arr = await parse<Medico[]>(res);
|
||||||
if (arr && arr.length > 0) {
|
if (arr && arr.length > 0) {
|
||||||
console.log('✅ Médico encontrado no Supabase:', arr[0]);
|
console.log('Médico encontrado no Supabase:', arr[0]);
|
||||||
console.log('🔍 Campo especialidade no médico:', {
|
console.log('Campo especialidade no médico:', {
|
||||||
especialidade: arr[0].especialidade,
|
especialidade: arr[0].especialidade,
|
||||||
specialty: (arr[0] as any).specialty,
|
specialty: (arr[0] as any).specialty,
|
||||||
hasEspecialidade: !!arr[0].especialidade,
|
hasEspecialidade: !!arr[0].especialidade,
|
||||||
@ -533,7 +533,7 @@ export async function buscarMedicoPorId(id: string | number): Promise<Medico> {
|
|||||||
return arr[0];
|
return arr[0];
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} 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
|
// 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();
|
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;
|
return medico as Medico;
|
||||||
} catch (error) {
|
} 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");
|
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> {
|
export async function atualizarMedico(id: string | number, input: MedicoInput): Promise<Medico> {
|
||||||
console.log(`🔄 Tentando atualizar médico ID: ${id}`);
|
console.log(`Tentando atualizar médico ID: ${id}`);
|
||||||
console.log(`📤 Payload original:`, input);
|
console.log(`Payload original:`, input);
|
||||||
|
|
||||||
// Criar um payload limpo apenas com campos básicos que sabemos que existem
|
// Criar um payload limpo apenas com campos básicos que sabemos que existem
|
||||||
const cleanPayload = {
|
const cleanPayload = {
|
||||||
@ -600,12 +600,12 @@ export async function atualizarMedico(id: string | number, input: MedicoInput):
|
|||||||
active: input.active ?? true
|
active: input.active ?? true
|
||||||
};
|
};
|
||||||
|
|
||||||
console.log(`📤 Payload limpo:`, cleanPayload);
|
console.log(`Payload limpo:`, cleanPayload);
|
||||||
|
|
||||||
// Atualizar apenas no Supabase (dados reais)
|
// Atualizar apenas no Supabase (dados reais)
|
||||||
try {
|
try {
|
||||||
const url = `${REST}/doctors?id=eq.${id}`;
|
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, {
|
const res = await fetch(url, {
|
||||||
method: "PATCH",
|
method: "PATCH",
|
||||||
@ -613,17 +613,17 @@ export async function atualizarMedico(id: string | number, input: MedicoInput):
|
|||||||
body: JSON.stringify(cleanPayload),
|
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) {
|
if (res.ok) {
|
||||||
const arr = await parse<Medico[] | Medico>(res);
|
const arr = await parse<Medico[] | Medico>(res);
|
||||||
const result = Array.isArray(arr) ? arr[0] : (arr as Medico);
|
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;
|
return result;
|
||||||
} else {
|
} else {
|
||||||
// Vamos tentar ver o erro detalhado
|
// Vamos tentar ver o erro detalhado
|
||||||
const errorText = await res.text();
|
const errorText = await res.text();
|
||||||
console.error(`❌ Erro detalhado do Supabase:`, {
|
console.error(`Erro detalhado do Supabase:`, {
|
||||||
status: res.status,
|
status: res.status,
|
||||||
statusText: res.statusText,
|
statusText: res.statusText,
|
||||||
response: errorText,
|
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}`);
|
throw new Error(`Supabase error: ${res.status} ${res.statusText} - ${errorText}`);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('❌ Erro ao atualizar médico:', error);
|
console.error('Erro ao atualizar médico:', error);
|
||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -682,20 +682,6 @@ export async function listarPatientAssignments(params?: { page?: number; limit?:
|
|||||||
return await parse<PatientAssignment[]>(res);
|
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 = {
|
export type User = {
|
||||||
id: string;
|
id: string;
|
||||||
@ -816,7 +802,7 @@ export async function criarUsuarioDirectAuth(input: {
|
|||||||
role: UserRoleEnum;
|
role: UserRoleEnum;
|
||||||
userType?: 'profissional' | 'paciente';
|
userType?: 'profissional' | 'paciente';
|
||||||
}): Promise<CreateUserWithPasswordResponse> {
|
}): 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`;
|
const signupUrl = `${API_BASE}/auth/v1/signup`;
|
||||||
|
|
||||||
@ -856,7 +842,7 @@ export async function criarUsuarioDirectAuth(input: {
|
|||||||
const responseData = await response.json();
|
const responseData = await response.json();
|
||||||
const userId = responseData.user?.id || responseData.id;
|
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)
|
// 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.
|
// when creating the user. The frontend should NOT attempt to assign roles.
|
||||||
@ -876,7 +862,7 @@ export async function criarUsuarioDirectAuth(input: {
|
|||||||
};
|
};
|
||||||
|
|
||||||
} catch (error: any) {
|
} 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;
|
throw error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -895,11 +881,11 @@ export async function criarUsuarioMedico(medico: {
|
|||||||
|
|
||||||
const senha = gerarSenhaAleatoria();
|
const senha = gerarSenhaAleatoria();
|
||||||
|
|
||||||
console.log('🏥 [CRIAR MÉDICO] Iniciando criação no Supabase Auth...');
|
console.log('[CRIAR MÉDICO] Iniciando criação no Supabase Auth...');
|
||||||
console.log('📧 Email:', medico.email);
|
console.log('Email:', medico.email);
|
||||||
console.log('👤 Nome:', medico.full_name);
|
console.log('Nome:', medico.full_name);
|
||||||
console.log('📱 Telefone:', medico.phone_mobile);
|
console.log('Telefone:', medico.phone_mobile);
|
||||||
console.log('🔑 Senha gerada:', senha);
|
console.log('Senha gerada:', senha);
|
||||||
|
|
||||||
// Endpoint do Supabase Auth (mesmo que auth.ts usa)
|
// Endpoint do Supabase Auth (mesmo que auth.ts usa)
|
||||||
const signupUrl = `${ENV_CONFIG.SUPABASE_URL}/auth/v1/signup`;
|
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 {
|
try {
|
||||||
const response = await fetch(signupUrl, {
|
const response = await fetch(signupUrl, {
|
||||||
@ -927,11 +913,11 @@ export async function criarUsuarioMedico(medico: {
|
|||||||
body: JSON.stringify(payload),
|
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) {
|
if (!response.ok) {
|
||||||
const errorText = await response.text();
|
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
|
// Tenta parsear o erro para pegar mensagem específica
|
||||||
let errorMsg = `Erro ao criar usuário (${response.status})`;
|
let errorMsg = `Erro ao criar usuário (${response.status})`;
|
||||||
@ -955,17 +941,17 @@ export async function criarUsuarioMedico(medico: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const responseData = await response.json();
|
const responseData = await response.json();
|
||||||
console.log('✅ [CRIAR MÉDICO] Usuário criado com sucesso no Supabase Auth!');
|
console.log('[CRIAR MÉDICO] Usuário criado com sucesso no Supabase Auth!');
|
||||||
console.log('🆔 User ID:', responseData.user?.id || responseData.id);
|
console.log('User ID:', responseData.user?.id || responseData.id);
|
||||||
|
|
||||||
// 🔧 AUTO-CONFIRMAR EMAIL: Fazer login automático logo após criar usuário
|
// 🔧 AUTO-CONFIRMAR EMAIL: Fazer login automático logo após criar usuário
|
||||||
// Isso força o Supabase a confirmar o email automaticamente
|
// Isso força o Supabase a confirmar o email automaticamente
|
||||||
if (responseData.user?.email_confirmed_at === null || !responseData.user?.email_confirmed_at) {
|
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 {
|
try {
|
||||||
const loginUrl = `${ENV_CONFIG.SUPABASE_URL}/auth/v1/token?grant_type=password`;
|
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, {
|
const loginResponse = await fetch(loginUrl, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
@ -981,8 +967,8 @@ export async function criarUsuarioMedico(medico: {
|
|||||||
|
|
||||||
if (loginResponse.ok) {
|
if (loginResponse.ok) {
|
||||||
const loginData = await loginResponse.json();
|
const loginData = await loginResponse.json();
|
||||||
console.log('✅ [AUTO-CONFIRMAR] Login automático realizado com sucesso!');
|
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] Email confirmado:', loginData.user?.email_confirmed_at ? 'SIM' : 'NÃO');
|
||||||
|
|
||||||
// Atualizar responseData com dados do login (que tem email confirmado)
|
// Atualizar responseData com dados do login (que tem email confirmado)
|
||||||
if (loginData.user) {
|
if (loginData.user) {
|
||||||
@ -990,24 +976,24 @@ export async function criarUsuarioMedico(medico: {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const errorText = await loginResponse.text();
|
const errorText = await loginResponse.text();
|
||||||
console.error('❌ [AUTO-CONFIRMAR] Falha no login automático:', loginResponse.status, errorText);
|
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.warn('[AUTO-CONFIRMAR] Usuário pode não conseguir fazer login imediatamente!');
|
||||||
}
|
}
|
||||||
} catch (confirmError) {
|
} catch (confirmError) {
|
||||||
console.error('❌ [AUTO-CONFIRMAR] Erro ao tentar fazer login automático:', confirmError);
|
console.error('[AUTO-CONFIRMAR] Erro ao tentar fazer login automático:', confirmError);
|
||||||
console.warn('⚠️ [AUTO-CONFIRMAR] Continuando sem confirmação automática...');
|
console.warn('[AUTO-CONFIRMAR] Continuando sem confirmação automática...');
|
||||||
}
|
}
|
||||||
} else {
|
} 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
|
// Log bem visível com as credenciais para teste
|
||||||
console.log('🔐🔐🔐 ========================================');
|
console.log('========================================');
|
||||||
console.log('🔐 CREDENCIAIS DO MÉDICO CRIADO:');
|
console.log('CREDENCIAIS DO MÉDICO CRIADO:');
|
||||||
console.log('🔐 Email:', medico.email);
|
console.log('Email:', medico.email);
|
||||||
console.log('🔐 Senha:', senha);
|
console.log('Senha:', senha);
|
||||||
console.log('🔐 Pode fazer login?', responseData.user?.email_confirmed_at ? 'SIM ✅' : 'NÃO ❌ (precisa confirmar email)');
|
console.log('Pode fazer login?', responseData.user?.email_confirmed_at ? 'SIM' : 'NÃO (precisa confirmar email)');
|
||||||
console.log('🔐 ========================================');
|
console.log('========================================');
|
||||||
|
|
||||||
return {
|
return {
|
||||||
success: true,
|
success: true,
|
||||||
@ -1017,7 +1003,7 @@ export async function criarUsuarioMedico(medico: {
|
|||||||
};
|
};
|
||||||
|
|
||||||
} catch (error: any) {
|
} 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;
|
throw error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1031,11 +1017,11 @@ export async function criarUsuarioPaciente(paciente: {
|
|||||||
|
|
||||||
const senha = gerarSenhaAleatoria();
|
const senha = gerarSenhaAleatoria();
|
||||||
|
|
||||||
console.log('🏥 [CRIAR PACIENTE] Iniciando criação no Supabase Auth...');
|
console.log('[CRIAR PACIENTE] Iniciando criação no Supabase Auth...');
|
||||||
console.log('📧 Email:', paciente.email);
|
console.log('Email:', paciente.email);
|
||||||
console.log('👤 Nome:', paciente.full_name);
|
console.log('Nome:', paciente.full_name);
|
||||||
console.log('📱 Telefone:', paciente.phone_mobile);
|
console.log('Telefone:', paciente.phone_mobile);
|
||||||
console.log('🔑 Senha gerada:', senha);
|
console.log('Senha gerada:', senha);
|
||||||
|
|
||||||
// Endpoint do Supabase Auth (mesmo que auth.ts usa)
|
// Endpoint do Supabase Auth (mesmo que auth.ts usa)
|
||||||
const signupUrl = `${ENV_CONFIG.SUPABASE_URL}/auth/v1/signup`;
|
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 {
|
try {
|
||||||
const response = await fetch(signupUrl, {
|
const response = await fetch(signupUrl, {
|
||||||
@ -1063,11 +1049,11 @@ export async function criarUsuarioPaciente(paciente: {
|
|||||||
body: JSON.stringify(payload),
|
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) {
|
if (!response.ok) {
|
||||||
const errorText = await response.text();
|
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
|
// Tenta parsear o erro para pegar mensagem específica
|
||||||
let errorMsg = `Erro ao criar usuário (${response.status})`;
|
let errorMsg = `Erro ao criar usuário (${response.status})`;
|
||||||
@ -1091,14 +1077,14 @@ export async function criarUsuarioPaciente(paciente: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const responseData = await response.json();
|
const responseData = await response.json();
|
||||||
console.log('✅ [CRIAR PACIENTE] Usuário criado com sucesso no Supabase Auth!');
|
console.log('[CRIAR PACIENTE] Usuário criado com sucesso no Supabase Auth!');
|
||||||
console.log('🆔 User ID:', responseData.user?.id || responseData.id);
|
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] Resposta completa do Supabase:', JSON.stringify(responseData, null, 2));
|
||||||
|
|
||||||
// VERIFICAÇÃO CRÍTICA: O usuário foi realmente criado?
|
// VERIFICAÇÃO CRÍTICA: O usuário foi realmente criado?
|
||||||
if (!responseData.user && !responseData.id) {
|
if (!responseData.user && !responseData.id) {
|
||||||
console.error('⚠️⚠️⚠️ AVISO: Supabase retornou sucesso mas SEM user 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('Isso pode significar que o usuário não foi criado de verdade!');
|
||||||
}
|
}
|
||||||
|
|
||||||
const userId = responseData.user?.id || responseData.id;
|
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
|
// 🔧 AUTO-CONFIRMAR EMAIL: Fazer login automático logo após criar usuário
|
||||||
// Isso força o Supabase a confirmar o email automaticamente
|
// Isso força o Supabase a confirmar o email automaticamente
|
||||||
if (responseData.user?.email_confirmed_at === null || !responseData.user?.email_confirmed_at) {
|
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 {
|
try {
|
||||||
const loginUrl = `${ENV_CONFIG.SUPABASE_URL}/auth/v1/token?grant_type=password`;
|
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, {
|
const loginResponse = await fetch(loginUrl, {
|
||||||
method: 'POST',
|
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) {
|
if (loginResponse.ok) {
|
||||||
const loginData = await loginResponse.json();
|
const loginData = await loginResponse.json();
|
||||||
console.log('✅ [AUTO-CONFIRMAR] Login automático realizado com sucesso!');
|
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] 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] 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] UserType no metadata:', loginData.user?.user_metadata?.userType);
|
||||||
console.log('🎯 [AUTO-CONFIRMAR] Email verified:', loginData.user?.user_metadata?.email_verified);
|
console.log('[AUTO-CONFIRMAR] Email verified:', loginData.user?.user_metadata?.email_verified);
|
||||||
|
|
||||||
// Atualizar responseData com dados do login (que tem email confirmado)
|
// Atualizar responseData com dados do login (que tem email confirmado)
|
||||||
if (loginData.user) {
|
if (loginData.user) {
|
||||||
@ -1140,33 +1126,33 @@ export async function criarUsuarioPaciente(paciente: {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const errorText = await loginResponse.text();
|
const errorText = await loginResponse.text();
|
||||||
console.error('❌ [AUTO-CONFIRMAR] Falha no login automático:', loginResponse.status, errorText);
|
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.warn('[AUTO-CONFIRMAR] Usuário pode não conseguir fazer login imediatamente!');
|
||||||
|
|
||||||
// Tentar parsear o erro para entender melhor
|
// Tentar parsear o erro para entender melhor
|
||||||
try {
|
try {
|
||||||
const errorData = JSON.parse(errorText);
|
const errorData = JSON.parse(errorText);
|
||||||
console.error('📋 [AUTO-CONFIRMAR] Detalhes do erro:', errorData);
|
console.error('[AUTO-CONFIRMAR] Detalhes do erro:', errorData);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('📋 [AUTO-CONFIRMAR] Erro não é JSON:', errorText);
|
console.error('[AUTO-CONFIRMAR] Erro não é JSON:', errorText);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (confirmError) {
|
} catch (confirmError) {
|
||||||
console.error('❌ [AUTO-CONFIRMAR] Erro ao tentar fazer login automático:', confirmError);
|
console.error('[AUTO-CONFIRMAR] Erro ao tentar fazer login automático:', confirmError);
|
||||||
console.warn('⚠️ [AUTO-CONFIRMAR] Continuando sem confirmação automática...');
|
console.warn('[AUTO-CONFIRMAR] Continuando sem confirmação automática...');
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
console.log('✅ [CRIAR PACIENTE] Email confirmado automaticamente!');
|
console.log('[CRIAR PACIENTE] Email confirmado automaticamente!');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log bem visível com as credenciais para teste
|
// Log bem visível com as credenciais para teste
|
||||||
console.log('🔐🔐🔐 ========================================');
|
console.log('========================================');
|
||||||
console.log('🔐 CREDENCIAIS DO PACIENTE CRIADO:');
|
console.log('CREDENCIAIS DO PACIENTE CRIADO:');
|
||||||
console.log('🔐 Email:', paciente.email);
|
console.log('Email:', paciente.email);
|
||||||
console.log('🔐 Senha:', senha);
|
console.log('Senha:', senha);
|
||||||
console.log('🔐 UserType:', 'paciente');
|
console.log('UserType:', 'paciente');
|
||||||
console.log('🔐 Pode fazer login?', responseData.user?.email_confirmed_at ? 'SIM ✅' : 'NÃO ❌ (precisa confirmar email)');
|
console.log('Pode fazer login?', responseData.user?.email_confirmed_at ? 'SIM' : 'NÃO (precisa confirmar email)');
|
||||||
console.log('🔐 ========================================');
|
console.log('========================================');
|
||||||
|
|
||||||
return {
|
return {
|
||||||
success: true,
|
success: true,
|
||||||
@ -1176,7 +1162,7 @@ export async function criarUsuarioPaciente(paciente: {
|
|||||||
};
|
};
|
||||||
|
|
||||||
} catch (error: any) {
|
} 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;
|
throw error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user