Exemplo Prático: Jornada da Enfermeira e Paciente
Este guia detalha um fluxo complexo de atendimento iniciado por um profissional de enfermagem, passando pela triagem, fila de espera do paciente, até o atendimento final com o médico.
Passo 1: Busca e Identificação (RBAC)
A enfermeira Maria acessa o App Medical. Ela precisa localizar o paciente Carlos.
- Ação: Pesquisa por CPF.
- Camada:
Apps/AppMedical+Domains/Users. - Mecanismo:
RequireRoleLayout role="NURSE"garante que apenas enfermeiras acessem este módulo de busca. - Step-by-Step:
- Maria digita o CPF na UI de busca (
shared/ui/DataTable). - O domínio de
Usersbusca os dados e exibe o perfil de Carlos.
- Maria digita o CPF na UI de busca (
Passo 2: Triagem e Impersonation (Auth & Events)
Carlos possui dificuldades com o App. Maria inicia a triagem e "assume" o lugar de Carlos no sistema para ajudá-lo.
- Ação: Iniciar Protocolo de Triagem.
- Camada:
Domains/Consultation+Core/Auth. - Mecanismo: Geração de token de Impersonation.
- Step-by-Step:
- Maria clica em "Iniciar Triagem".
- O sistema publica o evento
TRIAGE_STARTED. - O domínio de consulta gera uma sessão onde Maria atua em nome do paciente Carlos temporariamente.
typescript
domainEventsBus.publish(DomainEventNames.TRIAGE_COMPLETED, {
patientId: 'carlos-789',
nurseId: 'maria-456',
queueId: 'geriatria-priority'
});Passo 3: Gestão de Fila (State Machine)
Carlos (agora via sistema) entra na fila virtual de espera.
- Ação: Entrada na Fila de Prioridade.
- Camada:
Domains/Consultation/Machines. - Mecanismo:
queueMachine(XState) gerencia o status do paciente. - Step-by-Step:
- O evento
TRIAGE_COMPLETEDfaz a máquina de Carlos transitar paraEM_FILA. - O App Patient de Carlos (se ele abrir) mostra: "Você é o 3º na fila".
- O evento
Passo 4: O "Match" (WebSockets & Domain Events)
O Dr. Roberto fica disponível e o sistema realiza o pareamento.
- Ação: Match Automático.
- Camada:
Core/DomainEvents+Core/WebSockets. - Mecanismo: Barramento de eventos notifica as Apps em tempo real.
- Step-by-Step:
- O Backend dispara
CONSULTATION_MATCHED. - O Saga no App de Carlos detecta o evento e redireciona para a sala virtual.
- O Backend dispara
typescript
function* watchMatchEvent() {
const channel = domainEventsBus.createChannel();
while (true) {
const event = yield take(channel);
if (event.name === DomainEventNames.CONSULTATION_MATCHED) {
yield put(push(`/patient/room/${event.payload.roomId}`));
}
}
}Passo 5: Atendimento Ativo (Visão Paralela)
Carlos e Dr. Roberto iniciam a conversa.
- Ação: Atendimento Multimodal.
- Camada:
Domains/Consultation/UI+Domains/Chat. - Mecanismo: Estados paralelos para gerenciar Vídeo e Chat simultaneamente.
- Step-by-Step:
- Carlos vê o vídeo do médico (Região Vídeo).
- Carlos pode enviar mensagens ou ver o resumo da triagem feito pela Maria (Região Chat).
- A máquina garante que o atendimento só conte como "Iniciado" quando ambos estão conectados.
Resumo de Atribuições
| Ator | Etapa | Camada Chave |
|---|---|---|
| Enfermeira | Identificação e Triagem | Domains/Users |
| Enfermeira | Assistência (Impersonation) | Core/Auth |
| Paciente | Espera Reativa | Consultation/Machines |
| Sistema | Orquestração (Match) | Core/DomainEvents |
| Paciente | Interação (Vídeo/Chat) | Domains/Consultation |