{"id":24518446,"url":"https://github.com/andu15/backend-hapi","last_synced_at":"2026-04-14T10:33:19.816Z","repository":{"id":104386832,"uuid":"437652841","full_name":"Andu15/backend-hapi","owner":"Andu15","description":"Contrucción de API's para: registro de usuarios, autenticación(correo y contraseña), creación de posts, lista de posts, eliminar los post y agregar o quitar like a un post cuando el usuario esta autenticado","archived":false,"fork":false,"pushed_at":"2021-12-13T23:54:09.000Z","size":387,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-15T11:12:33.516Z","etag":null,"topics":["3t","bcrypt","docker","docker-compose","javascript","mongodb","nestjs","nodejs","passport","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Andu15.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2021-12-12T20:46:53.000Z","updated_at":"2022-01-08T00:42:04.000Z","dependencies_parsed_at":"2023-04-20T20:32:19.047Z","dependency_job_id":null,"html_url":"https://github.com/Andu15/backend-hapi","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/Andu15/backend-hapi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Andu15%2Fbackend-hapi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Andu15%2Fbackend-hapi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Andu15%2Fbackend-hapi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Andu15%2Fbackend-hapi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Andu15","download_url":"https://codeload.github.com/Andu15/backend-hapi/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Andu15%2Fbackend-hapi/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31793215,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-14T02:24:21.117Z","status":"ssl_error","status_checked_at":"2026-04-14T02:24:20.627Z","response_time":153,"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":["3t","bcrypt","docker","docker-compose","javascript","mongodb","nestjs","nodejs","passport","typescript"],"created_at":"2025-01-22T01:42:36.326Z","updated_at":"2026-04-14T10:33:19.800Z","avatar_url":"https://github.com/Andu15.png","language":"TypeScript","funding_links":["https://opencollective.com/nest","https://paypal.me/kamilmysliwiec"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"http://nestjs.com/\" target=\"blank\"\u003e\u003cimg src=\"https://nestjs.com/img/logo_text.svg\" width=\"320\" alt=\"Nest Logo\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n[circleci-image]: https://img.shields.io/circleci/build/github/nestjs/nest/master?token=abc123def456\n[circleci-url]: https://circleci.com/gh/nestjs/nest\n\n  \u003cp align=\"center\"\u003eA progressive \u003ca href=\"http://nodejs.org\" target=\"_blank\"\u003eNode.js\u003c/a\u003e framework for building efficient and scalable server-side applications.\u003c/p\u003e\n    \u003cp align=\"center\"\u003e\n\u003ca href=\"https://www.npmjs.com/~nestjscore\" target=\"_blank\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/@nestjs/core.svg\" alt=\"NPM Version\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://www.npmjs.com/~nestjscore\" target=\"_blank\"\u003e\u003cimg src=\"https://img.shields.io/npm/l/@nestjs/core.svg\" alt=\"Package License\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://www.npmjs.com/~nestjscore\" target=\"_blank\"\u003e\u003cimg src=\"https://img.shields.io/npm/dm/@nestjs/common.svg\" alt=\"NPM Downloads\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://circleci.com/gh/nestjs/nest\" target=\"_blank\"\u003e\u003cimg src=\"https://img.shields.io/circleci/build/github/nestjs/nest/master\" alt=\"CircleCI\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://coveralls.io/github/nestjs/nest?branch=master\" target=\"_blank\"\u003e\u003cimg src=\"https://coveralls.io/repos/github/nestjs/nest/badge.svg?branch=master#9\" alt=\"Coverage\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://discord.gg/G7Qnnhy\" target=\"_blank\"\u003e\u003cimg src=\"https://img.shields.io/badge/discord-online-brightgreen.svg\" alt=\"Discord\"/\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/nest#backer\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/nest/backers/badge.svg\" alt=\"Backers on Open Collective\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/nest#sponsor\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/nest/sponsors/badge.svg\" alt=\"Sponsors on Open Collective\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://paypal.me/kamilmysliwiec\" target=\"_blank\"\u003e\u003cimg src=\"https://img.shields.io/badge/Donate-PayPal-ff3f59.svg\"/\u003e\u003c/a\u003e\n    \u003ca href=\"https://opencollective.com/nest#sponsor\"  target=\"_blank\"\u003e\u003cimg src=\"https://img.shields.io/badge/Support%20us-Open%20Collective-41B883.svg\" alt=\"Support us\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://twitter.com/nestframework\" target=\"_blank\"\u003e\u003cimg src=\"https://img.shields.io/twitter/follow/nestframework.svg?style=social\u0026label=Follow\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n# Backend HAPI\n\n## Introducción\nContrucción de API's para el registro de usuarios (dto: email, password y name), autenticación con correo y contraseña, creación de posts (dto: title, description, image, like) cuando el usuario esta autenticado, lista de posts(publico), eliminar los post de un usuario cuando el usuario esta autenticado (queda pendiente que le pertenezca el post) y agregar o quitar like a un post cuando el usuario esta autenticado\n\n## Importante\n- Puerto: 3000\n- Se ha creado una imagen a través de Docker\n- mongoDB como base de datos\n# Requisitos\n- Instalación de nestJS\n- Instalación de Passport\n- Instalación de JWT\n- Instalación de bcrypt\n## Pasos para crear este proyecto\n1. Preparar el entorno con el cli de NestJS `npm i -g @nestjs/cli` e iniciarlo con `nest new \u003cproject-name\u003e` e iniciar el servidor con `npm run start:dev`\n\n2. Para la base de datos (mongoDB) se crea una imagen cuya configuración esta en el :file_folder:\t`Dockerfile` y luego se crea el archivo :file_folder:\t`docker-compose.yml` donde recopilaremos los servicios que levantaremos (para docker: nest-app en el puerto 3000 y para mongo en el puerto 27017). Luego configuramos y levantamos la imagen `docker-compose up -d mongo`;\n   \n3. Para comprobar las collecciones de la base de datos, será con la ayuda de `Robo 3T` que ya debería estar instalado en el pc.\n\n4. Una vez que tengamos todo lo anterior, tenemos que empezar a estructurar nuestro proyecto, en este caso, dentro de src creare los directorios :card_index_dividers: `auth` para todo el tema de login(autenticación), :card_index_dividers: `posts` para almacenar los posts y sus métodos y un directorio :card_index_dividers: `users` para almacenar los inputs de los nuevos usuarios.\n\n5. Luego nos enfocaremos en crear las subcarpetas y archivos que necesitamos para posts y users, en este caso sería en el sgte:\n   - `\u003cname\u003e`.module.ts que actuara como el índice de cada API, aqui se importara los controllers, providers (o servicios), schemas, y todo lo relacionado o que se requiera en la construcción de la API.\n   - `\u003cname\u003e`.dto.ts para saber el tipo de variables que se estaban compartiendo desde el frontend al backend\n   - `\u003cname\u003e`.controller.ts que se encargan de recibir los requests(peticiones o solicitud del frontend al backend) de la aplicación, que almacenará los métodos y sus operaciones(get, post, patch, delete) y se encargara de validar los tipos, guardianes, decoradores, etc. y si todo es correcto se conectará a uno o varios servicios.\n   - `\u003cname\u003e`.service.ts que esta relacionado con la base datos y sirve para inyectar su información y son algo que se suele usar desde varios modulos y con cada inyección tiene un constructor\n   - `\u003cname\u003e`.schema.ts o llamada entidad, aqui especificamos los tipos de datos que recibiremos por parte del servicio, y es muy similar al dto del frontend\n   - `\u003cname\u003e`.interface.ts o llamadas firmas, basicamente para definir los atributos y métodos de una «cosa», sin importar qué sea esa cosa, mejor dicho para definir tipos de clases sin distinguir entre ellas.\n\n6. Para el tema de autenticacion, usare [Passport](https://github.com/jaredhanson/passport) y [JWT](https://jwt.io/) pero para evitar tener información sensible encriptaremos el password del user con bcrypt;\n   \n7. Es importante crear un módulo indepeniente para auth con `nest g mo modules/auth --flat` y también necesito un guardian para proteger las peticiones y lo creo con `nest g gu guard/apiKey --flat`\n\n8.  Dentro del archivo `api-key.guards.ts` configuro los Headers que va a recibir dentro del contexto del request, en este caso es necesario enviarle en el header los sgtes argumentos:   \n   \u003ccode\u003eemail: permission@imhapi.app  \n   pwd: 1@hapi_challenge`\u003c/code\u003e\ncon excepción de la API de listado de posts que es público\n   \n9.  Con la ayuda de `@SetMetadata` se crea el decorador `@Public` para crear una variable junto con su entorno y sus condicionales se encuentran en el archivo de `api-key.guard.ts` \n\n10.  Se crean archivos con formato `\u003cname\u003e.strategy.ts` que convierte un grupo de comportamientos en objetos y los hace intercambiables dentro del objeto de contexto original\n\n11. Finalmente, hago uso de los guardinaes y estrategias para proteger ciertos métodos y su peticiones\n\n## Descripción de API's\n* API de registro de usuarios con los campos: correo, contraseña y nombre\n  - Operación: Post\n  - Para crear un registro, se manejará un endpoint `http://localhost:3000/users`\n  - Recibirá 3 inputs: \"name\", \"email\" y \"password\"\n\n* API de autenticación con correo y contraseña\n  - Operación: Post\n  - Para crear un registro, se manejará un endpoint `http://localhost:3000/auth/login`\n  - Aceptará 2 inputs(de los cuales debe haber un registro previo): \"email\" y \"password\"\n  - De no existir un registro debe indicar \"Not allow\"\n\n* API de creación de posts con los campos de título, descripción e imagen estando el\nusuario ya autenticado\n  - Operación: Post\n  - Para crear un registro, se manejará un endpoint `http://localhost:3000/posts`\n  - Aceptará 4 inputs: \"title\", \"description\", \"image\", \"like\" (boolean)\n  - Dentro de Auth, debe indicar el token generado con JWT\n  - En el header indicar:\n    \u003ccode\u003eemail: permission@imhapi.app  \n   pwd: 1@hapi_challenge`\u003c/code\u003e\n\n* API de listado de posts\n  - Operación: Get\n  - Para crear un registro, se manejará un endpoint `http://localhost:3000/posts`\n  - Es publico, no necesita permisos\n\n* API para la eliminación de un post, en caso el mismo pertenezca al usuario autenticado\n  - Operación: Delete\n  - Para crear un registro, se manejará un endpoint `http://localhost:3000/posts/:id`\n  - Dentro de Auth, debe indicar el token generado con JWT\n  - En el header indicar:\n    \u003ccode\u003eemail: permission@imhapi.app  \n   pwd: 1@hapi_challenge`\u003c/code\u003e\n  - **OJO : Queda pendiente la condición de que el post le pertenezca para realizar la operación**\n\n* API que permita, al usuario autenticado, votar o quitar el voto dado a un post\n  - Operación: Patch\n  - Para crear un registro, se manejará un endpoint `http://localhost:3000/posts/:id`\n  - En el body, en formato JSON, indicar el valor de \"like\", solo acepta \"true\" o \"false\"\n  - Dentro de Auth, debe indicar el token generado con JWT\n  - En el header indicar:\n    \u003ccode\u003eemail: permission@imhapi.app  \n   pwd: 1@hapi_challenge`\u003c/code\u003e\n## Autor\n[Andrea Blanco] (https://github.com/Andu15)\n\n## TimeLine\n- Inicio: Viernes 10/12/2021\n- Fin: Lunes 13/12/2021\n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandu15%2Fbackend-hapi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandu15%2Fbackend-hapi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandu15%2Fbackend-hapi/lists"}