{"id":30750660,"url":"https://github.com/pedronau/backend-online-store-node","last_synced_at":"2026-04-05T21:02:16.507Z","repository":{"id":312127710,"uuid":"1046260979","full_name":"pedronau/backend-online-store-node","owner":"pedronau","description":"API REST en Node.js + Express con MongoDB, Clean Architecture y JWT, gestionando usuarios, productos y categorías, con subida de imágenes y paginación.","archived":false,"fork":false,"pushed_at":"2025-08-28T17:17:42.000Z","size":63,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-08-28T23:54:38.464Z","etag":null,"topics":["api-rest","backend","endpoint","express","junior","junior-developer","jwt","mongodb","mongoose","nodejs","store","users"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/pedronau.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-08-28T12:30:32.000Z","updated_at":"2025-08-28T17:17:45.000Z","dependencies_parsed_at":"2025-08-28T23:54:42.533Z","dependency_job_id":"405f7a89-f36e-4caf-a028-3fa24c9f077d","html_url":"https://github.com/pedronau/backend-online-store-node","commit_stats":null,"previous_names":["pedronau/backend-online-store-node"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/pedronau/backend-online-store-node","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedronau%2Fbackend-online-store-node","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedronau%2Fbackend-online-store-node/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedronau%2Fbackend-online-store-node/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedronau%2Fbackend-online-store-node/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pedronau","download_url":"https://codeload.github.com/pedronau/backend-online-store-node/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedronau%2Fbackend-online-store-node/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273567997,"owners_count":25128686,"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-09-04T02:00:08.968Z","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":["api-rest","backend","endpoint","express","junior","junior-developer","jwt","mongodb","mongoose","nodejs","store","users"],"created_at":"2025-09-04T07:01:51.561Z","updated_at":"2025-12-30T21:30:58.945Z","avatar_url":"https://github.com/pedronau.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🛍️ API REST - Backend de una tienda online\n\nEste proyecto es el **backend de una tienda online**, implementado como **API REST** en Node.js con Express y base de datos MongoDB.  \nIncluye gestión de usuarios, productos y categorías, autenticación con JWT, subida de imágenes, y sigue principios de **Clean Architecture** junto al **Patrón Adaptador**.\n\n## Características\n\n- Creación de usuarios, productos y categorías.\n- Paginación en las peticiones GET.\n- Registro e inicio de sesión con autenticación mediante JWT.\n- Validación de usuarios mediante email. (Por defecto desactivado, hay que configurar el email desde el que se envían los correos y generar una 'secret key')\n- Subida de archivos que se guardan de manera local.\n- Registro en base de datos.\n- Semilla para llenar la BBDD automáticamente.\n\n## Endpoints de autenticación\n\n1. **Registro** → `POST /api/auth/register`\n\n   ```json\n   {\n     \"name\": \"Pedro Peñas\",\n     \"email\": \"pedropefer34@gmail.com\",\n     \"password\": \"123456\"\n   }\n   ```\n\n   **Respuesta:**\n\n   ```json\n   {\n     \"user\": {\n       \"id\": \"68b042940097ed21ec39d2c3\",\n       \"name\": \"Pedro Peñas\",\n       \"email\": \"pedropefer34@gmail.com\",\n       \"emailValidated\": false,\n       \"role\": [\"USER_ROLE\"]\n     },\n     \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY4YjA0Mjk0MDA5N2VkMjFlYzM5ZDJjMyIsImlhdCI6MTc1NjM4MTg0NCwiZXhwIjoxNzU2Mzg5MDQ0fQ.dMVnksEM2sbHXhJHUynsECwy7-bv6alSbV_tEJrXjAs\"\n   }\n   ```\n\n2. **Login** → `POST /api/auth/login`\n\n   ```json\n   { \"email\": \"pedropefer34@gmail.com\", \"password\": \"123456\" }\n   ```\n\n   **Respuesta:**\n\n   ```json\n   {\n     \"user\": {\n       \"id\": \"68b042940097ed21ec39d2c3\",\n       \"name\": \"Pedro Peñas\",\n       \"email\": \"pedropefer34@gmail.com\",\n       \"emailValidated\": false,\n       \"role\": [\"USER_ROLE\"]\n     },\n     \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY4YjA0Mjk0MDA5N2VkMjFlYzM5ZDJjMyIsImlhdCI6MTc1NjM4MTg0NCwiZXhwIjoxNzU2Mzg5MDQ0fQ.dMVnksEM2sbHXhJHUynsECwy7-bv6alSbV_tEJrXjAs\"\n   }\n   ```\n\n3. **Uso del token** → Enviar en headers:\n\n   ```\n   Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY4YjA0Mjk0MDA5N2VkMjFlYzM5ZDJjMyIsImlhdCI6MTc1NjM4MTg0NCwiZXhwIjoxNzU2Mzg5MDQ0fQ.dMVnksEM2sbHXhJHUynsECwy7-bv6alSbV_tEJrXjAs\n   ```\n\n   Este será necesario para crear productos y categorías, las rutas GET de estos no necesitan autenticación.\n\n## Endpoints de productos y categorías\n\n1. **Creación de categorías** → `POST /api/categories`\n\n   ```json\n   { \"name\": \"Categoría test\", \"available\": \"true\" }\n   ```\n\n   **Respuesta sin token:**\n\n   ```json\n   { \"error\": \"No token provided\" }\n   ```\n\n   **Respuesta con token válido:**\n\n   ```json\n   {\n     \"id\": \"68b045560097ed21ec39d2ca\",\n     \"name\": \"Categoría test\",\n     \"available\": true\n   }\n   ```\n\n2. **Obtención de categorías** → `GET /api/categories?page=1\u0026limit=2`\n\n   **Respuesta (con paginación según parámetros de la URL):**\n\n   ```json\n   {\n     \"page\": 1,\n     \"limit\": 2,\n     \"total\": 23,\n     \"next\": \"api/categories?page=2$limit=2\",\n     \"prev\": null,\n     \"categories\": [\n       {\n         \"id\": \"68b041bdc0a8edc42e3dbf0d\",\n         \"name\": \"Driven\",\n         \"available\": false\n       },\n       {\n         \"id\": \"68b041bdc0a8edc42e3dbf0e\",\n         \"name\": \"Till\",\n         \"available\": false\n       }\n     ]\n   }\n   ```\n\n   3. **Creación de productos** → `POST /api/products`\n\n   ```json\n   {\n     \"name\": \"Producto test\",\n     \"category\": \"68b041bdc0a8edc42e3dbf0d\"\n   }\n   ```\n\n   La categoría debe de ser un ID válido de MongoDB para que vayan enlazados.\n\n   **Respuesta sin token:**\n\n   ```json\n   { \"error\": \"No token provided\" }\n   ```\n\n   **Respuesta con token válido:**\n\n   ```json\n   {\n     \"name\": \"Producto test\",\n     \"available\": false,\n     \"price\": 0,\n     \"user\": \"68b042940097ed21ec39d2c3\",\n     \"category\": \"68b041bdc0a8edc42e3dbf0d\",\n     \"id\": \"68b0481d0097ed21ec39d2f5\"\n   }\n   ```\n\n   Con la autenticación, se le añade el ID del usuario autenticado en MongoDB para saber quien creó el producto.\n\n   4. **Obtención de productos** → `GET /api/products?limit=1\u0026page =1`\n\n   **Respuesta (con paginación según parámetros de la URL):**\n\n   ```json\n   {\n     \"page\": 1,\n     \"limit\": 1,\n     \"total\": 23,\n     \"next\": \"api/categories?page=2$limit=1\",\n     \"prev\": null,\n     \"products\": [\n       {\n         \"name\": \"Than\",\n         \"available\": true,\n         \"price\": 75.0369,\n         \"user\": {\n           \"name\": \"Test 2\",\n           \"email\": \"test2@google.com\",\n           \"emailValidated\": false,\n           \"role\": [\"USER_ROLE\"],\n           \"id\": \"68b041bdc0a8edc42e3dbf07\"\n         },\n         \"category\": {\n           \"name\": \"kitchen\",\n           \"id\": \"68b041bdc0a8edc42e3dbf1f\"\n         },\n         \"id\": \"68b041bdc0a8edc42e3dbf26\"\n       }\n     ]\n   }\n   ```\n\n   ## Endpoints de carga de imágenes\n\n   1. **Carga de imágenes simple (una sola imagen)** → `POST /api/upload/single/:type`\n\n   ```\n   En el URL debemos sustituir \":type\" por la clase a de la imagen. Las opciones son: \"users\", \"products\" y \"categories\".\n\n   Subimos la imagen que queramos con el formato aceptado (\"png\", \"jpeg\", \"jpg\" y \"gif\")\n   ```\n\n   **Respuesta:**\n\n   ```json\n   {\n     \"fileName\": \"0029b869-a5ac-4d5a-8154-c8e6a0d2c182.png\"\n   }\n   ```\n\n   El ID de la imagen. Se guarda en la carpeta uploads del proyecto, en el subdirectorio señalado en \":type\"\n\n   2. **Carga de imágenes múltiple (varias imágenes)** → `POST /api/upload/multiple/:type`\n\n   ```\n   Similar al anterior pero nos permite subir varios archivos.\n   ```\n\n   3. **Obtención de imágenes** → `GET /api/images/:type/:img`\n\n   ```\n   En el URL debemos sustituir \":type\" por la clase a de la imagen. Las opciones son: \"users\", \"products\" y \"categories\". También debemos sustituir \":img\" por el ID que se generó cuando cargamos la imagen.\n   ```\n\n   **Respuesta:**\n\n   ```\n   La propia imagen.\n   ```\n\n## Tecnologías\n\n- **Node.js + Express** (API REST)\n- **JWT** (autenticación)\n- **MongoDB** (base de datos)\n- **Mongoose** (gestión base de datos)\n- **Bcrypt** (encriptación de contraseñas)\n- **Dotenv** (variables de entorno)\n- **Uuid** (generación de IDs)\n- **Nodemailer** (envío de correos electrónicos)\n- **Express-fileupload** (subida de archivos)\n- **Clean Architecture + Patrón Adaptador**\n\n## Instalación\n\n```bash\n# Clonar repositorio\nClonar '.env.template' a '.env' y configurar las variables de entorno\n\n# Instalar dependencias\nEjecutar el comando 'npm install'\n\n# Base de datos\nConfigurar el 'docker-compose.yml' y ejecutar 'docker compose up -d' para levantar los servicios deseados.\n\n# Llenar base de datos\nLlenar la base de datos con los datos de prueba ejecutando 'npm run seed'\n\n# Levantar el proyecto\nEjecutar 'npm run dev' para levantar el proyecto en modo desarrollo\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpedronau%2Fbackend-online-store-node","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpedronau%2Fbackend-online-store-node","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpedronau%2Fbackend-online-store-node/lists"}