Buscador Público
1. Definición y Propósito
Permite a pacientes encontrar profesionales de la salud y sedes filtrando por geografía, especialidad y seguro, aplicando Validación Triple para resultados veraces.
2. Lógica Visual y de Procesos
2.1 Board Miro (referencia visual)
2.2 Flujo Lógico Canonico
Resumen textual (fallback)
- Entrada: texto libre + filtros (área médica, especialidad, seguro, modalidad, rango geográfico, disponibilidad).
- Aplica Validación Triple si se selecciona seguro: excluye combinaciones sin convenio/acreditación.
- Orden por distancia (default) con opción rating/relevancia.
- Paginación server-side (page/page_size).
Evidencia visual
- Fuente canonica: diagrama Mermaid de esta seccion.
- Si UX adjunta board Miro, se agrega solo como complemento y no reemplaza este flujo contractual.
3. Actores y Permisos (RBAC)
| Actor | Permisos |
|---|---|
| Paciente (Guest/Logueado) | Puede buscar y ver resultados; si logueado, personaliza por seguros guardados. |
| Profesional de la Salud/Entidad de Salud | No accede al buscador público con privilegios especiales. |
| Admin | Puede ver métricas internas (no en este módulo). |
4. Reglas de Negocio (BR)
- BR-BUS-01: Si se indica
insurance_id, solo mostrar resultados con convenio institucional o acreditación del profesional de la salud vigente. - BR-BUS-02: Distancia calculada contra
lat/lngdel usuario o ubicaciones frecuentes si está logueado. - BR-BUS-03: Paginación obligatoria;
page_sizemáximo 100. - BR-BUS-04: Sin texto libre, el filtro mínimo es geografía o especialidad.
- BR-BUS-05: Si no hay resultados con seguro, ofrecer fallback “particular” explícito.
- BR-BUS-06: Permitir filtro
area_id(área médica) para casos como Infantil, Salud mental, etc.; si se envía, debe filtrar por especialidades asociadas enarea_taxonomy. - BR-BUS-07: Filtrar por
modality(presencial, domicilio, teleconsulta) y reflejarlo en resultados. - BR-BUS-08: Flag
urgency=trueprioriza entidades con urgencias/24h y próximos horarios disponibles (slot más cercano). - BR-BUS-09: Filtro
availability(hoy/mañana) requiere consultaraffiliations.scheduley/o slots publicados.
5. Endpoints (contrato inicial)
| Recurso | Método | Descripción | Roles |
|---|---|---|---|
/api/v1/search/entities | GET | Busca sedes por filtros (geo, área, especialidad, modalidad, seguro, disponibilidad, urgencia). | Público |
/api/v1/search/doctors | GET | Busca profesionales de la salud y su sede principal para resultados (geo, área, especialidad, modalidad, seguro, disponibilidad, urgencia). | Público |
Ver detalles y parámetros en Swagger/OpenAPI (/swagger.html y /openapi.yaml).
6. Resultados y Ordenamiento
- Orden default: distancia; alternativos: rating, relevancia.
- Campos mínimos por item: nombre, tipo (CLINIC/LAB/PHARMACY), distancia_km, rating, área/especialidades, modalidad (presencial/domicilio/tele), seguros soportados, próxima disponibilidad (slot), dirección, flag 24h/urgencias.
Implementación Backend (Go, DDD + Clean Architecture):
- Handlers en
interfaces/http/searchmapean DTOs a use casesSearchEntities,SearchDoctorsenapplication/search. - Repositorios
SearchRepo(PostGIS/FTS) yCacheReposon interfaces; implementaciones eninfrastructure/persistenceyinfrastructure/cache(Redis). - DTOs expuestos en OpenAPI son de interfaz; modelos de dominio no arrastran detalles de persistencia.
- Nomenclatura completa: ver
arquitectura-y-despliegue.md§7.1.
7. Métricas y Observabilidad
- Tiempo de respuesta P95 < 300ms.
- Tasa de resultados vacíos por filtro (alertar si >10%).
- Cache hit ratio en Redis para consultas repetidas.
- Trazas con
trace_id,q,lat,lng,specialty_id,insurance_id.
8. Casos de Borde y Manejo de Errores
- Sin filtros mínimos (geo/especialidad) → 422 “Filtros insuficientes”.
- Seguro sin convenios → mostrar fallback “particular” y registro de evento.
- Coordenadas fuera de rango válido → 400.
- Cache miss prolongado → degradar a búsqueda directa en DB y alarmar si latencia supera umbral.
9. Control de Abuso/Fraude
- Throttling de búsqueda pública por IP (ej. 60 req/min); captcha si hay scraping.
- Limitar
page_sizea 100; evitar deep paging (cap en page máx). - Sanitizar texto libre para prevenir inyección en FTS.
10. Checklist de QA / Testing
- Búsqueda con especialidad + seguro devuelve solo convenios válidos.
- Distancia ordena correctamente con lat/lng simulados.
- Texto libre + filtros combinados no superan 300ms P95 (con caché).
- Fallback a “particular” cuando no hay convenio.
- Throttling/captcha se dispara ante ráfagas.
- Filtro de área (ej. Infantil) restringe resultados a especialidades asociadas.
- Filtro
urgency=trueprioriza entidades con urgencias/24h y muestra próximo horario. - Filtro
modality=domiciliomuestra solo sedes/profesionales con esa modalidad. - Filtro
availability=hoydevuelve solo quien tiene slot hoy.
11. Requerimientos No Funcionales (NFR)
search_p95< 300ms; disponibilidad 99.9% lectura.- Cache hit >80% en queries repetidas.
- 429 en scraping; no debe impactar usuarios legítimos.
12. Variables de Entorno (Front)
VITE_API_BASE=https://api.example.com/api/v1VITE_SEARCH_MAX_RESULTS=100VITE_SEARCH_ENABLE_CACHE_BUST=false
13. Accesibilidad (A11y)
- Campos de búsqueda accesibles con teclado; foco visible.
- Resultados anunciados con
aria-liveal terminar la búsqueda. - Filtros toggles/select con labels y
aria-expanded.
14. Métricas de Producto (Funnel)
- Búsqueda → Resultados → Click en resultado → Inicio de cita.
- CTR por especialidad/seguro; tasa de “sin resultados”.
15. Enlaces y Trazabilidad
- Swagger UI:
/swagger.html(acceso desde/swagger) y contrato YAML en/openapi.yaml. - Relacionados:
perfil-profesional-publico.md,mapa-busqueda.md,favoritos.md,agenda-citas.md(usa resultados),admin-catalogos.md(origen de filtros),esquema-de-base-de-datos.md(indices FTS/GIST),arquitectura-y-seguridad.md(observabilidad search).
16. Dependencias
health_entities.location(GIST),doctor_profiles.metadata(FTS),insurance_agreements,doctor_accreditations.