Loading repository data…
Loading repository data…
solano2020 / repository
This project is a code base for implementing hexagonal architecture with other design patterns, using Java with Quarkus. Its objective is to be a serverless service like Lambda on AWS that handles the reception and sending of policies issued to intermediaries and insurance companies.
Emission-notification es un microservicio encargado de enviar notificaciones relacionadas con emisiones de pólizas.
Permite:
Este proyecto está construido con:
El servicio sigue una arquitectura limpia basada en principios modernos:
Arquitectura Hexagonal
Separación clara entre dominio, aplicación e infraestructura.
Tell, Don't Ask
El dominio valida su propio estado.
Abstract Factory (Infraestructura)
Selección desacoplada del canal de envío:
flowchart LR
Producer[Producer<br/>Lambda u otro servicio] -->|SendMessage| SQS[(Amazon SQS Queue)]
SQS -->|Evento de emisión| EN[Emission-Notification]
EN -->|JDBC 1521| RDS[(Oracle DB)]
EN -->|Webservice Email SMS| CH[Canales de notificación]
EN -->|Logs y métricas| CW[CloudWatch]
EN -->|Error / reintentos agotados| DLQ[(Amazon SQS DLQ)]
flowchart LR
%% AWS Network / Runtime View
Producer[Producer<br/>Lambda u otro servicio] -->|SendMessage| SQS[(Amazon SQS<br/>Queue)]
Producer -->|SendMessage| DLQ[(Amazon SQS<br/>DLQ)]
subgraph VPC[AWS VPC]
direction LR
subgraph PUB[Public Subnets]
direction TB
IGW[Internet Gateway]
NAT[NAT Gateway]
ALB[Application Load Balancer<br/>opcional si se expone REST]
end
subgraph PRIV_APP[Private Subnets - App]
direction TB
ECS[ECS Fargate o EKS<br/>Quarkus Microservice<br/>Emission Notification]
CW[CloudWatch<br/>Logs and Metrics]
end
subgraph PRIV_DB[Private Subnets - DB]
direction TB
RDS[(Amazon RDS Oracle<br/>o Oracle en EC2)]
end
VPCE[VPC Endpoint Interface<br/>for SQS]
ALB -->|HTTP HTTPS| ECS
ECS -->|JDBC 1521| RDS
ECS -->|ReceiveMessage DeleteMessage| VPCE
VPCE --> SQS
ECS -->|If no VPCE via NAT| NAT
NAT --> IGW
ECS -->|Logs and metrics| CW
end
SQS -->|Deliver message| ECS
ECS -->|On failure retries| SQS
SQS -->|MaxReceiveCount| DLQ
Client[Ops Client<br/>opcional] -->|HTTPS| ALB
flowchart LR
%% =========================
%% Producer
%% =========================
Producer["Producer<br/>Lambda u otro servicio"] -->|SendMessage| SQS["Amazon SQS Queue"]
Producer -->|Error routing| DLQ["Amazon SQS DLQ"]
%% =========================
%% AWS VPC
%% =========================
subgraph VPC["AWS VPC"]
direction LR
subgraph PUB["Public Subnets"]
direction TB
IGW["Internet Gateway"]
NAT["NAT Gateway"]
ALB["Application Load Balancer<br/>opcional si se expone REST"]
end
subgraph PRIV_APP["Private Subnets - App"]
direction TB
LQ["AWS Lambda (Quarkus)<br/>Emission Notification<br/>On-Demand"]
CW["CloudWatch Logs and Metrics"]
end
subgraph PRIV_DB["Private Subnets - DB"]
direction TB
RDS[("Amazon RDS Oracle<br/>o Oracle en EC2")]
end
VPCE["VPC Endpoint Interface for SQS"]
%% REST opcional
ALB -->|HTTP HTTPS dev| LQ
%% Base de datos
LQ -->|JDBC 1521| RDS
%% Acceso a SQS desde VPC
LQ -->|Receive Delete| VPCE
VPCE --> SQS
%% Si no se usa VPCE
LQ -.->|If no VPCE via NAT| NAT
NAT --> IGW
%% Observabilidad
LQ -->|Logs and metrics| CW
end
%% =========================
%% Flujo principal
%% =========================
SQS -->|Trigger Lambda| LQ
LQ -->|On failure retry| SQS
SQS -->|MaxReceiveCount| DLQ
Client["Ops Client opcional"] -->|HTTPS| ALB
src/main/java/org/microservices/notification_emission
├── application
│ ├── qualifier
│ │ └── ChannelAdapter.java
│ └── servcice
│ ├── SendEmissionNotificationService.java
│ ├── SendEmissionNotificationUseCase.java
│ └── dto
│ ├── SendEmissionNotificationRequest.java
│ ├── SendEmissionNotificationResponse.java
│ └── data
│ ├── EmissionDto.java
│ ├── ShippingChannel.java
│ └── VehicleRegistrationDto.java
├── domain
│ ├── model
│ │ ├── Emission.java
│ │ ├── EmissionNotification.java
│ │ ├── VehicleRegistration.java
│ │ └── vo
│ │ ├── Plaque.java
│ │ ├── ShippingChannel.java
│ │ └── StatusNotification.java
│ ├── ports
│ │ ├── channel
│ │ │ └── ChannelNotificationSender.java
│ │ ├── dao
│ │ └── repository
│ │ ├── EmissionRepository.java
│ │ └── NotificationEmissionRepository.java
│ └── service
│ └── NotificationEmissionDomainService.java
└── infrastructure
├── configuration
├── exeptions
├── input
│ ├── rest
│ │ └── EmissionNotificationController.java
│ └── sqs
└── output
├── channel
│ ├── ChannelNotificationAdapter.java
│ ├── factory
│ │ ├── ChannelFactoryProvider.java
│ │ ├── ChannelNotificationSenderAbstractFactory.java
│ │ ├── EmailFactory.java
│ │ ├── SmsFactory.java
│ │ └── WsFactory.java
│ └── impl
│ ├── EmailChannelNotificationSender.java
│ ├── SmsChannelNotificationSender.java
│ └── WsChannelNotificationSender.java
└── database
└── oracle
├── EmissionOracleAdapter.java
├── NotificationEmissionOracleAdapter.java
└── Entity
└── NotificationEmissionEntity.java
./mvnw quarkus:dev
./mvnw package
java -jar target/quarkus-app/quarkus-run.jar
./mvnw test