Code Monkey home page Code Monkey logo

ulisesgascon / simple-api-rest-with-firebase-and-imbd Goto Github PK

View Code? Open in Web Editor NEW
9.0 2.0 4.0 252 KB

El objetivo de este repositorio es mostrar cómo desarrollar una API Rest sencilla usando Firebase como base de datos y enriqueciendo los datos con OMBD Este script permite al usuario introducir el nombre completo o solo parte de la película que queramos y Nodejs se encargará de buscar todos los detalles.

Home Page: https://opensource.ulisesgascon.com/moviefire

License: Apache License 2.0

CSS 1.59% JavaScript 88.22% Pug 10.20%
api-rest firebase learning-by-doing nodejs spanish

simple-api-rest-with-firebase-and-imbd's Introduction

⚠️ This repository is not longer maintained ⚠️

Simple API REST con Firebase y OMBD

Este script está diseñado como contenido académico para el curso de Node.js de Fictizia.

El objetivo de este repositorio es mostrar cómo desarrollar una API Rest sencilla usando Firebase como base de datos y enriqueciendo los datos con OMBD

Este script permite al usuario introducir el nombre completo o solo parte de la película que queramos y Nodejs se encargará de buscar todos los detalles (Nombre completo, director, actores, países, argumento, poster, etc...) y actualizar la base de datos (Firebase) con esta información.

El script funciona usando un API Rest, lo que nos permite gestionar el contenido independientemente de la interfaz. En este script ya se incluye un cliente listo para que gestionemos todo desde un entorno visual (usando Bootstrap).

Agradecimientos

La parte front del proyecto se basa en la evolución del repositorio de Arvind Ravulavaru, The Jackal of Javascript. Podéis leer el artículo completo en su blog.

Para el enriquecimiento de datos con la información de las películas, utilizamos OMBD, pero a través de la librería de Misterhat

Para la gestión de los errores, he utilizado Crier.

Dependencias:

v2.0.0 - (Actual)

v1.0.0

Instalar dependencias

npm install

Front

Por defecto al desplegar nuestro servidor Express renderiza una página que nos permite interactuar con el API sin salirnos del entorno visual.

Interfaz

Además de la lista de las películas presentes en Firebase, que se actualiza en tiempo real gracias al uso de websockets (Nodejs < -(Pillars)-> Cliente directo <- (Web Sockets) Firebase <-(API)-> Nodejs). Podemos ver los detalles de cada película en un Modal.

Interfaz detalles

Además se incluye la opción de manejar el API desde la consola del navegador usando la función llamarAPI

// Hackers ID: tt0113243

// Cambiar el nombre de Hackers en la lista (método PUT, datos {nombre: "lo que sea"})
llamarAPI ("PUT", "tt0113243", "lo que sea" );

// Borrar Hackers
llamarAPI ("DELETE", "tt0113243");

// Añadir Hackers
llamarAPI ("POST", "" ,"Hackers");

Rutas API

Imaginemos que nuestro script está funcionando en localhost bajo el puerto 3000.

Headers CORS

El CORS está habilitado exclusivamente en la ruta del API. Gracias al sistema de enrutado que incorpora pillars, por tanto se pueden hacer peticiones a nuestra API desde otros dominios.

// CORS
var rutaApiPeliculas = new Route({
        id: "peliculas",
        path: "/api/peliculas/*:path",
        cors: true
    },

Rutas Front

Rutas API

Configuración en Firebase

Nota: Existe una nueva versión de Firebase, estoy trabajando en la migración. Más detalles

Este script está pensado para utilizar un Token en la escritura de datos en Firebase. La lectura de los datos no tiene restricciones. Es importante definir las reglas de seguridad de firebase de una manera compatible.

myFirebaseRef.authWithCustomToken(config.token, function(error, authData) {
    if (error) {
        logger.error("Error al guardar los datos en Firebase (relacionado con Token).", {
            datos: error
        });
    } else {
        logger.info("Autentificación (via Token) lograda con exito.", {
            datos: authData
        });
    }
});

Además se recomienda hacer un indexado a la ruta "details/imbID" que es la que se usa en el front para cargar los detalles de las películas.

{
  "rules": {
    ".read": true,
    ".write": true,
    "nodemovies": {
      ".indexOn": ["details/imdbID"],
      ".read": true,
      ".write": "auth != null && auth.isAdmin == true"
    }
  }
}

Configuración en Node

Puerto e IP

El script está listo para funcionar en c9.io, si desea cambiarlo lo más sencillo es convertir process.env.PORT en 3000 u otro puerto y process.env.IP en "localhost". Este ajuste solo es necesario en server.js

Token y rutas

Por defecto el repositorio incorpora un archivo config.js vacio. Es necesario meter los datos correspondientes para que funcione. Es recomendable que la propiedad token sea una variable del entorno, sobretodo en entornos de producción.

Este ajuste solo es necesario en los archivos config.js (rutas y token)

var config = {
  token: "",
  firebaseApp: "",
  firebaseAppRuta: ""
};

y publico/js/index.js (solo rutas)

var myFBAdress = "";
var serverAdress = ""; // .../api/peliculas/

Notas

El script descarga en publico/img/ todos los posters de las películas. Y solo se utilizan esas imágenes o black.jpg en su defecto. Ya que la url original provoca un error 503 al solicitarlas desde un dominio diferente (en localhost funcionan igualmente).

// Guardar los posters (Método POST)
if (pelicula.poster) {
    pelicula.posterSolution = pelicula.imdb.id + ".jpg";
    var file = fs.createWriteStream('./publico/img/' + pelicula.imdbID + '.jpg');
    var request = http.get(pelicula.poster, function(response) {
        response.pipe(file);
        logger.warn("Poster de la pelicula " + pelicula.imdb.id + " guardado en /publico/img/ como " + pelicula.imdbID + ".jpg");
    }).on('error', function(e) {
        pelicula.posterSolution = false;
        logger.error("Poster de la película " + pelicula.imdb.id + " no se pudo guardar.", {
            datos: e
        });
    });
} else {
    pelicula.posterSolution = false;
    logger.error("La película " + pelicula.imdb.id + " no tiene poster asociado.");
}

y elimina los posters cuando ya no son necesarios.

// Elimina los posters (Método DELETE)
fs.unlink('./publico/img/' + req.params.id + '.jpg', function(err) {
    if (err) {
        if (err.errno == 34) {
            logger.error("Error al borrar la imagen /publico/img/" + req.params.id + ".jpg. La imagen no existe", {
                datos: err
            });
        } else {
            logger.error("Error al borrar la imagen /publico/img/" + req.params.id + ".jpg", {
                datos: err
            });
        }
    } else {
        logger.info("./publico/img/" + req.params.id + ".jpg - eliminado con exito");
    }
});

simple-api-rest-with-firebase-and-imbd's People

Contributors

ulisesgascon avatar

Stargazers

Roman avatar Yan_Gabriel avatar Rubén Afonso avatar Jean Paul Mosquera avatar David Orozco avatar Indrajith Bandara avatar Sebastián Cabanas avatar Chelo Quilón avatar Eduardo García Sanz avatar Aitana Gallego Martín avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.