Files
cuidamais_med/docs/09_Autenticacao.md
2026-04-22 12:41:12 +01:00

108 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🔐 Autenticação — Login e Registo
> **Pasta:** `app/src/main/java/com/example/medcuida/pro/ui/auth/`
---
## LoginActivity.java (154 linhas)
> **Layout:** `activity_login.xml`
### Descrição
Ecrã de **entrada na aplicação**. Permite login com email/password via Firebase Auth.
### Inicialização (`onCreate`) — Linhas 3478
1. **Auto-login:** Se já existe sessão ativa → redireciona direto para `MainActivity`
2. **Campos:** email e password (`TextInputEditText`)
3. **Botão "Entrar"**`attemptLogin()`
4. **Link "Registar"** → abre `RegisterActivity`
5. **Link "Esqueci password":**
- Valida se o email foi preenchido
- Envia email de recuperação via `mAuth.sendPasswordResetEmail()`
### `attemptLogin()` — Linhas 8198
Validações antes de enviar ao Firebase:
- Email não pode estar vazio
- Password não pode estar vazia
### `loginUser()` — Linhas 100123
```java
mAuth.signInWithEmailAndPassword(email, password)
```
1. Desativa o botão (evita duplo clique) e mostra "A entrar..."
2. Se login OK → chama `checkUserAccess()`
3. Se falhar → mostra mensagem de erro e reativa o botão
### `checkUserAccess()` — Linhas 125152
**Verifica se o utilizador tem perfil configurado** (estratégia com fallback):
```
1º → Procura em 'medicos' → Se existe → Entrar na app
2º → Procura em 'utilizadores' → Se existe → Entrar na app
3º → Não encontrado → Erro + signOut
```
Se não encontrar em nenhuma coleção → faz `signOut()` e pede para registar.
---
## RegisterActivity.java (187 linhas)
> **Layout:** `activity_register_medico.xml`
### Descrição
Ecrã de **registo de novos médicos**. Cria conta no Firebase Auth e guarda dados no Firestore.
### Campos do Formulário
| Campo | Tipo | Obrigatório | Validação |
|---|---|---|---|
| Nome completo | `TextInputEditText` | ✅ | Não vazio |
| Especialidade | `TextInputEditText` | ✅ | Não vazio |
| Género | `AutoCompleteTextView` | ✅ | Não vazio |
| Email | `TextInputEditText` | ✅ | Não vazio |
| Password | `TextInputEditText` | ✅ | Mínimo 6 caracteres |
### `attemptRegister()` — Linhas 75118
Valida todos os campos sequencialmente. Se algum falhar, faz `requestFocus()` nesse campo.
### `registerUser()` — Linhas 121155
```java
mAuth.createUserWithEmailAndPassword(email, password)
```
1. Desativa o botão de registo
2. Se criar conta OK → chama `saveMedicoData()`
3. **Caso especial — email já existe:**
- Tenta fazer login com as credenciais fornecidas
- Se login OK → grava os dados (pode ter falhado antes)
- Se login falhar → mostra erro "email já registado"
### `saveMedicoData()` — Linhas 157185
Grava os dados do médico em **duas coleções** para compatibilidade:
```java
Map<String, Object> medicoMap = new HashMap<>();
medicoMap.put("id", uid);
medicoMap.put("nome_completo", name);
medicoMap.put("email", email);
medicoMap.put("especialidade", specialty);
medicoMap.put("sexo", gender);
medicoMap.put("tipo", "medico");
```
| Coleção | Documento |
|---|---|
| `utilizadores/{uid}` | Dados principais |
| `medicos/{uid}` | Cópia para compatibilidade |
Após gravar com sucesso → redireciona para `MainActivity`.