{"id":31364384,"url":"https://github.com/antonela89/book-api-ada","last_synced_at":"2026-06-23T15:33:01.779Z","repository":{"id":316103428,"uuid":"1061273394","full_name":"Antonela89/book-api-ADA","owner":"Antonela89","description":"TP final modulo 2 - carrera Backend - ADA","archived":false,"fork":false,"pushed_at":"2025-09-23T19:17:57.000Z","size":18,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-23T20:30:35.679Z","etag":null,"topics":["fs","js","json","mvc-architecture","path","readline","tcp","tcp-client","tcp-server","uuid"],"latest_commit_sha":null,"homepage":"","language":null,"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/Antonela89.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-21T15:37:35.000Z","updated_at":"2025-09-23T15:32:27.000Z","dependencies_parsed_at":"2025-09-23T20:30:37.054Z","dependency_job_id":null,"html_url":"https://github.com/Antonela89/book-api-ADA","commit_stats":null,"previous_names":["antonela89/api-ada","antonela89/book-api-ada"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/Antonela89/book-api-ADA","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Antonela89%2Fbook-api-ADA","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Antonela89%2Fbook-api-ADA/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Antonela89%2Fbook-api-ADA/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Antonela89%2Fbook-api-ADA/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Antonela89","download_url":"https://codeload.github.com/Antonela89/book-api-ADA/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Antonela89%2Fbook-api-ADA/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":277194869,"owners_count":25777177,"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-27T02:00:08.978Z","response_time":73,"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":["fs","js","json","mvc-architecture","path","readline","tcp","tcp-client","tcp-server","uuid"],"created_at":"2025-09-27T07:05:13.745Z","updated_at":"2026-06-23T15:33:01.773Z","avatar_url":"https://github.com/Antonela89.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# API de Gestión de Biblioteca (Trabajo Práctico Integrador)\n\nEste proyecto es una aplicación de consola completa para la gestión de una biblioteca, desarrollada en Node.js. Consiste en un servidor TCP que maneja la lógica de negocio y la persistencia de datos, y un cliente de terminal interactivo que permite a los usuarios interactuar con la API de una manera intuitiva y guiada.\n\nLa aplicación sigue el patrón de diseño **Modelo-Vista-Controlador (MVC)** para una clara separación de responsabilidades y un código mantenible.\n\n## ✨ Características Principales\n\n- **Gestión CRUD Completa:** Soporte para Crear, Leer (listar y ver por ID), Actualizar y Eliminar para tres categorías: Autores, Libros y Editoriales.\n- **Cliente de Consola Interactivo:** Interfaz de usuario amigable con menús numéricos que guía al usuario a través de todas las operaciones, eliminando la necesidad de escribir comandos complejos o JSON.\n- **Persistencia de Datos:** La información se almacena en archivos `.json` locales.\n- **Búsqueda Inteligente:** Búsqueda parcial e insensible a mayúsculas y minúsculas.\n- **Reglas de Negocio Robustas:**\n  - **Prevención de Duplicados:** No permite agregar autores, libros o editoriales con nombres/títulos idénticos.\n  - **Restricción de Eliminación:** Protege la integridad de los datos impidiendo que se elimine un autor o editorial si tienen libros asociados.\n- **Script de Pruebas Automatizado:** Incluye un script (`test.js`) que ejecuta una secuencia de pruebas para verificar la funcionalidad completa del CRUD y las reglas de negocio.\n\n---\n\n## 🏛️ Arquitectura del Proyecto\n\nEl proyecto está estructurado siguiendo el patrón **Modelo-Vista-Controlador (MVC)**.\n\n- **`models/` (Modelo):** La capa de datos, responsable de interactuar directamente con los archivos `json`.\n- **`views/` (Vista):** La capa de presentación (`responseFormatter.js`), responsable de formatear los datos para la terminal.\n- **`controllers/` (Controlador):** El \"cerebro\" de la aplicación. Contiene la lógica de negocio y orquesta el flujo entre el Modelo y la Vista.\n- **`server.js`:** Actúa como el enrutador. Escucha las conexiones TCP y delega las peticiones al controlador adecuado.\n- **`client.js`:** La interfaz de usuario. Mantiene una conexión persistente y proporciona un menú interactivo.\n\n### Principio DRY y Reutilización de Código\n\nLa solución implementada se adhiere estrictamente al principio DRY (Don't Repeat Yourself) mediante el uso extensivo de la carpeta src/utils/:\n\n1. **Para los Modelos:** Se utiliza una \"fábrica\" (src/models/createDataModel.js) que centraliza toda la lógica de acceso a archivos, haciendo que los modelos individuales sean simples y declarativos.\n\n2. **Para los Controladores:** Se extrajo la lógica común de manipulación de datos (como el formateo de texto y el parseo de objetos de entrada) a módulos como formatters.js y objectUtils.js. Esto limpia los controladores, permitiéndoles centrarse exclusivamente en las reglas de negocio.\n\n---\n\n## 📂 Estructura de Archivos\n\n```\nAPI-ADA/\n├── .gitignore\n├── client.js               # Interfaz de usuario interactiva\n├── package-lock.json\n├── package.json\n├── README.md               # Documentación principal\n├── server.js               # Punto de entrada del servidor TCP\n├── test.js                 # Script de pruebas automatizadas\n├── docs/\n│   ├── img/                # Carpeta para imágenes de la documentación\n│   └── documentacion.md    # Documentación técnica detallada\n└── src/\n    ├── controllers/\n    │   ├── authorsController.js\n    │   ├── booksController.js\n    │   └── publishersController.js\n    ├── data/\n    │   ├── authors.json\n    │   ├── books.json\n    │   └── publishers.json\n    ├── models/\n    │   ├── authorsModel.js\n    │   ├── booksModel.js\n    │   ├── createDataModel.js\n    │   └── publishersModel.js\n    ├── utils/\n    │   ├── formatters.js\n    │   ├── objectUtils.js\n    │   └── utils.js\n    └── views/\n        └── responseFormatter.js\n```\n\n---\n\n## 🚀 Instalación y Configuración\n\nSigue estos pasos para poner en marcha el proyecto.\n\n### Prerrequisitos\n\n- [Node.js](https://nodejs.org/) (versión 18 o superior recomendada)\n- npm (incluido con Node.js)\n\n### Pasos\n\n1.  **Clona el repositorio:**\n    ```bash\n    git clone https://github.com/Antonela89/book-api-ADA\n    ```\n2.  **Navega a la carpeta del proyecto:**\n    ```bash\n    cd book-api-ADA\n    ```\n3.  **Instala las dependencias:**\n    Este proyecto solo requiere la librería `uuid`.\n    ```bash\n    npm install\n    ```\n\n---\n\n## 🏃 Modo de Uso\n\nLa aplicación requiere dos terminales: una para el servidor y otra para el cliente.\n\n### 1. Iniciar el Servidor\n\nEn tu primera terminal, ejecuta el siguiente comando.\n\n```bash\nnpm start\n```\n\no alternativamente:\n\n```bash\nnode server.js\n```\n\nVerás un mensaje de confirmación: `Servidor TCP escuchando en el puerto 8080`.\n\n### 2. Iniciar el Cliente Interactivo\n\nEn una **segunda terminal**, ejecuta el siguiente comando para conectarte al servidor.\n\n```bash\nnode client.js\n```\n\nAparecerá el menú principal para empezar a interactuar con la aplicación.\n\n---\n\n## 🚀 Prueba Interactiva Online (Replit)\n\nSi no quieres clonar el repositorio, puedes probar la aplicación directamente en tu navegador:\n\n1. Entra a este enlace: https://replit.com/@AntonelaBorgogn/book-api-ADA\n(Nota: Replit puede requerir iniciar sesión para ejecutar la consola interactiva).\n2. Haz clic en el botón verde **\"Run\"** en la parte superior.\n3. El servidor se iniciará automáticamente y, tras un par de segundos, aparecerá el **menú interactivo** en la consola de la derecha.\n4. ¡Interactúa con el menú usando los números de tu teclado!\n\n#### Demo\n\u003cp\u003e\n\u003cimg src=\"https://res.cloudinary.com/antonelab/image/upload/v1771121183/GitHub%20-%20Proyectos%20-%20Gif/book-api-ADA_-_Replit_gjqeh6.gif\" alt=\"funcionamiento de api\"\u003e\n\u003c/p\u003e\n\n---\n\n## 🧪 Pruebas Automatizadas\n\nEl proyecto incluye un script que prueba automáticamente el ciclo CRUD y las reglas de negocio.\n\n### Cómo ejecutar las pruebas:\n\n1.  Asegúrate de que el **servidor esté corriendo** en una terminal.\n2.  En una **segunda terminal**, ejecuta:\n    ```bash\n    node test.js\n    ```\n3.  La terminal mostrará el progreso y el resultado de cada prueba.\n\n#### Captura\n\u003cp\u003e\n\u003cimg src=\"./docs/img/test.png\" alt=\"tests\"\u003e\n\u003c/p\u003e\n\n---\n\n## 🛠️ Tecnologías Usadas\n\n\u003cp\u003e\n  \u003cimg src=\"https://img.shields.io/badge/JavaScript-F7DF1E?style=for-the-badge\u0026logo=javascript\u0026logoColor=black\" alt=\"JavaScript\"/\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Node.js-339933?style=for-the-badge\u0026logo=node.js\u0026logoColor=white\" alt=\"Node.js\"/\u003e\n  \u003cimg src=\"https://img.shields.io/badge/TCP%20(Net%20Module)-0078D4?style=for-the-badge\u0026logo=windows\u0026logoColor=white\" alt=\"Módulo Net\"/\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Console%20I/O%20(Readline)-52994B?style=for-the-badge\u0026logo=node.js\u0026logoColor=white\" alt=\"Módulo Readline\"/\u003e\n  \u003cimg src=\"https://img.shields.io/badge/JSON-000000?style=for-the-badge\u0026logo=json\u0026logoColor=white\" alt=\"JSON\"/\u003e\n  \u003cimg src=\"https://img.shields.io/badge/UUID-6B5B95?style=for-the-badge\u0026logo=uuid\u0026logoColor=white\" alt=\"UUID\"/\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Git-F05032?style=for-the-badge\u0026logo=git\u0026logoColor=white\" alt=\"Git\"/\u003e\n  \u003cimg src=\"https://img.shields.io/badge/GitHub-181717?style=for-the-badge\u0026logo=github\u0026logoColor=white\" alt=\"GitHub\"/\u003e\n\u003c/p\u003e\n\n---\n\n## 🧑‍💻 Autoras\n\n| Nombre                 | LinkedIn                                                            | GitHub                                      |\n| ---------------------- | ------------------------------------------------------------------- | ------------------------------------------- |\n| **BORGOGNO, Antonela** | [antonela-borgogno](https://www.linkedin.com/in/antonela-borgogno/) | [Antonela89](https://github.com/Antonela89) |\n| **MARTINEZ, Gabriela** | [magamahe](https://www.linkedin.com/in/magamahe/)                   | [magamahe](https://github.com/magamahe)     |\n\n---\n\n## 📄 Institución Académica\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/img/logo_ada.png\" alt=\"Logo ADA\" width=\"200\"/\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  Programa de formación en desarrollo web, Cohorte intro-js-202504\n  \u003cbr\u003e\n  Proyecto educativo sin fines comerciales. Todos los derechos reservados © 2025.\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fantonela89%2Fbook-api-ada","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fantonela89%2Fbook-api-ada","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fantonela89%2Fbook-api-ada/lists"}