# Role: AGENDA_VIEWER ## Descrição A role `AGENDA_VIEWER` foi criada para usuários internos da empresa Photum que precisam visualizar informações da agenda, mas sem permissão para modificar dados ou acessar informações de logística. ## Características ### Permissões (O que pode fazer) - ✅ **Ver lista completa da agenda**: Acesso completo à listagem de eventos - ✅ **Ver detalhes dos eventos**: Pode visualizar todas as informações detalhadas de cada evento - ✅ **Ver profissionais alocados**: Pode ver quais profissionais estão designados para cada evento - ✅ **Ver escala de profissionais**: Pode visualizar os horários e alocações da equipe - ✅ **Ver informações gerais**: Datas, locais, horários, observações, etc. ### Restrições (O que NÃO pode fazer) - ❌ **Criar novos eventos**: Botão de criar evento não aparece - ❌ **Editar eventos existentes**: Sem acesso às operações de escrita - ❌ **Deletar eventos**: Sem permissão de exclusão - ❌ **Modificar equipe**: Não pode adicionar ou remover profissionais - ❌ **Alterar status**: Não pode mudar status de eventos ou alocações - ❌ **Acessar logística**: Toda seção de logística (carros, passageiros) está bloqueada - ❌ **Criar/editar escalas**: Visualiza mas não pode modificar ## Implementação Técnica ### Backend - **Constante**: `RoleAgendaViewer = "AGENDA_VIEWER"` em `internal/auth/service.go` - **Middlewares**: - `RequireWriteAccess()`: Bloqueia todas operações de escrita (POST, PUT, DELETE, PATCH) - `RequireLogisticsAccess()`: Bloqueia todo acesso ao grupo `/logistica` ### Frontend - **Enum**: `AGENDA_VIEWER` adicionado em `types.ts` - **Navbar**: Menu exibe apenas "Agenda" - **Dashboard**: Botão "Novo Evento" não aparece - **EventDetails**: Seção de logística não é renderizada - **EventScheduler**: Formulário de adicionar profissionais não aparece ## Endpoints Disponíveis ### Leitura (Permitido) ``` GET /api/agenda - Listar eventos GET /api/agenda/:id - Ver detalhes do evento GET /api/agenda/:id/professionals - Ver profissionais do evento GET /api/agenda/:id/available - Ver profissionais disponíveis GET /api/escalas - Ver escalas ``` ### Escrita (Bloqueado - 403 Forbidden) ``` POST /api/agenda - Criar evento PUT /api/agenda/:id - Editar evento DELETE /api/agenda/:id - Deletar evento POST /api/agenda/:id/professionals - Adicionar profissional PATCH /api/agenda/:id/status - Atualizar status ...etc ``` ### Logística (Bloqueado - 403 Forbidden) ``` GET /api/logistica/* - Toda rota de logística POST /api/logistica/* PUT /api/logistica/* DELETE /api/logistica/* ``` ## Caso de Uso Esta role é ideal para: - Coordenadores que precisam acompanhar a agenda - Supervisores que monitoram eventos - Equipe de suporte que precisa consultar informações - Qualquer pessoa interna que necessite visibilidade sem poder alterar dados ## Criação de Usuário Para criar um usuário com essa role: ```json POST /api/auth/register { "email": "viewer@photum.com", "senha": "senha_segura", "role": "AGENDA_VIEWER", "nome": "Nome do Visualizador", "telefone": "+55 11 99999-9999", "tipo_profissional": "" } ``` **Nota**: Como é um usuário interno da Photum, não precisa criar perfil de profissional ou cliente. ## Testes ### Teste 1: Login e Navegação 1. Fazer login com usuário AGENDA_VIEWER 2. Verificar que apenas "Agenda" aparece no menu 3. Confirmar que não há botão "Novo Evento" ### Teste 2: Visualização 1. Acessar a lista de eventos 2. Clicar em um evento para ver detalhes 3. Verificar que todos os detalhes são exibidos 4. Confirmar que seção de logística não aparece ### Teste 3: Tentativa de Modificação (deve falhar) 1. Tentar fazer requisição POST/PUT/DELETE para `/api/agenda` 2. Deve retornar `403 Forbidden` com mensagem "você não tem permissão para modificar dados" ### Teste 4: Bloqueio de Logística 1. Tentar acessar `/api/logistica/carros` 2. Deve retornar `403 Forbidden` com mensagem "você não tem permissão para acessar logística" ## Mensagens de Erro - **Tentativa de escrita**: `"você não tem permissão para modificar dados"` - **Tentativa de acesso à logística**: `"você não tem permissão para acessar logística"` - **Token inválido**: `"invalid token"` - **Sem autenticação**: `"authorization header required"`