Saltar al contenido
Mis Proyectos
Caso de estudio 2026

FinanceOS MX API

API REST empresarial para administrar finanzas personales en el ecosistema financiero mexicano: cuentas, tarjetas, transacciones, presupuestos, préstamos e inversiones en una sola API.

  • Java
  • Spring Boot
  • PostgreSQL
  • Maven

El caso de estudio

Problema
En México la vida financiera de una persona se reparte entre bancos, fintechs, SOFIPOs y wallets, cada uno con su propia app y formato: no existe un lugar único donde consultar cuánto se tiene, cuánto se debe o cuánto se gastó.
Solución
Un monolito modular en Java 21 y Spring Boot 3 —17 módulos de negocio con dependencias en una sola dirección—, seguridad JWT stateless, PostgreSQL con migraciones Flyway, errores RFC 9457 y una regla no negociable: el balance nunca se modifica directamente, siempre es consecuencia de las transacciones.
Resultado
Roadmap completo (10 de 10 fases): autenticación, cuentas, tarjetas, transacciones, planeación, pasivos, inversiones y reportes, con OpenAPI/Swagger, CI en GitHub Actions y una fase final de autoauditoría de arquitectura, seguridad y cobertura.

Proceso

Proceso de desarrollo

El razonamiento detrás de las decisiones técnicas: por qué se eligió cada tecnología, qué retos surgieron y cómo se resolvieron.

  1. 01

    Monolito modular, dependencias en una sola dirección

    Cada contexto de negocio (cuenta, transacción, presupuesto, inversión…) vive en su propio módulo con controller, service, repository, DTO y excepciones propias; las entidades JPA nunca se exponen por la API. Antes de escribir código documenté convenciones, seguridad y modelo de datos, y cuando una validación exigía romper la dirección de las dependencias —como bloquear el cierre de cuentas consultando tarjetas— preferí descartarla antes que violar la arquitectura.

  2. 02

    El dinero como invariante del dominio

    El dinero siempre en BigDecimal, UUID generados por la aplicación, tiempos en UTC y todo cambio de esquema versionado con Flyway. La regla central: el balance de una cuenta solo cambia a través de un único punto de mutación interno que registra la transacción en el mismo paso, preservando la dependencia unidireccional transaction → account. Los valores derivados —presupuesto gastado, próximo cobro, rendimiento— se calculan en cada request y nunca se persisten.

  3. 03

    Verificación en vivo, no solo tests

    Cada fase cerraba corriendo el JAR real contra una base limpia y verificando con curl, además de las pruebas con JUnit 5 y Mockito. Esa práctica encontró los bugs que los tests enmascaraban —como una LazyInitializationException invisible bajo tests transaccionales— y la fase final fue una autoauditoría: dependencias prohibidas entre módulos, mappers con relaciones lazy, duplicación y revisión de seguridad. Las reglas de arquitectura no se cumplen solas; hay que auditarlas.

Repositorios

Commits

  1. V1

    dd562c2Eduardola semana pasada