{"id":22352401,"url":"https://github.com/juandc/firebase-books-app","last_synced_at":"2025-10-13T04:33:19.396Z","repository":{"id":41799504,"uuid":"165122470","full_name":"juandc/firebase-books-app","owner":"juandc","description":"📘📕 Frontend y API Pública para un catálogo de libros ","archived":false,"fork":false,"pushed_at":"2023-01-09T11:30:20.000Z","size":3359,"stargazers_count":7,"open_issues_count":31,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-07-30T07:52:17.949Z","etag":null,"topics":["firebase","firebase-api","firebase-auth","firebase-cloud-functions","firebase-firestore","firestore","react-firebase"],"latest_commit_sha":null,"homepage":"https://platzi.com/blog/contruye-tu-api-publica-con-firebase-cloud-functions/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/juandc.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-01-10T19:58:46.000Z","updated_at":"2024-10-15T22:46:03.000Z","dependencies_parsed_at":"2023-02-08T10:17:03.471Z","dependency_job_id":null,"html_url":"https://github.com/juandc/firebase-books-app","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/juandc/firebase-books-app","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juandc%2Ffirebase-books-app","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juandc%2Ffirebase-books-app/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juandc%2Ffirebase-books-app/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juandc%2Ffirebase-books-app/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/juandc","download_url":"https://codeload.github.com/juandc/firebase-books-app/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juandc%2Ffirebase-books-app/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279013685,"owners_count":26085390,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-13T02:00:06.723Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["firebase","firebase-api","firebase-auth","firebase-cloud-functions","firebase-firestore","firestore","react-firebase"],"created_at":"2024-12-04T12:18:33.544Z","updated_at":"2025-10-13T04:33:19.369Z","avatar_url":"https://github.com/juandc.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Por qué construir tu API pública con Firebase Cloud Functions: ¡Integrate con otros servicios!\r\n\r\nVamos a construir una biblioteca. Una aplicación donde los usuarios pueden buscar, añadir y eliminar sus libros favoritos. El frontend ya está construido y se encarga de autenticar usuarios, mostrar la información de los libros y darle permisos a los usuarios de modificar sus publicaciones.\r\n\r\nNuestro trabajo en este tutorial es construir una API que le permita a otras aplicaciones consultar los últimos y mejores libros de nuestro catálogo utilizando las herramientas de Firebase Cloud Functions. Recuerda que puedes aprender a construir el frontend de tu aplicación con Firebase en el [Curso de Firebase para la Web](https://platzi.com/cursos/firebase-web) de Platzi.\r\n\r\n- DEMO de la API: [juandc-firebase-books-app.cloudfunctions.net/API_GET_BOOKS](https://us-central1-juandc-firebase-books-app.cloudfunctions.net/API_GET_BOOKS)\r\n- Repositorio de la aplicación (Frontend y API): [github.com/juandc/firebase-books-app](https://github.com/juandc/firebase-books-app)\r\n\r\n## Qué son las Cloud Functions HTTP\r\n\r\nLa plataforma de Firebase nos permite programar **Cloud Functions**: Cajitas de código que podemos ejecutar una y otra vez cuando se disparan algunos eventos de nuestras aplicaciones, por ejemplo:\r\n\r\n* Cuando registramos o eliminamos un usuario.\r\n* Si realizamos una compra o subimos una imagen.\r\n* Cuando emitimos una factura o modificamos la base de datos en un lugar específico.\r\n\r\nNo solo eso. También podemos construir aplicaciones basadas en microservicios utilizando APIs y aprovechando que las Cloud Functions de Firebase también pueden procesar eventos HTTP. Es decir, podemos ejecutar nuestras funciones cuándo el frontend o algún otro cliente/servicio hace peticiones a nuestras URLs en busca de contenido e información.\r\n\r\nRecuerda que las Cloud Functions nos ayudan a reaccionar para muchos otros tipos de eventos, por ejemplo, podemos detectar y bloquear contenido inapropiado cuando los usuarios suben imágenes a nuestra aplicación.\r\n\r\nUtilizar estas funciones para construir APIs es solo una de las muchas formas en que podemos construir aplicaciones ([Curso de Express.js](https://platzi.com/express)). Además, es un ejemplo perfecto de las muchas utilidades que conseguimos gracias a la plataforma de Firebase.\r\n\r\nRecuerda que puedes seguir este otro tutorial para crear un nuevo proyecto y crear tu API lo más rápido posible: [Crea una API con Firebase Cloud Functions](https://platzi.com/blog/crear-api-firebase-cloud-functions/). En este caso vamos a profundizar un poco más en cada etapa del proyecto. Te recomiendo leer ambos tutoriales. :wink:\r\n\r\n## Iniciar el proyecto con Firebase\r\n\r\nLa herramienta `firebase-tools` nos ayuda a crear un proyecto de Node.js asociándolo a alguno de nuestros proyectos en Firebase. Solo debemos ejecutar el siguiente comando y seguir las instrucciones:\r\n\r\n```bash\r\nnpm install -g firebase-tools\r\n```\r\n\r\nFirebase nos hará algunas preguntas sobre el código que queremos escribir, si queremos utilizar ESLint, TypeScript, entre otras. Elige la que más te guste.\r\n\r\nCuando las dependencias terminen de instalarse, vamos a ver que tenemos algunos nuevos archivos de configuración:\r\n\r\n![Dependencias Firebase](https://pbs.twimg.com/media/D-KbrxeWwAAhES9.png)\r\n\r\n\r\n\r\n\r\n\r\nEn este proyecto vamos a escribir todo nuestro código en el archivo `functions/index.js`. Sin embargo, también vamos a necesitar algunas configuraciones extra en el archivo `firebase.json` si queremos mejorar las rutas de nuestra API.\r\n\r\n## Respuestas simples de nuestra API\r\n\r\nAntes de conseguir los datos reales de nuestra base de datos, vamos a crear nuestra primera función HTTP para probar el funcionamiento de nuestra API con una respuesta muy simple en formato JSON:\r\n\r\n```js\r\nconst functions = require('firebase-functions');\r\n\r\n// Create and Deploy Your First Cloud Functions\r\n// https://firebase.google.com/docs/functions/write-firebase-functions\r\n\r\nexports.API_GET_BOOKS = functions.https.onRequest((request, response) =\u003e {\r\n  response.json({\r\n    message: 'Hello from Firebase!',\r\n  });\r\n});\r\n```\r\n\r\nRecuerda que debemos importar la librería `firebase-functions` (instalada por defecto cuando creamos el proyecto) y utilizarla para definir el comportamiento de nuestra API.\r\n\r\n## Primer Deploy\r\n\r\nPara probar que nuestra API funcione correctamente debemos pedirle a Firebase que suba nuestro proyecto con el siguiente comando:\r\n\r\n```bash\r\nfirebase deploy\r\n```\r\n\r\nMuy sencillo, ¿verdad? :fire:\r\n\r\nAhora podemos entrar a consola de Firebase y buscar la sección de _”Functions”_ para encontrar la información de nuestra nueva función y copiar la URL con la que podemos probar la primera versión de la API.\r\n\r\n![Firebase Functions](https://pbs.twimg.com/media/D-Kb0kNXkAAhRUf.jpg)\r\n\r\nSi todo sale bien podremos entrar a la URL que Firebase creó para nuestra API y vamos a obtener el siguiente resultado:\r\n\r\n```json\r\n{\r\n  \"message\": \"Hello from Firebase!\"\r\n}\r\n```\r\n\r\n## Configuración de firebase-admin\r\n\r\nAhora que nuestra API funciona, podemos traer los datos que guardamos en la base de datos de Firebase y devolverlos en formato JSON. Vamos instalar la librería `firebase-admin` que nos ayudará a obtener nuestros datos y devolverlos por la API.\r\n\r\n```bash\r\nnpm install --save firebase-admin\r\n```\r\n\r\nLo primero que debemos hacer es añadir la configuración básica de Firebase:\r\n\r\n```js\r\nconst functions = require('firebase-functions');\r\nconst firebase = require('firebase-admin');\r\nconst config = require('./firebase-config.json');\r\n\r\nfirebase.initializeApp({\r\n  credential: firebase.credential.cert(config),\r\n  databaseURL: 'https://\u003cURL_BASE_DE_DATOS\u003e.firebaseio.com',\r\n});\r\n```\r\n\r\nComo puedes ver, debemos descargar un archivo llamado `firebase.config.json` con la información secreta de nuestra base de datos. Para esto, debemos ir a la sección de `Configuración \u003e Cuentas de Servicio` y generar una nueva clave privada:\r\n\r\n![Firebase Config](https://pbs.twimg.com/media/D-Kb2T1W4AEGOgY.png)\r\n\r\n![Firebase SDK](https://pbs.twimg.com/media/D-Kb4U8X4AEULWs.png)\r\n\r\n## Utilizando datos reales en la API\r\n\r\nEs hora de utilizar `firebase-admin` para devolver los datos de nuestra aplicación, en este caso, la información de nuestros libros.\r\n\r\nLa aplicación de ejemplo para este tutorial utiliza **Firestore** como base de datos para guardar la información de los libros. Recuerda que cada aplicación es diferente; el código que vamos a necesitar para conseguir la información de la base de datos depende totalmente de la organización y la lógica de negocio.\r\n\r\nEl mejor lugar para aprender a crear aplicaciones web utilizando Firebase es el [Curso de Firebase Para Web](https://platzi.com/firebase-web) de Platzi :wink:.\r\n\r\nEn mi caso, este es el código que necesito para entregar la información de los libros:\r\n\r\n```js\r\nexports.API_GET_BOOKS = functions.https.onRequest((request, response) =\u003e {\r\nconst firestore = firebase.firestore();\r\nfirestore.settings({ timestampsInSnapshots: true });\r\n\r\nconst booksRef = firestore.collection('books');\r\n\r\nbooksRef.get()\r\n  .then(docs =\u003e {\r\n    const books = [];\r\n\r\n    docs.forEach(doc =\u003e books.push({\r\n      id: doc.id,\r\n      title: doc.data().title,\r\n      author: doc.data().author,\r\n    }));\r\n\r\n    return response.json({ books: books });\r\n  })\r\n  .catch(err =\u003e {\r\n    return response.json({ error: err });\r\n  })\r\n});\r\n```\r\n\r\nAhora sí, podemos volver a ejecutar el comando `firebase deploy` y probar nuestra aplicación en la URL que Firebase nos provee:\r\n\r\n```json\r\n{\r\n  \"data\": [\r\n    {\r\n      \"id\": \"0aKwwhILcjxqH0nmfjvD\",\r\n      \"title\": \"Libro #1\",\r\n      \"author\": \"Juan José García\"\r\n    },\r\n    {\r\n      \"id\": \"6F9oXWNUvvdJZxPJyWm1\",\r\n      \"title\": \"Libro #2,\r\n      \"author\": \"Don Jaimito\"\r\n    },\r\n    {\r\n      \"id\": \"ApAUmVlWkMfjp50HK8I2\",\r\n      \"title\": \"Libro #3\",\r\n      \"author\": \"Spiderman\"\r\n    }\r\n  ]\r\n}\r\n```\r\n\r\n## Conclusión\r\n\r\nMuchas aplicaciones construyen APIs públicas para integrarse con otros servicios. Gracias a las APIs públicas de Github miles de desarrolladoras y desarrolladores pueden construir aplicaciones para sus portafolios y otros servicios como Slack pueden notificarnos cuando creamos un Issue o Pull Request en nuestros proyectos.\r\n\r\nLa plataforma de Firebase tiene muchas herramientas asombrosas que nos ayudan a crear aplicaciones de forma rápida, sencilla y escalable. En esta caso, fue el turno de hablar del servicio de Cloud Functions y cómo nos permite añadir funcionalidades a nuestras aplicaciones sin necesidad de modificar el código base.\r\n\r\nTe invito a tomar el [Curso de Firebase Cloud Functions](https://platzi.com/cursos/firebase-cloud) para descubrir todas las posibilidades que nos ofrecen estos servicios y cómo podemos utilizarlos para mejorar nuestras aplicaciones.\r\n\r\n**¡#NuncaParesDeAprender!** :green_heart::nerd_face:\r\n\r\n\u003e [La evolución de las APIs y su modelo de negocio | PlatziConf 2018](https://www.youtube.com/watch?v=Li1nCsnMaz4)\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjuandc%2Ffirebase-books-app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjuandc%2Ffirebase-books-app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjuandc%2Ffirebase-books-app/lists"}