Hablando de API’s (Parte 2)

Standard

Hola de nuevo, ¿cómo están?

Vamos a retomar el tema de las API’s. Como quedamos la entrega anterior, vamos a empezar a desarrollar una API REST, esto para que nos quede un poco más claro todo este tema. Desarrollaremos nuestra API sobre el tema medico, con la cual podremos ofrecer a un profesional de la salud un servicio donde pueda registrar a sus pacientes, llevar a cabo una consulta y que pueda agendar dichas consultas. Esto con el fin de que pueda tener un registro de sus pacientes con información básica; así como también un historial por cada paciente de los hallazgos en sus consultas y los temas que se trataron en ella. Como ya les había mencionado, para el desarrollo de nuestra API utilizaremos Ruby on Rails en su versión 5. Sin mas que decir, empecemos nuestro desarrollo.

Lo primero que haremos sera crear un nuevo proyecto en Rails, especificando que utilizaremos una base de datos mysql, al cual yo nombrare como healthcareapi

rails new healthcareapi -d mysql --api

Con esto tendremos nuestra configuración inicial de gemas. Ahora procederemos a crear nuestra base de datos. Para esto primero ocupamos modificar nuestro archivo database.yml para especificar los datos de conexión a nuestro servidor de base de datos.

  • username
  • password
  • host

Después correremos el comando:

rails db:create

Ahora que tenemos creada y con la configuración inicial nuestra aplicación, empezaremos a crear nuestros modelos. Como modelos iniciales tomaremos los siguientes:

Modelo Descripción Propiedades
Patients Aquí almacenaremos todos los pacientes que se ingresen al sistema
  • id
  • name
  • age
  • gender
  • address
  • city
  • state_id
Scheduled Appoiments Este modelo nos servirá como agenda de citas con dia y hora agendada
  • id
  • patient_id
  • doctor_id
  • scheduled_day
  • scheduled_hour
Medical Appoiment Con este modelo nos aseguraremos de llevar un historial del paciente. Cada consulta realizada por el medico, nos deberá de generar un registro en este modelo
  • id
  • patient_id
  • doctor_id
  • appoiment_review
  • appoiment_results
  • scheduled_appoiment_id

Por el momento nos enfocaremos en crear estas entidades (cuando descarguen el proyecto se encontraran con una migración inicial que corresponde a los países y estados conocidos de cada pais). Para generar los modelos usaremos los comandos de rails (al utilizar :references le indicamos a rails que al generar la migración ese campo es una entidad relacionada al modelo que estamos creando, en este caso con el modelo de State). A los modelos de State y Country no consideramos agregar su migración dado que ya los agregue por default al proyecto con sus seeds.

rails generate model Patient name:string age:integer gender:integer address:string city:string state:references

o

rails g model Patient name:string age:integer gender:integer address:string city:string state:references
rails g model State --skip-migration
rails g model Country --skip-migration
rails g model Patient name:string age:integer gender:integer address:string city:string state:references
rails g model ScheduledAppoiment patient:references scheduled_day:date scheduled_hour:time
rails g model MedicalAppoiment patient:references appoiment_review:text appoiment_indications:text scheduled_appoiment:references
rails db:migrate

Teniendo nuestros modelos iniciales, podemos empezar a desarrollar los servicios que ofreceremos para el manejo de la información. Como podemos observar, por ahora son solo catálogos para dar de alta pacientes, citas e información de la consulta.

Lo siguiente que haremos, sera definir las rutas con la cual nuestros clientes podrán hacer uso de la API para desarrollar sus aplicaciones. Nuestra API debe responder por default en formato JSON y haremos uso de un namespace al que llamaremos api y un modulo que llamaremos v1. Nuestro modulo v1 nos sirve para especificar que estos servicios son para la version 1 de nuestros servicios api. Junto con esto hemos definido los resources para utilizar en nuestra api, que equivaldrían a los controladores que atenderán las petición (los cuales aun no hemos creado)

Rails.application.routes.draw do
  namespace :api, :defaults => { :format => :json } do
    scope module: :v1 do
      resources :patients
      resources :scheduled_appoiments
      resources :medical_appoiments
    end
  end
end

Si ejecutamos el comando rake routes sobre nuestro proyecto nos debería de arrojar algo similar a lo siguiente:

rutas api

rutas api

Ahora necesitaremos generar nuestros controladores para que atiendan las peticiones que estarán llegando a nuestra API, lo cual haremos de la siguiente manera (dado que hemos especificado un namespace y un module, la creación del controlador difiere un poco de lo acostumbrado):

rails g controller api/v1/patients
rails g controller api/v1/scheduled_appoiments
rails g controller api/v1/medical_appoiments

Solo agregaremos por esta entrega el método index para verificar que nuestro componente este respondiendo:

# controllers/api/v1/patients_controller.rb
class Api::V1::PatientsController < ApplicationController
  def index
    patients = Patient.all
 
    render json: patients
  end
end
 
# controllers/api/v1/medical_appoiments_controller.rb
class Api::V1::MedicalAppoimentsController < ApplicationController
  def index
    medical_appoiments = MedicalAppoiment.all
 
    render json: medical_appoiments
  end
end
 
# controllers/api/v1/scheduled_appoiments_controller.rb
class Api::V1::ScheduledAppoimentsController < ApplicationController
  def index
    scheduled_appoiments = ScheduledAppoiment.all
 
    render json: scheduled_appoiments
  end
end

Ahora agregaremos las seed para cargar los datos iniciales y que puedan validar que nuestro servicio de paciente funciona.

require File.expand_path('../countries_states.rb', __FILE__)
Patient.create(name:'Paciente1', age:18, gender:1, address:'direccion paciente1', city:'Culiacan', state: State.find(2125))
Patient.create(name:'Paciente2', age:19, gender:2, address:'direccion paciente2', city:'Culiacan', state: State.find(2125))
Patient.create(name:'Paciente3', age:20, gender:1, address:'direccion paciente3', city:'Culiacan', state: State.find(2125))

Si consultamos nuestro servicio de api/patients/ nos deberia de devolver un listado de los pacientes que registramos en la seed.
funcionamiento

Por el momento la dejaremos aquí. Espero les guste y continuemos realizando nuestra api. En la siguiente entrega buscaremos agregar un poco de seguridad, e ir desarrollando el resto de los servicios que necesitaremos.

Que tengan un buen fin de semana!

p.s: link del repositorio de github
HealthCareApi

One thought on “Hablando de API’s (Parte 2)

  1. Sandra

    Enhorabuena por tu artículo! Me ha servido de mucha ayuda pero me preocupa que puedan acceder a mis datos continuamente. Por eso yo aconsejo eliminar tu rastro para evitar que las grandes compañias te tengan en su base de datos y eliminen tu privacidad

Leave a Reply

Your email address will not be published. Required fields are marked *