Skip to content

AndreyRivera13/banking-core-platform

Repository files navigation

Banking Core Platform

Sistema bancario en microservicios basado en el scaffold de Bancolombia (co.com.bancolombia.cleanArchitecture), con Clean Architecture, DDD y todos los protocolos requeridos para el assessment de seniority.


Estructura del proyecto

banking-core-platform/
├── ms-api-gateway/             ← Gateway JWT + CircuitBreaker + RateLimit
├── ms-account-service/         ← Cuentas bancarias (WebFlux + R2DBC + Redis + MongoDB)
├── ms-transaction-service/     ← Transferencias (JPA + SOAP servidor + SOAP cliente)
├── ms-loan-service/            ← Créditos (DDD Aggregate Root + RSocket + Kafka)
├── ms-fraud-service/           ← Fraude (Kafka + RSocket + LIFO/FIFO queues)
├── ms-notification-service/    ← Notificaciones (RabbitMQ + WebSocket STOMP)
├── terraform/                  ← IaC AWS (ECS Fargate, RDS, MSK, ElastiCache, DocumentDB)
├── scripts/
│   └── init-databases.sql      ← Creación automática de BDs
├── docker-compose.yml          ← Infraestructura local completa
├── .gitlab-ci.yml              ← Pipeline CI/CD (test→sonar→build→docker→security→deploy)
├── Dockerfile.template         ← Multi-stage build (copiar en cada servicio)
└── setup-all-services.sh       ← Script que genera todos los proyectos con el plugin

Cómo generar el proyecto desde cero

# Requisitos: Java 21, Gradle 9.2.1+
chmod +x setup-all-services.sh
bash setup-all-services.sh

Esto ejecuta el plugin de Bancolombia en cada microservicio:

# Ejemplo de lo que hace internamente para ms-loan-service:
./gradlew ca --package=co.com.banking.loan --type=reactive --name=Loan --lombok=true --java-version=21
./gradlew gep --type=webflux --authorization=true
./gradlew gep --type=rsocket
./gradlew gda --type=r2dbc
./gradlew gda --type=asynceventbus --eda=true --tech=kafka
./gradlew gm --name=Loan
./gradlew gm --name=LoanAmount
./gradlew guc --name=RequestLoan
./gradlew gat   # BDD acceptance tests

Mapa de competencias del assessment

Competencias en 3 → objetivo 4-5

Servicio Competencia Qué demuestra
ms-transaction-service Protocolos SOAP como servidor (@Endpoint) + cliente (WebServiceGatewaySupport)
ms-notification-service Protocolos WebSocket STOMP (CONNECT → SUBSCRIBE → MESSAGE → DISCONNECT)
ms-fraud-service Protocolos RSocket con streaming reactivo (LIFO/FIFO de colas de prioridad)
ms-transaction-service SQL TCL SAVEPOINT, ROLLBACK TO SAVEPOINT, stored procedures, índices, vistas, triggers
ms-account-service Caché Redis Cache-Aside, Write-Through, Read-Through, Write-Behind — comparativa
ms-loan-service Pruebas BDD Cucumber con ./gradlew gat, escenarios Given/When/Then
ms-fraud-service NoSQL CAP MongoDB (AP) vs PostgreSQL (CP) — justificación con ejemplos bancarios
ms-account-service Concurrencia ExecutorService, Callable, Runnable, CompletableFuture, Virtual Threads

Competencias en 0 → cubrir

Servicio Competencia Qué demuestra
ms-loan-service DDD Loan (Aggregate Root), LoanAmount / InterestRate (Value Objects), CreditPolicy (Domain Service)
Todos Clean Architecture Estructura domain/modeldomain/usecaseinfrastructure/entry-pointsinfrastructure/driven-adapters
ms-loan-service Patrones GoF Factory Method, Builder, Strategy (políticas crédito), State (estados préstamo), Observer (Kafka)
ms-api-gateway Patrones tolerancia CircuitBreaker, Retry, RateLimit, Bulkhead, Fallback con Resilience4j
ms-fraud-service EDA Kafka (eventos de dominio, FIFO por partición) + RabbitMQ (DLQ, TTL)
terraform/ DevSecOps + IaC Terraform → ECS Fargate, RDS, MSK, ElastiCache, DocumentDB, ALB/TLS, Secrets Manager
ms-api-gateway Seguridad OWASP A01 JWT, A02 BCrypt+TLS, A03 queries parametrizadas, A05 Actuator restringido, A06 Trivy

SOAP — Integración completa (servidor + cliente)

Contexto bancario real

ms-transaction-service expone un endpoint SOAP para bancos legacy que consultan disponibilidad de fondos. Al mismo tiempo actúa como cliente SOAP hacia un banco externo para confirmar transferencias interbancarias.

Como servidor SOAP (entry-point generado con gep --type=generic --name=SoapEndpoint)

// infrastructure/entry-points/soap-endpoint/
@Endpoint
public class FundsVerificationEndpoint {
    private static final String NAMESPACE = "http://banking.co.com/ws/funds";

    @PayloadRoot(namespace = NAMESPACE, localPart = "CheckFundsRequest")
    @ResponsePayload
    public CheckFundsResponse checkFunds(@RequestPayload CheckFundsRequest request) {
        // Llama al UseCase del dominio — sin romper Clean Architecture
        return fundsUseCase.check(request.getAccountId(), request.getAmount());
    }
}

Como cliente SOAP (driven-adapter generado con gda --type=restconsumer)

// infrastructure/driven-adapters/soap-client/
public class InterBankSoapClient extends WebServiceGatewaySupport {
    public ConfirmTransferResponse confirmTransfer(String bankCode, BigDecimal amount) {
        ConfirmTransferRequest request = new ConfirmTransferRequest();
        request.setBankCode(bankCode);
        request.setAmount(amount);
        return (ConfirmTransferResponse) getWebServiceTemplate()
            .marshalSendAndReceive("http://legacy-bank:8090/ws", request);
    }
}

WSDL generado automáticamente

Con Spring-WS, el WSDL se genera desde el XSD:

GET http://localhost:8082/ws/funds.wsdl

Colas LIFO y FIFO — ms-fraud-service

// FIFO: Revisión normal de transacciones sospechosas (orden de llegada)
private final Queue<FraudAlert> normalQueue = new LinkedList<>();

// LIFO: Fraude crítico — lo más reciente primero (más urgente)
private final Deque<FraudAlert> criticalStack = new ArrayDeque<>();

public void enqueue(FraudAlert alert) {
    if (alert.getSeverity() == Severity.CRITICAL) {
        criticalStack.push(alert);   // LIFO — push al tope
    } else {
        normalQueue.offer(alert);    // FIFO — al final de la cola
    }
}

public FraudAlert dequeue() {
    // Prioridad: primero críticos (LIFO), luego normales (FIFO)
    if (!criticalStack.isEmpty()) return criticalStack.pop();
    return normalQueue.poll();
}

SQL Avanzado — ms-transaction-service

-- SAVEPOINT en transferencia bancaria
BEGIN;
  UPDATE accounts SET balance = balance - 500 WHERE id = 'ACC-001';
  SAVEPOINT after_debit;

  UPDATE accounts SET balance = balance + 500 WHERE id = 'ACC-002';

  -- Si el acreditamiento falla, solo revertimos hasta el SAVEPOINT
  -- ROLLBACK TO SAVEPOINT after_debit;

COMMIT;

-- Stored Procedure para cálculo de comisión
CREATE OR REPLACE PROCEDURE calculate_transfer_fee(
  p_amount NUMERIC, p_account_type VARCHAR, OUT p_fee NUMERIC
) LANGUAGE plpgsql AS $$
BEGIN
  p_fee := CASE
    WHEN p_account_type = 'PREMIUM' THEN 0
    WHEN p_amount > 1000000         THEN p_amount * 0.001
    ELSE                                 2500
  END;
END;
$$;

Cómo correr localmente

# 1. Levantar infraestructura
docker-compose up -d postgres mongodb redis kafka rabbitmq

# 2. Generar proyectos (primera vez)
bash setup-all-services.sh

# 3. Correr un servicio
cd ms-loan-service && ./gradlew bootRun

# 4. Validar arquitectura (ArchUnit)
./gradlew validateStructure

# 5. Tests BDD
./gradlew test

Variables de entorno requeridas

Crear un .env en la raíz (no subir al repositorio):

JWT_SECRET=banking-jwt-secret-key-very-long-for-hs256-algorithm-min-32chars
DB_PASSWORD=banking123
SONAR_HOST_URL=http://localhost:9000
SONAR_TOKEN=your-sonar-token

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors