{"id":28274302,"url":"https://github.com/wotancode/medpoint-api-restfull-2025","last_synced_at":"2025-06-16T05:32:00.802Z","repository":{"id":292742660,"uuid":"981401897","full_name":"wotanCode/medpoint-api-restfull-2025","owner":"wotanCode","description":"API Restful desarrollada con NestJS que permite la gestión de citas médicas para pacientes y médicos.","archived":true,"fork":false,"pushed_at":"2025-05-13T12:25:41.000Z","size":1155,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-09T23:40:37.435Z","etag":null,"topics":["nestjs"],"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/wotanCode.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-05-11T02:50:30.000Z","updated_at":"2025-06-01T20:28:20.000Z","dependencies_parsed_at":"2025-05-11T23:29:29.019Z","dependency_job_id":null,"html_url":"https://github.com/wotanCode/medpoint-api-restfull-2025","commit_stats":null,"previous_names":["wotancode/medpoint-api-restfull-2025"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/wotanCode/medpoint-api-restfull-2025","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wotanCode%2Fmedpoint-api-restfull-2025","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wotanCode%2Fmedpoint-api-restfull-2025/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wotanCode%2Fmedpoint-api-restfull-2025/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wotanCode%2Fmedpoint-api-restfull-2025/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wotanCode","download_url":"https://codeload.github.com/wotanCode/medpoint-api-restfull-2025/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wotanCode%2Fmedpoint-api-restfull-2025/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260106094,"owners_count":22959602,"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","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":["nestjs"],"created_at":"2025-05-21T01:16:55.088Z","updated_at":"2025-06-16T05:32:00.786Z","avatar_url":"https://github.com/wotanCode.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🏥 MedPoint API\n\nAPI Restful desarrollada con **NestJS** que permite la gestión de citas médicas para pacientes y médicos.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://nestjs.com/img/logo-small.svg\" alt=\"NestJS Logo\" width=\"80\"\u003e\n\u003c/p\u003e\n\nNestJS es un framework progresivo para construir aplicaciones del lado del servidor. Su estructura basada en módulos, su compatibilidad con TypeScript y el seguimiento estricto de patrones como MVC y DI (inyección de dependencias) lo hacen ideal para proyectos escalables, mantenibles y bien organizados.\n\n---\n\n## 📌 Características principales\n\n* 🗖️ Pedir citas médicas por parte de pacientes.\n* 💳 Confirmación de asistencia mediante pago (con integración sandbox de pasarela de pago).\n* ✅ Confirmación o rechazo de citas por parte del médico (solo si está pagada).\n* 📋 Listado de citas del día para cada médico.\n* 📚 Agenda completa por paciente con validaciones de horario y solapamientos.\n* 🔐 Autenticación mediante tokens simples.\n* ⚖️ Control de roles: paciente y médico.\n\u003c!-- * TODO: 🧪 Pruebas unitarias completas con cobertura. --\u003e\n\n---\n\n## 📌 Principios y buenas prácticas aplicadas\n\n- ✅ Principios **SOLID**\n- ✅ Programación orientada a objetos\n- ✅ Arquitectura orientada a **dominio y responsabilidades claras**\n- ✅ Uso de **DTOs, services, guards, interceptors y pipes**\n- ✅ Pruebas unitarias y end-to-end\n- ✅ Control de errores centralizado\n- ✅ Estructura limpia y mantenible\n\n---\n\n## 🚀 Requisitos y instalación \n\nAntes de comenzar, asegúrate de tener instalados los siguientes programas:\n\n- [Node.js][nodejs-url] – Entorno de ejecución para JavaScript del lado del servidor.\n- [Docker][docker-url] – Plataforma para contenedores que facilita la ejecución de la base de datos y otros servicios.\n\n```sh\n# Clonar el repositorio\ngit clone https://github.com/wotanCode/medpoint-api-restfull-2025.git\n```\n\n```sh\n# Ingresar al proyecto\ncd medpoint\n```\n\n```sh\n# Instalar dependencias\nnpm install\n```\n\n## ▶️ Ejecución\n\n1. Clonar el archivo `.env.template` y renombrarlo a `.env`.\n2. Ajustar las variables de entorno según el uso. (Se pueden dejar los valores por defecto, excepto la de stripe la cual debe ser real para procesar pagos, aunque sea modo sandbox).\n3. Levantar la base de datos.\n\n```sh\ndocker-compose up -d\n```\n\n4. Levantar proyecto:\n\n```sh\nnpm run start:dev\n```\n\n5. Ejecutar Seed. Get method\n\n```sh\nhttp://localhost:3000/api/seed\n```\n\n```bash\n# Modo desarrollo\nnpm run start:dev\n\n# Producción\nnpm run build\nnpm run start:prod\n```\n\n---\n\n## 👥 Usuarios de prueba\n\nAl ejecutar el **seed**, se insertarán los siguientes usuarios de prueba en la base de datos:\n\n| Rol     | Email                           | Contraseña   |\n|---------|----------------------------------|--------------|\n| **Admin** | `admin@admin.com`              | `Admin1234`  |\n| **Doctor** | `bob.doctor@example.com`      | `Doctor1234` |\n| **Patient** | `charlie@mymail.com`        | `Abcd1234`   |\n| **Patient** | `diana.rivera@example.com`   | `Abcd1234`   |\n| **Patient** | `elias.torres@example.com`   | `Abcd1234`   |\n| **Patient** | `fatima.gonzalez@example.com`| `Abcd1234`   |\n\nUtiliza estos usuarios para realizar pruebas de autenticación y roles dentro de la API. Recuerda iniciar sesión con alguno de los usuarios de prueba para poder probar los distintos servicios, ya que todos requieren autenticación y algunos requieren diferentes tipos de autorización. Al hacer el login, estos regresan un Bearer Token con el cual podras consumir los distintos servicios.\n\n---\n\n## 📑 Documentación de la API (Swagger)\n\nPara consultar la documentación completa de todos los endpoints disponibles, puedes acceder a la interfaz de **Swagger UI**, la cual te permitirá explorar y probar la API de manera interactiva.\n\nAccede a la documentación en el siguiente enlace:\n\n[http://localhost:3000/api](http://localhost:3000/api)\n\n---\n\n\u003c!-- ## 🧪 Pruebas\n\n```bash\n# Unitarias\nnpm run test\n\n# End-to-End\nnpm run test:e2e\n\n# Cobertura\nnpm run test:cov\n```\n\n--- --\u003e\n\n\u003c!-- ## ⚙️ Endpoints principales\n\n### 📌 Paciente\n\n- TODO\n\u003c!-- * `POST /appointments` → Solicitar nueva cita médica.\n* `POST /appointments/:id/pay` → Pagar cita (sandbox).\n* `GET /appointments/mine` → Ver citas propias. --\u003e\n\n\u003c!-- ### 📌 Médico\n\n- TODO --\u003e\n\u003c!-- * `PATCH /appointments/:id/confirm` → Confirmar o rechazar cita (sólo si fue pagada).\n* `GET /appointments/today` → Ver citas del día.\n\n\u003e Todos los endpoints requieren autenticación mediante token en el header. --\u003e\n\n\u003c!-- --- --\u003e\n\n## 👮‍♂️ Roles y permisos\n\n| Rol      | Permisos                                     |\n| -------- | -------------------------------------------- |\n| admin    | Control completo                             |\n| doctor   | Confirmar/rechazar citas, ver agenda diaria. |\n| patient  | Solicitar y pagar citas. Ver su historial.   |\n\n---\n\n## ✅ Validaciones clave\n\n* ⛔ No se puede solicitar citas fuera del horario habilitado (07:00–12:00 / 14:00–18:00).\n* ⛔ No se puede solicitar cita en horarios ya ocupados.\n* ⛔ No se puede confirmar una cita que no ha sido pagada.\n* ⚠️ Validaciones adicionales como formato de datos, campos requeridos y estados de cita.\n\n---\n\n## 🔐 Autenticación\n\nEste proyecto utiliza un sistema de autenticación basado en **JWT (JSON Web Tokens)**.\n\n- NestJS proporciona los mecanismos necesarios para generar, firmar y validar tokens.\n- El token contiene información del usuario y su rol, permitiendo un control de acceso eficiente.\n- La caducidad del token está configurada por defecto en **8 horas**.\n\n\u003e ⚙️ Podés ajustar el tiempo de expiración o la lógica de autenticación modificando la configuración en el módulo de autenticación\n\n## 🧱 Base de Datos\n\nEste proyecto utiliza **PostgreSQL** (versión 14.3) como sistema de gestión de base de datos. No es obligatorio para ejecutar el proyecto, pero en caso de que se deseé visualizar la BBDD, estas son las credenciales de ingreso.\n\n### 📌 Detalles de conexión:\n\n| Parámetro  | Valor               |\n|------------|---------------------|\n| Nombre     | `medpointdb`        |\n| Host       | `localhost`         |\n| Puerto     | `5432`              |\n| Usuario    | `postgres`          |\n| Contraseña | `mysecretpassword`  |\n\n\n\u003c!-- ## 📁 Estructura del proyecto\n\n- TODO --\u003e\n\u003c!-- \n```\nsrc/\n├── auth/\n├── users/\n├── appointments/\n├── payments/\n├── common/\n│   ├── guards/\n│   ├── interceptors/\n│   └── utils/\n└── main.ts\n    app.module.ts\n```\n\n\u003e Diseño modular y desacoplado usando interfaces, inyección de dependencias, DTOs y entidades claras.\n\n--- --\u003e\n\n--- \n\n## 🧪 Ejemplo caso de uso\n\n### 🔧 1. Preparación Inicial\n\n```bash\n# 1. Asegúrate de que la base de datos esté corriendo\n# 2. Ejecuta el seed para tener una base de datos limpia\nGET http://localhost:3000/api/seed\n```\n\n### 🔧 2. Flujo de Prueba\n\n#### a) Iniciar sesión como paciente\n```bash\nPOST http://localhost:3000/api/auth/login\n{\n  \"email\": \"charlie@mymail.com\",\n  \"password\": \"Abcd1234\"\n}\n```\nGuarda el token que recibas.\n\n#### b) Crear una cita (usando el token del paciente)\n```bash\nPOST http://localhost:3000/api/appointments\nHeaders: \n- Authorization: Bearer \u003ctoken-del-paciente\u003e\n\nBody:\n{\n  \"doctorId\": \"id-del-doctor\",\n  \"appointmentTime\": \"2024-03-20T10:00:00Z\",\n  \"reason\": \"Consulta de rutina\",\n  \"amount\": 50.00\n}\n```\nGuarda el ID de la cita creada.\n\n#### c) Procesar el pago (usando el token del paciente)\n```bash\nPOST http://localhost:3000/api/payments/process\nHeaders: \n- Authorization: Bearer \u003ctoken-del-paciente\u003e\n\nBody:\n{\n  \"appointmentId\": \"id-de-la-cita-creada\",\n  \"paymentMethod\": \"card\",\n  \"paymentToken\": \"tok_visa\"  // Token de prueba de Stripe\n}\n```\n\n#### d) Verificar el estado de la cita (usando el token del paciente)\n```bash\nGET http://localhost:3000/api/appointments/mine\nHeaders: \n- Authorization: Bearer \u003ctoken-del-paciente\u003e\n```\n\n#### e) Ver detalles del pago (usando token de admin o doctor)\n```bash\nGET http://localhost:3000/api/payments/:id-del-pago\nHeaders: \n- Authorization: Bearer \u003ctoken-de-admin-o-doctor\u003e\n```\n\n### 🔧 3. Tokens de Prueba de Stripe\n\n- `tok_visa`: Pago exitoso\n- `tok_chargeDeclined`: Pago rechazado\n- `tok_chargeCustomerFail`: Error en el procesamiento\n\n### 🔧 4. Usuarios de Prueba\n\n- Admin: `admin@admin.com` / `Admin1234`\n- Doctor: `bob.doctor@example.com` / `Doctor1234`\n- Paciente: `charlie@mymail.com` / `Abcd1234`\n\n### 🔧 5. Verificación de Estados\n\n- La cita debe cambiar de `pending` a `paid` después del pago exitoso\n- Debe crearse un registro en la tabla de pagos\n- El doctor y admin deben poder ver los detalles del pago\n\n### 🔧 6. Notas Importantes\n\n1. Los tokens de prueba de Stripe (`tok_visa`, etc.) son valores fijos que siempre funcionarán en el entorno de pruebas.\n2. Para ver los detalles de un pago, puedes usar:\n   - El ID de Stripe (ejemplo: `ch_3ROHbuQ7dYv9g8xd1ZcJQdyt`)\n   - El UUID de nuestra base de datos\n3. La respuesta de un pago exitoso incluirá:\n   ```json\n   {\n     \"success\": true,\n     \"paymentId\": \"ch_3ROHbuQ7dYv9g8xd1ZcJQdyt\",\n     \"amount\": 50.00,\n     \"status\": \"succeeded\"\n   }\n   ```\n\n### 🔧 7. Posibles Errores\n\n1. **Pago ya realizado**: Si intentas pagar una cita que ya está pagada\n2. **Token inválido**: Si usas un token de prueba incorrecto\n3. **Permisos insuficientes**: Si intentas acceder a endpoints sin el rol adecuado\n4. **Cita no encontrada**: Si el ID de la cita no existe \n\n---\n\n## 🧰 Tecnologías usadas\n\n- [![NestJS][nestjs-badge]][nestjs-url] Framework para construir aplicaciones server-side eficientes y escalables.\n- [![TypeScript][typescript-badge]][typescript-url] Superset de JavaScript con tipado estático.\n- [![Docker][docker-badge]][docker-url] Plataforma para desarrollar, enviar y ejecutar aplicaciones dentro de contenedores.\n- [![PostgreSQL][postgresql-badge]][postgresql-url] Sistema de base de datos relacional avanzado.\n- [![TypeORM][typeorm-badge]][typeorm-url] ORM para TypeScript y JavaScript compatible con múltiples bases de datos.\n- [![Jest][jest-badge]][jest-url] Framework de testing con enfoque en simplicidad.\n- [![Passport][passport-badge]][passport-url] Middleware de autenticación para Node.js.\n- [![Class Validator][classvalidator-badge]][classvalidator-url] Validación basada en decoradores para TypeScript.\n\n---\n\n## 👨‍💻 Autor\n\nDesarrollado con ❤️ por Pedro Yanez\n\n[![GitHub][github-badge]][github-url] [![LinkedIn][linkedin-badge]][linkedin-url]\n\n---\n\n## 📜 Licencia\n\nEste proyecto está bajo la licencia MIT. Consulta el archivo `LICENSE` para más detalles.\n\n\u003c!-- Fuente de la verdad --\u003e\n[nodejs-url]: https://nodejs.org/\n[nestjs-url]: https://nestjs.com/\n[nestjs-badge]: https://img.shields.io/badge/NestJS-E0234E?style=for-the-badge\u0026logo=nestjs\u0026logoColor=white\n[typescript-url]: https://www.typescriptlang.org/\n[typescript-badge]: https://img.shields.io/badge/TypeScript-007ACC?style=for-the-badge\u0026logo=typescript\u0026logoColor=white\n[docker-url]: https://www.docker.com/\n[docker-badge]: https://img.shields.io/badge/Docker-2496ED?style=for-the-badge\u0026logo=docker\u0026logoColor=white\n[postgresql-url]: https://www.postgresql.org/\n[postgresql-badge]: https://img.shields.io/badge/PostgreSQL-4169E1?style=for-the-badge\u0026logo=postgresql\u0026logoColor=white\n[typeorm-url]: https://typeorm.io/\n[typeorm-badge]: https://img.shields.io/badge/TypeORM-262627?style=for-the-badge\u0026logo=typeorm\u0026logoColor=white\n[jest-url]: https://jestjs.io/\n[jest-badge]: https://img.shields.io/badge/Jest-C21325?style=for-the-badge\u0026logo=jest\u0026logoColor=white\n[passport-url]: http://www.passportjs.org/\n[passport-badge]: https://img.shields.io/badge/Passport-34E27A?style=for-the-badge\u0026logo=passport\u0026logoColor=white\n[classvalidator-url]: https://github.com/typestack/class-validator\n[classvalidator-badge]: https://img.shields.io/badge/Class_Validator-000000?style=for-the-badge\u0026logo=github\u0026logoColor=white\n[github-url]: https://github.com/wotancode\n[github-badge]: https://img.shields.io/badge/GitHub-181717?style=for-the-badge\u0026logo=github\u0026logoColor=white\n[linkedin-url]: https://www.linkedin.com/in/pedro-yanez/\n[linkedin-badge]: https://img.shields.io/badge/LinkedIn-0A66C2?style=for-the-badge\u0026logo=linkedin\u0026logoColor=white","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwotancode%2Fmedpoint-api-restfull-2025","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwotancode%2Fmedpoint-api-restfull-2025","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwotancode%2Fmedpoint-api-restfull-2025/lists"}