{"id":25495331,"url":"https://github.com/tutosrive/factus_challenge","last_synced_at":"2026-02-24T09:02:56.292Z","repository":{"id":275326510,"uuid":"920188720","full_name":"tutosrive/factus_challenge","owner":"tutosrive","description":"El Reto Factus, ¿Cómo conectar una API de facturación electrónica con seguridad OAUTH 2.0?","archived":false,"fork":false,"pushed_at":"2025-04-21T07:27:26.000Z","size":4687,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-17T20:12:03.307Z","etag":null,"topics":["axios","backend","challenge","crud","css","database","expressjs","factus","frontend","halltec","html","javascript","node","nodejs","pg","postgres","web"],"latest_commit_sha":null,"homepage":"","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/tutosrive.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-01-21T18:04:42.000Z","updated_at":"2025-04-21T07:27:30.000Z","dependencies_parsed_at":"2025-02-14T23:28:49.035Z","dependency_job_id":"3aec6239-185f-4413-bcc3-c77f25a6d616","html_url":"https://github.com/tutosrive/factus_challenge","commit_stats":null,"previous_names":["tutosrivegamerlq/factus_challenge","tutosrive/factus_challenge"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/tutosrive/factus_challenge","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tutosrive%2Ffactus_challenge","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tutosrive%2Ffactus_challenge/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tutosrive%2Ffactus_challenge/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tutosrive%2Ffactus_challenge/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tutosrive","download_url":"https://codeload.github.com/tutosrive/factus_challenge/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tutosrive%2Ffactus_challenge/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29777607,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-24T04:54:30.205Z","status":"ssl_error","status_checked_at":"2026-02-24T04:53:58.628Z","response_time":75,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["axios","backend","challenge","crud","css","database","expressjs","factus","frontend","halltec","html","javascript","node","nodejs","pg","postgres","web"],"created_at":"2025-02-19T00:25:36.987Z","updated_at":"2026-02-24T09:02:51.283Z","avatar_url":"https://github.com/tutosrive.png","language":"JavaScript","funding_links":["https://github.com/sponsors/tutosrive","https://www.buymeacoffee.com/tutosrive","https://img.buymeacoffee.com/button-api/?text=Buy"],"categories":[],"sub_categories":[],"readme":"# Reto [Factus](https://developers.factus.com.co/) - Propuesto por \"[Halltec](https://halltec.co/)\"\n---\n**[Vídeo Del Reto Factus](https://youtu.be/PI5bEsuY1aA?si=FPCjpjvUSzby0OZ9)**\n\n---\n\n\u003cdiv style=\"display: flex; align-items: center; justify-content: center; margin: 10px 0; gap: 10px; max-height: 48px; height: 48px;\"\u003e\n  \u003ca href=\"https://github.com/sponsors/tutosrive\" target=\"_blank\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Sponsor-%F0%9F%92%96%20tutosrive-orange?style=for-the-badge\u0026logo=github\" alt=\"Sponsor me on GitHub\"\u003e\n\u003c/a\u003e\n  \u003ca href=\"https://www.buymeacoffee.com/tutosrive\"\u003e\n    \u003cimg \n      src=\"https://img.buymeacoffee.com/button-api/?text=Buy me a coffee\u0026emoji=☕\u0026slug=tutosrive\u0026button_colour=FFDD00\u0026font_colour=000000\u0026font_family=Cookie\u0026outline_colour=000000\u0026coffee_colour=ffffff\" \n      style=\"height: 48px; width: auto; object-fit: contain; border-radius: 6px;\" \n      alt=\"Buy me a coffee button\"\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\n---\n## Certificado\n![certificado](https://github.com/user-attachments/assets/0e11b96f-d836-4ebe-9737-384196a254c9)\n\n¡Hola buenas!, mi nombre real es **[Santiago Rivera Marin](https://www.instagram.com/santiago.riveramarin.524/)**, tengo 19 años de edad, y este repositorio almacena el **Reto Factus** propuesto por el equipo de la _empresa_ \"**[Halltec](https://halltec.co/)**\".\n\nEl equipo de \"**[Halltec](https://halltec.co/)**\", tiene una **[API](https://www.ibm.com/mx-es/topics/api)** de **[Facturación Electrónica](https://micrositios.dian.gov.co/sistema-de-facturacion-electronica/factura-electronica/)**, la cuál está programada en **[PHP](https://www.php.net/manual/es/intro-whatis.php)**, sí, **PHP** aún existe y es poderoso, lo digo porque los tiempos de respuesta de esta **[API](https://www.ibm.com/mx-es/topics/api)** de \"**[Halltec](https://halltec.co/)**\" son muy rápidos.\nPues bien, el reto consiste en **conectar** esa **[API](https://www.ibm.com/mx-es/topics/api)** con nuestro \"_sistema_\", no importa cual hubiese sido, ya sea desde un **[backend](https://www.gluo.mx/blog/backend-que-es-y-para-que-sirve)** en **python** hasta un **[backend](https://www.gluo.mx/blog/backend-que-es-y-para-que-sirve)** en **[.NET](https://dotnet.microsoft.com/es-es/learn/dotnet/what-is-dotnet)**, en cualquier sistema, no importa cual fuere, y el reto está en los desafíos que conlleva conectar esta **[API](https://www.ibm.com/mx-es/topics/api)**, por su sistema de autenticación **[OAUTH 2.0](https://auth0.com/es/intro-to-iam/what-is-oauth-2)**, por lo cual se debe generar **[Token de acceso](https://globalfishingwatch.org/es/faqs/que-es-un-token-de-acceso-a-la-api/)** para poder acceder a los **[endpoints](https://mailchimp.com/es/resources/what-is-an-api-endpoint/)** de la **[API](https://www.ibm.com/mx-es/topics/api)**, además,\nen los desafíos que tiene el reto, está el de _¿cómo crear un [CRUD](https://blog.hubspot.es/website/que-es-crud)?_, esto porque el reto en sí, no sólo es conectar el **[API](https://www.ibm.com/mx-es/topics/api)** en interfaces como lo son **[Insomnia](https://insomnia.rest/)** y **[Postman](https://www.postman.com/)**, pues no, más allá de enviar **[Peticiones HTTP](https://kinsta.com/es/base-de-conocimiento/que-es-una-peticion-http/)** desde un programa ya existente, ajeno a nuestro \"Sistema\", a fin de cuentas, si no teníamos un \"sistema\" ya programado, debíamos realizarlo, ya el método de interfaz no importa, es decir, cada quien identifica si necesita un **[backend](https://www.gluo.mx/blog/backend-que-es-y-para-que-sirve)** o si se hace todo desde el frontend.\n\nPor mi parte, decidí hacer un **[backend](https://www.gluo.mx/blog/backend-que-es-y-para-que-sirve)**, para el cual usé **[Node.js (v22.12.0)](https://nodejs.org/es)** y paquetes de este mismo como lo son:\n  - **[axios (v1.7.9)](https://axios-http.com/es/docs/intro)**: Usado para realizar **[Peticiones HTTP](https://kinsta.com/es/base-de-conocimiento/que-es-una-peticion-http/)** desde el **[backend](https://www.gluo.mx/blog/backend-que-es-y-para-que-sirve)**\n  - **[express (v4.21.2)](https://expressjs.com/)**: Usado para crear los **[endpoints](https://mailchimp.com/es/resources/what-is-an-api-endpoint/)** de mi **[backend](https://www.gluo.mx/blog/backend-que-es-y-para-que-sirve)**\n  - **[pg (v8.13.1)](https://node-postgres.com/)**: Usado para el [CRUD](https://blog.hubspot.es/website/que-es-crud) en **[POSTGRES](https://www.postgresql.org/)**\n  - **[morgan (v1.10.0)](https://www.npmjs.com/package/morgan)**: Usado para mostrar por consola los registros de las peticiones que se hacen.\n  - **[Postgres](https://www.postgresql.org/)**: Usado para almacenar datos de clientes, productos y tablas de configuraciones del reto\n\nPara el frontend, lo \"normalito\":\n  - **[Javascript](https://developer.mozilla.org/es/docs/Learn_web_development/Core/Scripting/What_is_JavaScript)**: Usado para darle interactividad al **[frontend](https://www.arsys.es/blog/frontend-que-es-y-para-que-se-utiliza-en-desarrollo-web)** y enviar **[Peticiones HTTP](https://kinsta.com/es/base-de-conocimiento/que-es-una-peticion-http/)** a mi **[backend](https://www.gluo.mx/blog/backend-que-es-y-para-que-sirve)**\n  - **[CSS](https://lenguajecss.com/css/introduccion/que-es-css/)**: Pues, no creo que sea para algo más o ¿sí?\n  - **[HTML](https://developer.mozilla.org/es/docs/Web/HTML)**: Estructura del frontend\n  - **[Bootstrap](https://getbootstrap.com/docs/5.3/getting-started/introduction/)**: Usado para dar un estilo good al frontend\n\nServidores:\n  - **[azure.com](https://azure.microsoft.com/es-es/resources/cloud-computing-dictionary/what-is-azure/)**: Usado para almacenar la base de datos de **[POSTGRES](https://www.postgresql.org/)**\n  - **[koyeb.com](https://www.koyeb.com/docs)**: Usado para almacenar y servir el **[backend](https://www.gluo.mx/blog/backend-que-es-y-para-que-sirve)** del reto\n  - **[render.com](https://render.com/about)**: Usado para almacenar y servir el **[frontend](https://www.arsys.es/blog/frontend-que-es-y-para-que-se-utiliza-en-desarrollo-web)**\n\nGracias al equipo de \"**[Halltec](https://halltec.co/)**\".\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftutosrive%2Ffactus_challenge","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftutosrive%2Ffactus_challenge","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftutosrive%2Ffactus_challenge/lists"}