Doctores
Los doctores son los profesionales medicos que atienden a los miembros del club. Esta API permite invitar doctores, gestionar sus perfiles, sincronizarlos con el sistema y consultar sus pacientes asignados.
El modelo de Doctor
- Name
id- Type
- string
- Description
Identificador unico del doctor.
- Name
firstName- Type
- string
- Description
Nombre del doctor.
- Name
lastName- Type
- string
- Description
Apellido del doctor.
- Name
email- Type
- string
- Description
Correo electronico del doctor.
- Name
specialty- Type
- string
- Description
Especialidad medica.
- Name
licenseNumber- Type
- string
- Description
Numero de matricula profesional.
- Name
phone- Type
- string
- Description
Telefono de contacto.
- Name
description- Type
- string
- Description
Descripcion o biografia profesional.
- Name
avatar- Type
- string
- Description
URL de la imagen de perfil.
- Name
status- Type
- DoctorStatus
- Description
Estado del doctor. Valores posibles:
- ACTIVE: Activo y disponible para consultas
- INACTIVE: Desactivado temporalmente
- INVITED: Invitacion enviada, pendiente de registro
- Name
synced- Type
- boolean
- Description
Indica si el doctor esta sincronizado con el sistema.
- Name
availableTimes- Type
- array
- Description
Horarios de disponibilidad del doctor.
- Name
patients- Type
- array
- Description
IDs de pacientes asignados (derivados de turnos/consultas).
- Name
createdAt- Type
- timestamp
- Description
Fecha de creacion del registro.
- Name
updatedAt- Type
- timestamp
- Description
Ultima actualizacion del registro.
Ejemplo de doctor
{
"id": "doc_01HQ8ABC123",
"firstName": "Carlos",
"lastName": "Martinez",
"email": "carlos.martinez@clinica.com",
"specialty": "Medicina Cannabica",
"licenseNumber": "MN-45678",
"phone": "+541145678901",
"description": "Especialista en tratamientos con cannabis medicinal con 10 anos de experiencia.",
"avatar": "https://storage.cannahub.tech/avatars/doc-carlos.jpg",
"status": "ACTIVE",
"synced": true,
"availableTimes": [
{ "day": "monday", "from": "09:00", "to": "13:00" },
{ "day": "wednesday", "from": "14:00", "to": "18:00" },
{ "day": "friday", "from": "09:00", "to": "12:00" }
],
"patients": [
"usr_01HQ8XYZABC123",
"usr_01HQ8XYZDEF456"
],
"createdAt": "2024-01-10T08:00:00Z",
"updatedAt": "2024-06-15T11:30:00Z"
}
Listar doctores
Retorna una lista paginada de doctores de la organizacion. Soporta filtros por busqueda, estado y estado de sincronizacion.
Parametros de consulta
- Name
search- Type
- string
- Description
Busqueda por nombre, apellido o email.
- Name
status- Type
- DoctorStatus
- Description
Filtrar por estado:
ACTIVE,INACTIVE,INVITED.
- Name
synced- Type
- boolean
- Description
Filtrar por estado de sincronizacion.
- Name
page- Type
- number
- Description
Numero de pagina (default: 1).
- Name
limit- Type
- number
- Description
Items por pagina (default: 20).
Request
curl -G https://api.cannahub.tech/api/doctors \
-H "Authorization: Bearer {token}" \
-d status=ACTIVE \
-d synced=true
Response
{
"doctors": [
{
"id": "doc_01HQ8ABC123",
"firstName": "Carlos",
"lastName": "Martinez",
"email": "carlos.martinez@clinica.com",
"specialty": "Medicina Cannabica",
"licenseNumber": "MN-45678",
"phone": "+541145678901",
"avatar": "https://storage.cannahub.tech/avatars/doc-carlos.jpg",
"status": "ACTIVE",
"synced": true,
"patients": ["usr_01HQ8XYZABC123", "usr_01HQ8XYZDEF456"],
"createdAt": "2024-01-10T08:00:00Z",
"updatedAt": "2024-06-15T11:30:00Z"
}
],
"count": 1,
"filters": { "status": "ACTIVE", "synced": "true" }
}
Invitar / crear doctor
Crea un nuevo doctor en el sistema con estado INVITED. Se utiliza para enviar una invitacion al profesional medico para que complete su registro.
Campos requeridos
- Name
firstName- Type
- string
- Description
Nombre del doctor.
- Name
lastName- Type
- string
- Description
Apellido del doctor.
- Name
email- Type
- string
- Description
Correo electronico del doctor.
Campos opcionales
- Name
specialty- Type
- string
- Description
Especialidad medica.
- Name
licenseNumber- Type
- string
- Description
Numero de matricula profesional.
- Name
phone- Type
- string
- Description
Telefono de contacto.
- Name
description- Type
- string
- Description
Descripcion o biografia profesional.
Request
curl -X POST https://api.cannahub.tech/api/doctors \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"firstName": "Laura",
"lastName": "Fernandez",
"email": "laura.fernandez@clinica.com",
"specialty": "Neurologia",
"licenseNumber": "MN-78901"
}'
Response (201)
{
"doctor": {
"id": "doc_01HQ8DEF456",
"firstName": "Laura",
"lastName": "Fernandez",
"email": "laura.fernandez@clinica.com",
"specialty": "Neurologia",
"licenseNumber": "MN-78901",
"phone": null,
"description": null,
"avatar": null,
"status": "INVITED",
"synced": false,
"availableTimes": [],
"patients": [],
"createdAt": "2024-07-01T10:00:00Z",
"updatedAt": "2024-07-01T10:00:00Z"
}
}
Obtener doctor
Retorna los detalles completos de un doctor, incluyendo la lista de pacientes derivada de los turnos y consultas registrados.
Parametros de ruta
- Name
id- Type
- string
- Description
ID del doctor.
Request
curl https://api.cannahub.tech/api/doctors/doc_01HQ8ABC123 \
-H "Authorization: Bearer {token}"
Response
{
"doctor": {
"id": "doc_01HQ8ABC123",
"firstName": "Carlos",
"lastName": "Martinez",
"email": "carlos.martinez@clinica.com",
"specialty": "Medicina Cannabica",
"licenseNumber": "MN-45678",
"phone": "+541145678901",
"description": "Especialista en tratamientos con cannabis medicinal con 10 anos de experiencia.",
"avatar": "https://storage.cannahub.tech/avatars/doc-carlos.jpg",
"status": "ACTIVE",
"synced": true,
"availableTimes": [
{ "day": "monday", "from": "09:00", "to": "13:00" },
{ "day": "wednesday", "from": "14:00", "to": "18:00" }
],
"patients": [
"usr_01HQ8XYZABC123",
"usr_01HQ8XYZDEF456"
],
"createdAt": "2024-01-10T08:00:00Z",
"updatedAt": "2024-06-15T11:30:00Z"
}
}
Actualizar doctor
Actualiza el perfil de un doctor existente. Solo se modifican los campos enviados en el body.
Parametros de ruta
- Name
id- Type
- string
- Description
ID del doctor a actualizar.
Campos actualizables
- Name
firstName- Type
- string
- Description
Nombre del doctor.
- Name
lastName- Type
- string
- Description
Apellido del doctor.
- Name
specialty- Type
- string
- Description
Especialidad medica.
- Name
licenseNumber- Type
- string
- Description
Numero de matricula profesional.
- Name
phone- Type
- string
- Description
Telefono de contacto.
- Name
description- Type
- string
- Description
Descripcion o biografia profesional.
Request
curl -X PATCH https://api.cannahub.tech/api/doctors/doc_01HQ8ABC123 \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"specialty": "Medicina Cannabica y Dolor Cronico",
"phone": "+541198765432"
}'
Response
{
"doctor": {
"id": "doc_01HQ8ABC123",
"firstName": "Carlos",
"lastName": "Martinez",
"email": "carlos.martinez@clinica.com",
"specialty": "Medicina Cannabica y Dolor Cronico",
"licenseNumber": "MN-45678",
"phone": "+541198765432",
"status": "ACTIVE",
"synced": true,
"updatedAt": "2024-08-01T14:30:00Z"
}
}
Sincronizar doctor
Marca al doctor como sincronizado con el sistema. Esta operacion actualiza el campo synced a true, indicando que el doctor esta vinculado y verificado.
Parametros de ruta
- Name
id- Type
- string
- Description
ID del doctor a sincronizar.
Request
curl -X POST https://api.cannahub.tech/api/doctors/doc_01HQ8DEF456/sync \
-H "Authorization: Bearer {token}"
Response
{
"doctor": {
"id": "doc_01HQ8DEF456",
"firstName": "Laura",
"lastName": "Fernandez",
"email": "laura.fernandez@clinica.com",
"status": "ACTIVE",
"synced": true,
"updatedAt": "2024-08-05T09:00:00Z"
}
}
Desincronizar doctor
Elimina la sincronizacion del doctor con el sistema. Actualiza el campo synced a false. El doctor permanece en el sistema pero deja de estar vinculado.
Parametros de ruta
- Name
id- Type
- string
- Description
ID del doctor a desincronizar.
Request
curl -X DELETE https://api.cannahub.tech/api/doctors/doc_01HQ8DEF456/sync \
-H "Authorization: Bearer {token}"
Response
{
"doctor": {
"id": "doc_01HQ8DEF456",
"firstName": "Laura",
"lastName": "Fernandez",
"email": "laura.fernandez@clinica.com",
"status": "ACTIVE",
"synced": false,
"updatedAt": "2024-08-10T16:45:00Z"
}
}
React Query Hooks
Query Keys
// /features/Club/Doctors/hooks/keys.ts
export const doctorKeys = {
all: ['doctors'] as const,
lists: () => [...doctorKeys.all, 'list'] as const,
list: (filters?: DoctorFilters) => [...doctorKeys.lists(), filters] as const,
details: () => [...doctorKeys.all, 'detail'] as const,
detail: (id: string) => [...doctorKeys.details(), id] as const,
}
Queries
import { useDoctorsQuery, useDoctorQuery } from '@/features/Club/Doctors/hooks'
// Listar doctores con filtros opcionales
const { data, isLoading } = useDoctorsQuery({
status: 'ACTIVE',
synced: true,
search: 'carlos'
})
// Obtener un doctor por ID
const { data: doctor } = useDoctorQuery('doc_01HQ8ABC123')
Mutations
import {
useCreateDoctorMutation,
useUpdateDoctorMutation,
useSyncDoctorMutation,
useUnsyncDoctorMutation
} from '@/features/Club/Doctors/hooks'
// Invitar un nuevo doctor
const { mutate: createDoctor } = useCreateDoctorMutation()
createDoctor({
firstName: 'Laura',
lastName: 'Fernandez',
email: 'laura.fernandez@clinica.com',
specialty: 'Neurologia'
})
// Actualizar perfil del doctor
const { mutate: updateDoctor } = useUpdateDoctorMutation()
updateDoctor({
id: 'doc_01HQ8ABC123',
data: { specialty: 'Medicina Cannabica y Dolor Cronico' }
})
// Sincronizar doctor
const { mutate: syncDoctor } = useSyncDoctorMutation()
syncDoctor('doc_01HQ8DEF456')
// Desincronizar doctor
const { mutate: unsyncDoctor } = useUnsyncDoctorMutation()
unsyncDoctor('doc_01HQ8DEF456')
Invalidacion de cache
Todas las mutaciones invalidan automaticamente las queries relevantes:
// Despues de crear, actualizar, sync o unsync:
queryClient.invalidateQueries({ queryKey: doctorKeys.all })
queryClient.invalidateQueries({ queryKey: doctorKeys.detail(id) })