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"
}

GET/api/doctors

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

GET
/api/doctors
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" }
}

POST/api/doctors

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

POST
/api/doctors
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"
  }
}

GET/api/doctors/:id

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

GET
/api/doctors/:id
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"
  }
}

PATCH/api/doctors/:id

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

PATCH
/api/doctors/:id
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"
  }
}

POST/api/doctors/:id/sync

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

POST
/api/doctors/:id/sync
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"
  }
}

DELETE/api/doctors/:id/sync

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

DELETE
/api/doctors/:id/sync
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) })

APIs Relacionadas

Was this page helpful?