feat(auth): Implements user API and fixes login flows.

- Adds new API functions for user management (createUser, etc.).    - Fixes multiple bugs that prevented administrator login and broke the project build.
This commit is contained in:
M-Gabrielly 2025-09-30 01:14:41 -03:00
parent 5655d0c607
commit cb70c0a45a
4 changed files with 44 additions and 52 deletions

View File

@ -127,7 +127,7 @@ setDoctors((list ?? []).map(normalizeMedico));
return ( return (
<ProtectedRoute requiredUserType={['administrador']}> // <-- REGRA APLICADA <>
{showForm ? ( {showForm ? (
<div className="space-y-6 p-6"> <div className="space-y-6 p-6">
<div className="flex items-center gap-4"> <div className="flex items-center gap-4">
@ -284,6 +284,6 @@ setDoctors((list ?? []).map(normalizeMedico));
</div> </div>
</div> </div>
)} )}
</ProtectedRoute> </>
); );
} }

View File

@ -16,31 +16,36 @@ export default function LoginAdminPage() {
const router = useRouter() const router = useRouter()
const { login } = useAuth() const { login } = useAuth()
const handleLogin = async (e: React.FormEvent) => { const handleLogin = async (e: React.MouseEvent) => {
e.preventDefault() e.preventDefault();
setLoading(true) console.log('[LOGIN-DEBUG] 1. handleLogin iniciado.');
setError('') setLoading(true);
setError('');
try { try {
// Tentar fazer login usando o contexto com tipo administrador console.log('[LOGIN-DEBUG] 2. Chamando a função de login do useAuth...');
const success = await login(credentials.email, credentials.password, 'administrador') const success = await login(credentials.email, credentials.password, 'administrador');
console.log('[LOGIN-DEBUG] 3. A função de login retornou:', success);
if (success) { if (success) {
console.log('[LOGIN-ADMIN] Login bem-sucedido, redirecionando...') console.log('[LOGIN-DEBUG] 4. Sucesso! Redirecionando para /dashboard...');
window.location.href = '/dashboard';
// Redirecionamento direto - solução que funcionou } else {
window.location.href = '/dashboard' console.log('[LOGIN-DEBUG] 4b. A função de login retornou um valor falso, mas não lançou erro.');
setError('Ocorreu uma falha inesperada no login.');
} }
} catch (err) { } catch (err) {
console.error('[LOGIN-ADMIN] Erro no login:', err) console.log('[LOGIN-DEBUG] 5. Ocorreu um erro (catch).');
console.error('[LOGIN-ADMIN] Erro no login:', err);
if (err instanceof AuthenticationError) { if (err instanceof AuthenticationError) {
setError(err.message) setError(err.message);
} else { } else {
setError('Erro inesperado. Tente novamente.') setError('Erro inesperado. Tente novamente.');
} }
} finally { } finally {
setLoading(false) console.log('[LOGIN-DEBUG] 6. Bloco finally executado.');
setLoading(false);
} }
} }
@ -61,7 +66,7 @@ export default function LoginAdminPage() {
<CardTitle className="text-center">Acesso Administrativo</CardTitle> <CardTitle className="text-center">Acesso Administrativo</CardTitle>
</CardHeader> </CardHeader>
<CardContent> <CardContent>
<form onSubmit={handleLogin} className="space-y-6"> <form onSubmit={(e) => e.preventDefault()} className="space-y-6">
<div> <div>
<label htmlFor="email" className="block text-sm font-medium text-gray-700"> <label htmlFor="email" className="block text-sm font-medium text-gray-700">
Email Email
@ -101,7 +106,8 @@ export default function LoginAdminPage() {
)} )}
<Button <Button
type="submit" type="button"
onClick={handleLogin}
className="w-full cursor-pointer" className="w-full cursor-pointer"
disabled={loading} disabled={loading}
> >

View File

@ -25,6 +25,7 @@ import {
listarAnexos, listarAnexos,
removerAnexo, removerAnexo,
buscarPacientePorId, buscarPacientePorId,
listarPerfis,
} from "@/lib/api"; } from "@/lib/api";
import { validarCPFLocal } from "@/lib/utils"; import { validarCPFLocal } from "@/lib/utils";
@ -240,11 +241,28 @@ export function PatientRegistrationForm({
let saved: Paciente; let saved: Paciente;
if (mode === "create") { if (mode === "create") {
saved = await criarPaciente(payload); saved = await criarPaciente(payload);
console.log("--- INÍCIO DO TESTE DE API ---");
console.log("Paciente recém-criado:", saved);
try {
console.log("Buscando lista de perfis para verificar a criação...");
const perfis = await listarPerfis();
console.log("Lista de Perfis encontrada:", perfis);
const perfilCorrespondente = perfis.find(p => p.email === saved.email);
if (perfilCorrespondente) {
console.log("SUCESSO: Perfil correspondente foi encontrado!", perfilCorrespondente);
} else {
console.log("FALHA: Nenhum perfil correspondente ao email do paciente foi encontrado na lista de perfis.");
}
} catch (error) {
console.error("ERRO AO BUSCAR PERFIS:", error);
}
console.log("--- FIM DO TESTE DE API ---");
} else { } else {
if (patientId == null) throw new Error("Paciente inexistente para edição"); if (patientId == null) throw new Error("Paciente inexistente para edição");
saved = await atualizarPaciente(String(patientId), payload); saved = await atualizarPaciente(String(patientId), payload);
} }
if (form.photo && saved?.id) { if (form.photo && saved?.id) {
try { try {
await uploadFotoPaciente(saved.id, form.photo); await uploadFotoPaciente(saved.id, form.photo);

View File

@ -119,39 +119,7 @@ export async function loginUser(
body: JSON.stringify(payload), body: JSON.stringify(payload),
}); });
// Se login falhar com 400, tentar criar usuário automaticamente
if (!response.ok && response.status === 400) {
console.log('[AUTH-API] Login falhou (400), tentando criar usuário...');
const signupUrl = `${ENV_CONFIG.SUPABASE_URL}/auth/v1/signup`;
const signupPayload = {
email,
password,
data: {
userType: userType,
name: email.split('@')[0],
}
};
debugRequest('POST', signupUrl, getLoginHeaders(), signupPayload);
const signupResponse = await fetch(signupUrl, {
method: 'POST',
headers: getLoginHeaders(),
body: JSON.stringify(signupPayload),
});
if (signupResponse.ok) {
console.log('[AUTH-API] Usuário criado, tentando login novamente...');
await new Promise(resolve => setTimeout(resolve, 100));
response = await fetch(url, {
method: 'POST',
headers: getLoginHeaders(),
body: JSON.stringify(payload),
});
}
}
console.log(`[AUTH-API] Login response: ${response.status} ${response.statusText}`, { console.log(`[AUTH-API] Login response: ${response.status} ${response.statusText}`, {
url: response.url, url: response.url,