{"openapi":"3.0.0","info":{"title":"D-Reis Coworking API","version":"1.0.0","description":"API aberta para integração com o sistema de coworking."},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"paths":{"/api/audit/login":{"post":{"tags":["Audit"],"summary":"Registra log de login (auditoria)","description":"Requer autenticação (bearer). Registra LOGIN_SUCCESS no audit_logs.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK"},"401":{"description":"Unauthorized"}}}},"/api/auth/forgot-password":{"post":{"tags":["Auth"],"summary":"Solicita redefinição de senha (custom, via SendPulse)","description":"Gera token e envia e-mail via SendPulse. Responde sempre OK para evitar enumeração.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string"}},"required":["email"]}}}},"responses":{"200":{"description":"OK"}}}},"/api/auth/reset-password":{"post":{"tags":["Auth"],"summary":"Redefine senha (custom, via token)","description":"Usa token gerado por /api/auth/forgot-password e atualiza senha via Supabase Admin API.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string"},"newPassword":{"type":"string"}},"required":["token","newPassword"]}}}},"responses":{"200":{"description":"OK"},"400":{"description":"Token inválido/expirado"}}}},"/api/availability/space":{"get":{"tags":["Availability"],"summary":"Retorna ocupação (reservas + bloqueios) de um espaço em um intervalo","description":"Endpoint para cumprir RF31 (visualização antecipada de horários ocupados) sem expor dados pessoais.\nRequer autenticação. Retorna apenas horários/status (sem user_id).\n","security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"spaceId","required":true,"schema":{"type":"integer","minimum":1}},{"in":"query","name":"start","required":true,"schema":{"type":"string"},"description":"ISO datetime (inclusive)"},{"in":"query","name":"end","required":true,"schema":{"type":"string"},"description":"ISO datetime (exclusive)"}],"responses":{"200":{"description":"Ocupação do espaço"},"400":{"description":"Parâmetros inválidos"},"401":{"description":"Unauthorized"},"404":{"description":"Espaço não encontrado"}}}},"/api/blackouts/import":{"post":{"tags":["Blackouts"],"summary":"Importa bloqueios (feriados) a partir de um template","description":"Requer usuário autenticado com role ROOT.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["templateId","year","locationId"],"properties":{"templateId":{"type":"string","example":"brazil-holidays"},"year":{"type":"integer","minimum":2020,"maximum":2100,"example":2026},"locationId":{"type":"integer","minimum":1,"example":1}}}}}},"responses":{"200":{"description":"Importação concluída"},"400":{"description":"Erro de validação"},"401":{"description":"Não autenticado"},"403":{"description":"Acesso negado"},"404":{"description":"Template não encontrado"}}}},"/api/blackouts/templates/{id}":{"get":{"tags":["Blackouts"],"summary":"Pré-visualiza um template de bloqueios (feriados)","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"query","name":"year","required":false,"schema":{"type":"integer","minimum":2020,"maximum":2100}}],"responses":{"200":{"description":"Preview do template"},"400":{"description":"Ano inválido"},"404":{"description":"Template não encontrado"}}}},"/api/blackouts/templates":{"get":{"tags":["Blackouts"],"summary":"Lista templates de bloqueios (feriados)","responses":{"200":{"description":"Lista de templates"}}}},"/api/contact":{"post":{"tags":["Contact"],"summary":"Envia mensagem de contato","description":"Envia e-mails via SendPulse. Se o usuário estiver autenticado, registra uma notificação interna.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","email","message"],"properties":{"name":{"type":"string","example":"Maria Silva"},"email":{"type":"string","format":"email","example":"maria@empresa.com"},"phone":{"type":"string","example":"71 99999-9999"},"subject":{"type":"string","example":"Dúvida sobre reservas"},"message":{"type":"string","example":"Olá, gostaria de saber como funciona o fluxo de aprovação."}}}}}},"responses":{"200":{"description":"Enviado"},"400":{"description":"JSON inválido ou campos obrigatórios ausentes"},"502":{"description":"Falha ao enviar e-mail"}}}},"/api/geocode":{"get":{"tags":["Geocode"],"summary":"Busca endereços (geocoding)","description":"Proxy simples para Nominatim (OpenStreetMap).","parameters":[{"in":"query","name":"q","required":true,"schema":{"type":"string"},"description":"Texto do endereço (ex. \"Av Paulista 1000, SP\")"}],"responses":{"200":{"description":"Lista de sugestões de endereço"},"502":{"description":"Falha ao consultar o provedor"}}}},"/api/notifications/queue":{"post":{"tags":["Notifications"],"summary":"Enfileira notificações de reserva (e-mail + inbox)","description":"Requer autenticação. Usuário precisa ser dono da reserva ou ter role ROOT/MANAGER/ASSISTANT.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["bookingId","type"],"properties":{"bookingId":{"type":"integer","example":123},"type":{"type":"string","enum":["CONFIRMATION","APPROVED","REJECTED"]}}}}}},"responses":{"200":{"description":"OK"},"400":{"description":"Erro de validação/registro"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Reserva ou e-mail não encontrados"}}}},"/api/notifications/send":{"post":{"tags":["Notifications"],"summary":"Processa fila de notificações pendentes (outbox)","description":"Requer role ROOT ou MANAGER. Útil para jobs/cron dispararem envio de e-mails.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK"},"400":{"description":"Falha ao processar"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"}}}},"/api/notifications/welcome":{"post":{"tags":["Notifications"],"summary":"Dispara e-mail de boas-vindas","description":"Pode ser chamado com autenticação (cookie/session ou Bearer) para o usuário atual.\nAlternativamente, aceita `userId` no body (uuid) para disparo pós-signup em janela curta.\n","security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"userId":{"type":"string","format":"uuid"}}}}}},"responses":{"200":{"description":"OK"},"400":{"description":"Erro ao registrar notificação"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden (janela expirada ou sem permissão)"},"404":{"description":"Perfil não encontrado"}}}},"/api/ping":{"get":{"summary":"Verifica disponibilidade da API","responses":{"200":{"description":"API disponível"}}}},"/api/reports/export":{"get":{"tags":["Reports"],"summary":"Exporta reservas (CSV/XLSX)","description":"Requer role ROOT ou MANAGER.","security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"start","required":false,"schema":{"type":"string"},"description":"ISO datetime (filtra start_at >= start)"},{"in":"query","name":"end","required":false,"schema":{"type":"string"},"description":"ISO datetime (filtra start_at <= end)"},{"in":"query","name":"format","required":false,"schema":{"type":"string","enum":["xlsx","csv"],"default":"xlsx"}}],"responses":{"200":{"description":"Arquivo gerado (download)"},"400":{"description":"Erro de consulta"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"}}}},"/api/validate-registration":{"get":{"tags":["Validation"],"summary":"Valida número de registro por órgão/perfil","description":"Usado para validar registro por órgão/perfil (formato, whitelist ou webhook) e domínios internos (INTERNAL).","security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"regulatorOrgId","required":false,"schema":{"type":"integer","minimum":1}},{"in":"query","name":"registrationNumber","required":false,"schema":{"type":"string"}},{"in":"query","name":"email","required":false,"schema":{"type":"string"}},{"in":"query","name":"profileType","required":true,"schema":{"type":"string","enum":["PROFESSIONAL","STUDENT","INTERNAL","PUBLIC","SOCIETY"]}}],"responses":{"200":{"description":"Resultado da validação"},"400":{"description":"Erro ao consultar regra"},"401":{"description":"Unauthorized"}}}}},"tags":[],"servers":[{"url":"https://www.dgovcoworking.dreissoftware.com","description":"Ambiente atual"}]}