{"id":51036405,"url":"https://github.com/hernangm/mia203","last_synced_at":"2026-06-22T06:40:57.850Z","repository":{"id":320734561,"uuid":"1083165831","full_name":"hernangm/mia203","owner":"hernangm","description":null,"archived":false,"fork":false,"pushed_at":"2025-11-23T18:07:52.000Z","size":145,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-11-23T19:25:01.394Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://mia203.onrender.com/docs","language":"Python","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/hernangm.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-10-25T13:29:20.000Z","updated_at":"2025-11-23T17:54:59.000Z","dependencies_parsed_at":"2025-10-25T16:04:57.017Z","dependency_job_id":"8fe24616-165e-49a1-ab6f-7ae04aa4ae3b","html_url":"https://github.com/hernangm/mia203","commit_stats":null,"previous_names":["hernangm/mia203"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/hernangm/mia203","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hernangm%2Fmia203","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hernangm%2Fmia203/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hernangm%2Fmia203/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hernangm%2Fmia203/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hernangm","download_url":"https://codeload.github.com/hernangm/mia203/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hernangm%2Fmia203/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34637937,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-22T02:00:06.391Z","response_time":106,"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":[],"created_at":"2026-06-22T06:40:57.039Z","updated_at":"2026-06-22T06:40:57.834Z","avatar_url":"https://github.com/hernangm.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Proyecto MIA203\n\n![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/hernangm/mia203/CICD.yaml?branch=main\u0026label=Main)\n![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/hernangm/mia203/CICD.yaml?branch=production\u0026label=Production)\n![Coverage](https://hernangm.github.io/mia203/coverage.svg)\n\nLa API está disponible en [https://mia203.onrender.com](https://mia203.onrender.com)\n\nLa documentación está disponible en [https://mia203.onrender.com/docs](https://mia203.onrender.com/docs)\n\n## Integrantes\n\n- María Luisa Boettner\n- Hernán Marano\n\n## Decisiones de Diseño\n\n### Uso del Patrón Strategy para Validación\n\nSe eligió implementar el patrón Strategy para la validación de métodos de pago por las siguientes razones:\nSe adjunta un diagrama de la implementacion de la estrategia \n[Documento del Strategy Pattern](StrategyPattern_Validacion_MetodoPago.pdf)\n\n- **Extensibilidad:** Permite agregar fácilmente nuevos métodos de pago y sus validaciones específicas sin modificar el código existente. Cada método de pago tiene su propia estrategia de validación encapsulada en una clase independiente.\n- **Separación de responsabilidades:** La lógica de validación de cada método de pago está aislada, lo que facilita el mantenimiento y la comprensión del código.\n- **Testabilidad:** Al tener cada estrategia en una clase separada, es sencillo escribir tests unitarios específicos para cada tipo de validación, asegurando que los cambios en una estrategia no afecten a las demás.\n- **Trade-offs:** Se consideró usar condicionales simples (if/elif) para la validación, pero esto haría el código menos escalable y más difícil de mantener a medida que se agregan nuevos métodos de pago. El patrón Strategy implica mayor cantidad de clases, pero mejora la organización y la flexibilidad.\n- **Desacoplamiento:** El controlador principal no necesita conocer los detalles de cada validación, solo delega la responsabilidad a la estrategia correspondiente.\n\nEn resumen, el patrón Strategy fue elegido para favorecer la modularidad, la escalabilidad y la claridad en la lógica de validación de pagos, alineándose con buenas prácticas de diseño orientado a objetos.\n\n### Uso del Patrón Factory Method\n\nLa clase `PaymentMethodValidationStrategyFactory` implementa el patrón Factory Method para instanciar la estrategia de validación adecuada según el método de pago seleccionado. Esto permite desacoplar la lógica de creación de objetos y facilita la extensión del sistema para soportar nuevos métodos de pago sin modificar el código existente.\n\n### Uso del Patrón Enum\n\nEl uso de la clase `PaymentMethod` como un `Enum` define de manera clara y segura los métodos de pago soportados por la aplicación. Esto ayuda a evitar errores por valores inválidos y mejora la legibilidad y mantenibilidad del código.\n\n## Flujo de Validación\n\n```mermaid\nsequenceDiagram\n    participant Usuario\n    participant API\n    participant EstrategiaValidacion\n    Usuario-\u003e\u003eAPI: Solicita pago con método X\n    API-\u003e\u003eEstrategiaValidacion: Valida datos\n    EstrategiaValidacion--\u003e\u003eAPI: Resultado validación\n    API--\u003e\u003eUsuario: Respuesta (éxito/error)\n```\n\n## Tests\n\nEl proyecto incluye una batería de tests unitarios ubicados en la carpeta `src/tests`. Estos tests verifican el correcto funcionamiento de las estrategias de validación de métodos de pago y la fábrica de estrategias.Los tests se ejecutan automáticamente en cada Pull Request gracias al pipeline de CI en GitHub Actions.\n\n### ¿Qué se prueba?\n\n- **Estrategias de validación:** Se testean las clases que implementan la lógica de validación para cada método de pago (por ejemplo, PayPal y tarjeta de crédito).\n\n  **PayPalValidationStrategy**\n  - Acepta montos inferiores a 5000.\n  - Rechaza montos iguales o superiores a dicho límite.\n\n  **CreditCardValidationStrategy**\n  - Requiere montos inferiores a 10.000.\n  - Exige que exista exactamente un pago registrado previo del mismo método.\n  - Rechaza pagos sin historial o con un número incorrecto de registros previos.\n\n- **Factory de estrategias:** Se verifica que la clase `PaymentMethodValidationStrategyFactory` retorne la estrategia adecuada según el método de pago solicitado y que maneje correctamente métodos desconocidos.\n- **Cobertura mínima:** El workflow de CI exige al menos 3 tests unitarios ejecutados en cada Pull Request hacia la rama `main`.\n\n\n## Integración y Despliegue Continuos (CI/CD)\n\nEl proyecto utiliza GitHub Actions para automatizar los procesos de integración y despliegue continuo. El archivo de configuración `.github/workflows/CICD.yaml` define dos flujos principales:\n\n### 1. Flujo de Integración Continua (CI)\n\n- **Disparadores:** Se ejecuta automáticamente en cada push o pull request a las ramas `main` y `production`.\n- **Pasos principales:**\n  - **Checkout:** Descarga el código fuente del repositorio.\n  - **Cache de dependencias:** Optimiza la instalación de paquetes usando caché de pip.\n  - **Setup de Python:** Configura el entorno con Python 3.11.\n  - **Instalación de dependencias:** Instala los paquetes necesarios y los opcionales para testing.\n  - **Ejecución de tests:** Corre los tests con cobertura usando `pytest` y genera un badge de cobertura.\n  - **Actualización de badge:** El badge de cobertura se actualiza automáticamente en la rama `gh-pages` para visualizar el estado en el README.\n  - **Linting:** Ejecuta `flake8` para asegurar calidad y estilo del código.\n\n### 2. Flujo de Despliegue Continuo (CD)\n\n- **Desencadenante:** Se ejecuta automáticamente en cada push a la rama `production`.\n- **Despliegue:** Utiliza la acción `render-deploy` para desplegar la aplicación en Render, usando credenciales seguras almacenadas en GitHub Secrets.\n- **Badge de despliegue:** El estado del despliegue se refleja en el README mediante badges automáticos.\n\n### Beneficios\n\n- **Automatización:** Reduce errores manuales y asegura que el código siempre pase por pruebas antes de desplegarse.\n- **Transparencia:** Los badges permiten visualizar rápidamente el estado de los tests, cobertura y despliegue.\n- **Calidad:** El linting y la cobertura ayudan a mantener un estándar alto en el código fuente.\n\n\n## Cómo instalar la aplicación\n\n1. **Clona el repositorio**\n\n```bash\ngit clone https://github.com/hernangm/mia203.git\ncd mia203\n```\n\n2. **Crea y activa un entorno virtual** (Opcional pero recomendado)\n\nEn Windows:\n```bash\npython -m venv venv\nvenv\\Scripts\\activate\n```\nEn Linux/Mac:\n```bash\npython -m venv venv\nsource venv/bin/activate\n```\n\n3. **Instala dependencias**\n\n```bash\npython -m pip install --upgrade pip\npip install .\n```\n\n## Ejecuta la aplicación\n\n```bash\nuvicorn main:app --reload\n```\n\n## Corre los tests\n\n```bash\npip install .[test]\n```\n\n```bash\npython -m pytest src/tests\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhernangm%2Fmia203","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhernangm%2Fmia203","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhernangm%2Fmia203/lists"}