≡ Menú

Cómo ampliar una API de LoopBack

Ahora vamos a ampliar la API de nuestra aplicación, aunque en este momento solo lo haremos para demostrar el método, porque los modelos que tenemos actualmente, Sitios y Puestos no necesitan de ninguna ampliación.

Pero bueno, en LoopBack se llaman métodos remotos y agregan endpoints a la API. Vamos a editar el archivo /common/models/sitio.js que lo único que contiene es una función vacía.

'use strict';

module.exports = function(Puesto) {

};

Este archivo, lo vamos a editar para crear un nuevo endpoint llamado horario que nos dice, de acuerdo a la hora del día, si el sitio está cerrado o dando servicio.
Primero vamos a verificar las horas. Digamos que los sitios abren a las 08:00 y cierran a las 16:00.

'use strict';

module.exports =  function(sitio) {
  sitio.status = function(cb) {
    var actualDia = new Date();
    var actualHora = actualDia.getHours();
    var ABIERTO = 8;
    var CERRADO = 16;

    console.log('La hora actual es %d', actualHora);

    var response;
    if (actualHora > ABIERTO && actualHora < CERRADO) {
      response = 'Está abierto, pase usted.';
    } else {
      response = 'Está cerrado, por favor, regrese mañana de 8am a 4pm.';
    }
    cb(null, response);
  };

  sitio.remoteMethod(
    'status', {
      http: {
        path: '/status',
        verb: 'get',
      },
      description: 'Nos dice si el sitio está abierto o cerrado',
      returns: {
        arg: 'status',
        type: 'string',
      },
    }
  );
};

Con esto definimos el muy simple método remoto status que no toma ningún argumento y verifica la hora para regresar un JSON con el mensaje que corresponda de acuerdo al horario.
Más adelante, conforme se necesiten, crearemos más métodos remotos y sobre todo más útiles.

Verificando el método remoto

Pero mientras tanto, podemos probar el nuevo método remoto, desde la consola.

> $ http :3000/api/sitios/status
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Connection: keep-alive
Content-Length: 68
Content-Type: application/json; charset=utf-8
Date: Sun, 19 Feb 2017 00:25:55 GMT
ETag: W/"44-8UPwgjkH0yBbS6v9dzbIFw"
Vary: Origin, Accept-Encoding
X-Content-Type-Options: nosniff
X-Download-Options: noopen
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block

{
    "status": "Está cerrado, por favor, regrese mañana de 8am a 4pm."
}

 

Métodos remotos con argumentos

Ahora vamos a agregar un nuevo método remoto a nuestro modelo, en esta ocasión, solo queremos ver la dirección de un sitio, por lo proporcionamos el id del sitio como argumento.
Primero agregamos a nuestro archivo /common/models/sitio.js la función para obtener la dirección:

...
  sitio.getDireccion = function(sitioId, cb) {
    sitio.findById(sitioId, function(err, instance){
      var response = 'La dirección es ' + instance.direccion;
      cb(null, response);
      console.log(response)
    });
  };
...

Esta función acepta como argumentos el id del sitio y la retrollamada, y usa el primer argumento para la función findById, que podemos ver usa una instancia como argumento dentro de la función para enviar el objeto que se encuentre en la colección.

Luego definimos el endpoint, donde especificamos que tipo de argumentos acepta la API y que valores devuelve.

...
    'getDireccion', {
      http: {
        path: '/direccion', verb: 'get',
      },
      description: 'Devuelve la dirección de un sitio',
      accepts: {
        arg: 'id', 
        type: 'string', 
        http: {source: 'query'}
      },
      returns: {arg: 'direccion', type: 'string'},
    },
...

Lo que vemos aquí es la definición del endpoint y lo nuevo en este es la propiedad accepts que procesa el argumento, identificándolo completamente: su nombre, su tipo y su origine.
Ahora podemos llamar a este endpoint y ver los resultados.

$ http :3000/api/sitios/direccion?id=58a920b0bc35e1c8528e3747
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Connection: keep-alive
Content-Length: 57
Content-Type: application/json; charset=utf-8
Date: Sun, 19 Feb 2017 04:36:12 GMT
ETag: W/"39-nBEeF5ndu25EHtyBoNBCcQ"
Vary: Origin, Accept-Encoding
X-Content-Type-Options: nosniff
X-Download-Options: noopen
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block

{
    "direccion": "La dirección es Xicohtencatl 7, Tlaxcala"
}

Sobre el autor: Auditor Líder ISO 9000 | Desarrollo Web Full Stack | JavaScript · Angular · VueJS · EmberJS | WordPress Advocator | Programador Django/Python | Lector | Generación X | Soy de Tlaxcala