Content is user-generated and unverified.

Estructura del Proyecto - Arquitectura Hexagonal

Estructura Principal del Monorepo

taller-automotriz/
├── services/
│   ├── cliente-service/                 <-- 🐍 Python (Flask + SQLAlchemy)
│   │   ├── src/
│   │   │   ├── app/                     <-- Application Layer
│   │   │   │   ├── facades/
│   │   │   │   │   └── cliente_facade.py
│   │   │   │   ├── use_cases/
│   │   │   │   │   ├── crear_cliente.py
│   │   │   │   │   ├── actualizar_cliente.py
│   │   │   │   │   └── consultar_cliente.py
│   │   │   │   └── services/
│   │   │   │       └── cliente_service.py
│   │   │   │
│   │   │   ├── domain/                  <-- Domain Core
│   │   │   │   ├── entities/
│   │   │   │   │   └── cliente.py
│   │   │   │   ├── repositories/
│   │   │   │   │   └── cliente_repository.py
│   │   │   │   └── value_objects/
│   │   │   │       ├── cedula.py
│   │   │   │       └── telefono.py
│   │   │   │
│   │   │   └── infrastructure/          <-- Infrastructure Layer
│   │   │       ├── adapters/
│   │   │       │   ├── primary/         <-- Driving Adapters
│   │   │       │   │   ├── api/
│   │   │       │   │   │   ├── __init__.py
│   │   │       │   │   │   ├── cliente_controller.py
│   │   │       │   │   │   └── routes.py
│   │   │       │   │   └── web/
│   │   │       │   │       └── cliente_web_controller.py
│   │   │       │   └── secondary/       <-- Driven Adapters
│   │   │       │       ├── persistence/
│   │   │       │       │   ├── sqlalchemy/
│   │   │       │       │   │   ├── models/
│   │   │       │       │   │   │   └── cliente_model.py
│   │   │       │       │   │   ├── repositories/
│   │   │       │       │   │   │   └── cliente_repository_impl.py
│   │   │       │       │   │   └── database.py
│   │   │       │       │   └── sqlite/
│   │   │       │       │       └── cliente.db
│   │   │       │       └── external/
│   │   │       │           └── notification_service.py
│   │   │       │
│   │   │       └── config/
│   │   │           ├── settings.py
│   │   │           └── dependencies.py
│   │   │
│   │   ├── tests/
│   │   │   ├── unit/
│   │   │   ├── integration/
│   │   │   └── e2e/
│   │   │
│   │   ├── requirements.txt
│   │   ├── app.py                       <-- Entry point Flask
│   │   └── Dockerfile
│   │
│   ├── orden-equipo-service/           <-- 🟨 TypeScript (Express + Prisma)
│   │   ├── src/
│   │   │   ├── app/                     <-- Application Layer
│   │   │   │   ├── facades/
│   │   │   │   │   ├── ordenServicio.facade.ts
│   │   │   │   │   ├── equipo.facade.ts
│   │   │   │   │   ├── tecnico.facade.ts
│   │   │   │   │   ├── jefeTaller.facade.ts
│   │   │   │   │   └── asistenteTaller.facade.ts
│   │   │   │   ├── useCases/
│   │   │   │   │   ├── orden/
│   │   │   │   │   │   ├── crearOrden.useCase.ts
│   │   │   │   │   │   ├── actualizarEstado.useCase.ts
│   │   │   │   │   │   └── consultarOrden.useCase.ts
│   │   │   │   │   ├── equipo/
│   │   │   │   │   │   ├── registrarEquipo.useCase.ts
│   │   │   │   │   │   └── consultarEquipo.useCase.ts
│   │   │   │   │   ├── tecnico/
│   │   │   │   │   │   ├── generarCotizacion.useCase.ts
│   │   │   │   │   │   └── actualizarEstadoOrden.useCase.ts
│   │   │   │   │   ├── jefeTaller/
│   │   │   │   │   │   ├── asignarTecnico.useCase.ts
│   │   │   │   │   │   └── visualizarEstados.useCase.ts
│   │   │   │   │   └── asistenteTaller/
│   │   │   │   │       └── generarSolicitudPiezas.useCase.ts
│   │   │   │   └── services/
│   │   │   │       ├── orden.service.ts
│   │   │   │       ├── equipo.service.ts
│   │   │   │       ├── tecnico.service.ts
│   │   │   │       ├── jefeTaller.service.ts
│   │   │   │       └── asistenteTaller.service.ts
│   │   │   │
│   │   │   ├── domain/                  <-- Domain Core
│   │   │   │   ├── entities/
│   │   │   │   │   ├── OrdenDeServicio.ts
│   │   │   │   │   ├── Equipo.ts
│   │   │   │   │   ├── Tecnico.ts
│   │   │   │   │   ├── JefeTaller.ts
│   │   │   │   │   ├── AsistenteTaller.ts
│   │   │   │   │   └── Cotizacion.ts
│   │   │   │   ├── repositories/
│   │   │   │   │   ├── IOrdenRepository.ts
│   │   │   │   │   ├── IEquipoRepository.ts
│   │   │   │   │   ├── ITecnicoRepository.ts
│   │   │   │   │   ├── IJefeTallerRepository.ts
│   │   │   │   │   ├── IAsistenteTallerRepository.ts
│   │   │   │   │   └── ICotizacionRepository.ts
│   │   │   │   ├── valueObjects/
│   │   │   │   │   ├── EstadoOrden.ts
│   │   │   │   │   ├── TipoEquipo.ts
│   │   │   │   │   └── Disponibilidad.ts
│   │   │   │   └── services/
│   │   │   │       ├── disponibilidad.domain.service.ts
│   │   │   │       └── asignacion.domain.service.ts
│   │   │   │
│   │   │   └── infrastructure/          <-- Infrastructure Layer
│   │   │       ├── adapters/
│   │   │       │   ├── primary/         <-- Driving Adapters
│   │   │       │   │   ├── api/
│   │   │       │   │   │   ├── controllers/
│   │   │       │   │   │   │   ├── orden.controller.ts
│   │   │       │   │   │   │   ├── equipo.controller.ts
│   │   │       │   │   │   │   ├── tecnico.controller.ts
│   │   │       │   │   │   │   ├── jefeTaller.controller.ts
│   │   │       │   │   │   │   └── asistenteTaller.controller.ts
│   │   │       │   │   │   ├── routes/
│   │   │       │   │   │   │   ├── orden.routes.ts
│   │   │       │   │   │   │   ├── equipo.routes.ts
│   │   │       │   │   │   │   ├── tecnico.routes.ts
│   │   │       │   │   │   │   ├── jefeTaller.routes.ts
│   │   │       │   │   │   │   └── asistenteTaller.routes.ts
│   │   │       │   │   │   └── middleware/
│   │   │       │   │   │       ├── auth.middleware.ts
│   │   │       │   │   │       └── validation.middleware.ts
│   │   │       │   │   └── web/
│   │   │       │   │       └── dashboard.controller.ts
│   │   │       │   └── secondary/       <-- Driven Adapters
│   │   │       │       ├── persistence/
│   │   │       │       │   ├── prisma/
│   │   │       │       │   │   ├── repositories/
│   │   │       │       │   │   │   ├── orden.repository.ts
│   │   │       │       │   │   │   ├── equipo.repository.ts
│   │   │       │       │   │   │   ├── tecnico.repository.ts
│   │   │       │       │   │   │   ├── jefeTaller.repository.ts
│   │   │       │       │   │   │   ├── asistenteTaller.repository.ts
│   │   │       │       │   │   │   └── cotizacion.repository.ts
│   │   │       │       │   │   ├── models/
│   │   │       │       │   │   │   └── schema.prisma
│   │   │       │       │   │   └── client.ts
│   │   │       │       │   └── sqlite/
│   │   │       │       │       └── taller.db
│   │   │       │       └── external/
│   │   │       │           ├── repuestos.client.ts    <-- Cliente para API Java
│   │   │       │           └── notification.client.ts
│   │   │       │
│   │   │       └── config/
│   │   │           ├── database.ts
│   │   │           ├── environment.ts
│   │   │           └── dependencies.ts
│   │   │
│   │   ├── tests/
│   │   │   ├── unit/
│   │   │   ├── integration/
│   │   │   └── e2e/
│   │   │
│   │   ├── prisma/
│   │   │   ├── schema.prisma
│   │   │   └── migrations/
│   │   │
│   │   ├── package.json
│   │   ├── tsconfig.json
│   │   ├── server.ts                    <-- Entry point Express
│   │   └── Dockerfile
│   │
│   └── repuestos-service/              <-- ☕ Java (Spring Boot + Hibernate)
│       ├── src/
│       │   └── main/
│       │       ├── java/
│       │       │   └── com/
│       │       │       └── taller/
│       │       │           └── repuestos/
│       │       │               ├── application/     <-- Application Layer
│       │       │               │   ├── facades/
│       │       │               │   │   └── RepuestosFacade.java
│       │       │               │   ├── usecases/
│       │       │               │   │   ├── BuscarRepuesto.java
│       │       │               │   │   ├── ActualizarStock.java
│       │       │               │   │   └── GenerarListaRepuestos.java
│       │       │               │   └── services/
│       │       │               │       └── RepuestosService.java
│       │       │               │
│       │       │               ├── domain/          <-- Domain Core
│       │       │               │   ├── entities/
│       │       │               │   │   └── Repuesto.java
│       │       │               │   ├── repositories/
│       │       │               │   │   └── RepuestoRepository.java
│       │       │               │   └── valueobjects/
│       │       │               │       ├── Precio.java
│       │       │               │       └── Stock.java
│       │       │               │
│       │       │               └── infrastructure/   <-- Infrastructure Layer
│       │       │                   ├── adapters/
│       │       │                   │   ├── primary/  <-- Driving Adapters
│       │       │                   │   │   └── api/
│       │       │                   │   │       └── RepuestosController.java
│       │       │                   │   └── secondary/ <-- Driven Adapters
│       │       │                   │       ├── persistence/
│       │       │                   │       │   ├── hibernate/
│       │       │                   │       │   │   ├── entities/
│       │       │                   │       │   │   │   └── RepuestoEntity.java
│       │       │                   │       │   │   └── repositories/
│       │       │                   │       │   │       └── RepuestoRepositoryImpl.java
│       │       │                   │       │   └── config/
│       │       │                   │       │       └── DatabaseConfig.java
│       │       │                   │       └── external/
│       │       │                   │           └── ProveedorService.java
│       │       │                   │
│       │       │                   └── config/
│       │       │                       └── ApplicationConfig.java
│       │       │
│       │       └── resources/
│       │           ├── application.properties
│       │           └── schema.sql
│       │
│       ├── test/
│       │   └── java/
│       │
│       ├── pom.xml
│       └── Dockerfile
│
├── shared/                              <-- 🔄 Recursos compartidos
│   ├── contracts/                       <-- APIs contracts/schemas
│   │   ├── cliente.json
│   │   ├── orden.json
│   │   ├── equipo.json
│   │   └── repuestos.json
│   ├── docs/
│   │   ├── architecture.md
│   │   ├── api-docs/
│   │   └── database-design/
│   └── scripts/
│       ├── deploy.sh
│       └── database-setup.sql
│
├── docker/                              <-- 🐳 Configuración Docker
│   ├── docker-compose.yml
│   ├── docker-compose.dev.yml
│   └── nginx/
│       └── nginx.conf
│
├── .env.example
├── .gitignore
├── README.md
└── package.json                         <-- Root package.json para scripts globales

Beneficios de esta Estructura

1. Separación por Bounded Context

  • Cada servicio maneja su propio dominio
  • Tecnologías específicas por contexto
  • Bases de datos independientes (si es necesario)

2. Arquitectura Hexagonal en cada Servicio

  • Domain: Lógica de negocio pura
  • Application: Casos de uso y orquestación
  • Infrastructure: Adaptadores externos

3. Comunicación entre Servicios

  • APIs REST bien definidas
  • Contratos compartidos en /shared/contracts/
  • Clientes HTTP en adapters secundarios

4. Escalabilidad

  • Cada servicio puede escalar independientemente
  • Deployment independiente
  • Tecnologías específicas por necesidad

Flujo de Comunicación

Cliente (Python) ←→ Orden/Equipo (TypeScript) ←→ Repuestos (Java)
       ↓                    ↓                        ↓
   SQLite DB           SQLite DB              SQLite/MySQL DB

Ventajas de esta Aproximación

Separación clara de responsabilidadesTecnologías específicas por contextoArquitectura hexagonal bien definidaFacilidad de testingEscalabilidad independienteMantenimiento simplificado

Content is user-generated and unverified.
    Estructura del Proyecto - Arquitectura Hexagonal | Claude