Saturday, August 9, 2014

Rutha Stack - Como crear un REST API con Rutha 0.2.0


Creando REST controllers con Rutha y HapiJS

HapiJS permite crear REST API siguiendo las tendencias actuales, asi adaptamos a HapiJS dentro del Rutha stack para que se asemeje a un Rails MVC.

Dentro de service/lib tenemos
  • controllers: Contiene los controllers utilizando el formato de HapiJS plugin.
  • hapi: Contiene el server de HapiJS y configuración de rutas y plugines
  • models: Rutha es similar a MEAN, utiliza MongoDB por medio de MongooseJS para modelar los datos.

Hapi Server

El server contiene los utilitarios esenciales que necesitas para mantener adecuadamente un servidor de aplicaciones web.

El modulo rutha-utils contiene un conjunto de utilidades.

Configuración

rutha-utils/config contiene una instancia de nconf, donde se asigna la ruta donde residen los diferentes archivos de configuración (ej. development.json, test.json, etc) en RuthaUtils.createConfig({ path: './config' }). Para leer una variable de configuración, usamos config.get('key:subkey').

Logs

rutha-utils/logger retorna una instancia de winston. Agregamos la configuración del logger y llamamos RuthaUtils.createLogger({ filename: '',  level: '' }).

Mongoose (NodeJS API para MongoDB)

rutha-utils/mongoose_client se encarga de conectarse a una instancia de MongoDB y de cargar todos los modelos encontrados, el model a su vez espera el siguiente patron:



Para crear una instancia:
RuthaUtils.createModels({ client: 'mongoose', connectionString: '',  models: '' });

Esta interfaz algo generica para en el futuro expandir a otros tipos de clientes.

Y mejor no seria un Hapi Plugin?

Considerando que necesitamos reusar la instancia de config, es mas factible y algo visual, a lo AngularJS, que el developer observe las instancias de config, logger y mongoose como se inyectan. Usando server.pack.app como un tipo de 'dependency injection' es util, nos permite que cada Rutha Stack plugin que quiera las instancias predeterminadas las use sin preocupaciones.

Registrando plugins

Hapi Plugins es un tipo de decoupling a nivel de modulos, llamados plugin. Es posible que un equipo, diversos programadores trabajen en diferentes modulos, y estos a su vez usen los modelos compartidos (shared models). Para agregar tal modulo al server en común, agregamos el plugin y cualquier opciones que requiera.

Cada plugin  obtendrá una ruta padre establecida, esta es 'api' para definir todas las rutas REST del service pertenecen al 'api'.

Adicionamos el plugin de HapiJS Lout para generar documentación del REST API. Es importante usarlo conjuntamente con HapiJS Joi, este ultimo decorar la documentación basado en el esquema de validación de cada ruta REST.

Estado del servidor (Health check)

Incluimos una ruta 'api/health' que es un tipo de patron muy comun. Simplemente retorna el texto OK.

Versiones

Cada plugin a su vez contiene sus versiones. Podemos tener dentro de users plugin, una carpeta v1, v2 y asi sucesivamente. En el index.js, asignamos las rutas que queremos el Hapi server publique.

De este modo, cada modulo mantiene las versiones requeridas para el funcionamiento adecuado del API.

Pruebas

Usamos Jasmine 2.0 en vez de HapiJS Lab. Como Rutha es un stack altamente pragmatico, Jasmine 2.0 nos permite enfocarnos en test y mocking a una velocidad increible.


No comments:

Post a Comment