Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 37 additions & 69 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,84 +1,52 @@
# Yape Code Challenge :rocket:
# SOLUCIÓN

Our code challenge will let you marvel us with your Jedi coding skills :smile:.
La solución que planteé fue entregar poco a poco valor al proyecto, de esta manera simulé que tenía pases a producción.
A través de uso de HU, Tasks, y gitflow para llevar a cabo todos los cambios.

Don't forget that the proper way to submit your work is to fork the repo and create a PR :wink: ... have fun !!
## RAMAS Y SU HU

- [Yape Code Challenge :rocket:](#yape-code-challenge-rocket)
- [Problem](#problem)
- [Tech Stack](#tech-stack)
- [Optional](#optional)
- [Send us your challenge](#send-us-your-challenge)
1. feature/basic-creation-transaction HU - Creación del servicio para guardar una transacción en la base de datos
2. chore/test-configuration FIX - The unit test was corrected and DevOps folder was created
3. feature/basic-retrieve-transaction HU - Creación del servicio para recuperar una transacción de la base de datos
4. feature/cache-transaction HU - Almacenar en cache data que se recupera de la base de datos
5. feature/event-transaction HU - Creación de componentes de mensajería y agregación en la capa service para enviarlo al microservicio de anti fraude para el análisis de las transacciones
7. feature/event-validate-transaction HU - Creación de componentes de mensajería y agregación en la capa service para evaluar las transacciones que llegan como evento y retornar el estado de la validación
8. chore/readme TASK - Creación de README
9. develop RELEASE 0.0.1 - Proyecto local
10. chore/docker-image HU - Contenedorización del microservicio de transacciones financieras
11. chore/docker-image HU - Contenedorización del microservicio de anti fraude
12. develop RELEASE 0.0.2 - Proyecto contenedorizado
13. chore/contract-first HU - Creación de contratos
14. feat/exception-handlers HU - Manejo de errores
15. chore/properties-prd-tested HU - Configuración de propiedades para PRD
16. develop RELEASE 0.0.3 - Propiedades PRD

# Problem
## REPOSITORIOS

Every time a financial transaction is created it must be validated by our anti-fraud microservice and then the same service sends a message back to update the transaction status.
For now, we have only three transaction statuses:
Trabajé dentro de mi cuenta en donde se podrá visualizar el árbol de ramas, los commits y los tags|releases

<ol>
<li>pending</li>
<li>approved</li>
<li>rejected</li>
</ol>
## MS FINANCIAL TRANSACTION

Every transaction with a value greater than 1000 should be rejected.
https://github.com/CiprianoBryan/ms-financial-transaction/releases

```mermaid
flowchart LR
Transaction -- Save Transaction with pending Status --> transactionDatabase[(Database)]
Transaction --Send transaction Created event--> Anti-Fraud
Anti-Fraud -- Send transaction Status Approved event--> Transaction
Anti-Fraud -- Send transaction Status Rejected event--> Transaction
Transaction -- Update transaction Status event--> transactionDatabase[(Database)]
```
## MS ANTIFRAUD

# Tech Stack
https://github.com/CiprianoBryan/ms-antifraud/releases

<ol>
<li>Java. You can use any framework you want</li>
<li>Any database</li>
<li>Kafka</li>
</ol>
## USO DEL PROYECTO

We do provide a `Dockerfile` to help you get started with a dev environment.
- Puede utilizar el tag 0.0.1 si desea el proyecto totalmente local
- Puede utilizar el tag 0.0.2 si desea el proyecto dockerizado
- Puede utilizar el tag 0.0.3 si lleva el proyecto a Kubernetes y utiliza los valores de producción necesarios para cumplir con la alta transaccionalidad

You must have two resources:
## PUNTOS DE MEJORA

1. Resource to create a transaction that must containt:
- En un primer planteamiento tenía pensado utilizar CQRS para optimizar más el tiempo de respuesta, utilizando una base de datos principal y otra réplica, por el tiempo nos quedamos con tener únicamente una base de datos
- Agregar los tests unitarios, el cuál por tiempo tampoco se pudo dar
- Utilizar Quarkus para aprovechar aún más Kubernetes y tener el proyecto más optimizado

```json
{
"accountExternalIdDebit": "Guid",
"accountExternalIdCredit": "Guid",
"tranferTypeId": 1,
"value": 120
}
```
## TENER EN CUENTA

2. Resource to retrieve a transaction

```json
{
"transactionExternalId": "Guid",
"transactionType": {
"name": ""
},
"transactionStatus": {
"name": ""
},
"value": 120,
"createdAt": "Date"
}
```

## Optional

You can use any approach to store transaction data but you should consider that we may deal with high volume scenarios where we have a huge amount of writes and reads for the same data at the same time. How would you tackle this requirement?

You can use Graphql;

# Send us your challenge

When you finish your challenge, after forking a repository, you **must** open a pull request to our repository. There are no limitations to the implementation, you can follow the programming paradigm, modularization, and style that you feel is the most appropriate solution.

If you have any questions, please let us know.
- Usar Reactividad podría generar conflictos por lo que no se recomendaría
- Tener dashboard para monitorear la aplicación (En alguna de las herramientas de observabilidad Dynatrace, New Relic, entre otros)
- Se está agregando los archivos de cada repositorio en este fork junto al .git para que lo pueda descargar y visualizar todo lo trabajado
33 changes: 33 additions & 0 deletions ms-antifraud/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
HELP.md
target/
.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/

### VS Code ###
.vscode/
20 changes: 20 additions & 0 deletions ms-antifraud/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
FROM maven:3.9.12-eclipse-temurin-25-alpine AS builder

WORKDIR /app

COPY pom.xml .
RUN mvn -B -q -e -DskipTests dependency:go-offline

COPY src ./src

RUN mvn clean package -DskipTests

FROM eclipse-temurin:25-jdk

WORKDIR /app

COPY --from=builder /app/target/*.jar app.jar

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "app.jar"]
98 changes: 98 additions & 0 deletions ms-antifraud/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
# MICROSERVICIO DE ANTI FRAUDE

## Descripción

Este microservicio se encarga de revisar y validar las diferentes operaciones del banco (ejm: Transacciones financieras)

## Funcionamiento

Recupera los eventos de un tópico a través de un consumer para luego en la capa service evaluarlo usando las reglas de negocio, una vez evaluado se publica en otro tópico del cual el microservicio del proyecto owner de la operación lo obtendrá con el nuevo estado.

## Diagrama de componentes

Módulo Transaction

```mermaid
flowchart LR

%% ================================
%% EVENT STREAMING LAYER
%% ================================

subgraph Event_Streaming_Kafka_Cluster
TC[TOPIC<br>transaction-created]
TV[TOPIC<br>transaction-validated]
end

%% ================================
%% MICROSERVICE LAYER
%% ================================

subgraph Kubernetes_Cluster
MS[MICROSERVICE<br>ms-antifraud<br>module: Transaction]
end

%% ================================
%% FLOW
%% ================================

MS -->|Consume| TC
MS -->|Publish Result| TV
```

## Levantar el proyecto localmente

1. Levantar kafka, esto ya está incluido en los pasos para levantar el proyecto ms-financial-transaction indicados del README
2. Levantar el proyecto localmente (Active profiles: local), tener instalado Java 25

## Levantar el proyecto usando docker (v0.0.2)

El objetivo de esta versión del proyecto es para que los usuarios técnicos que deseen utilizar el microservicio puedan levantar todos los recursos utilizando docker y probar el funcionamiento del microservicio.

IMPORTANTE: Ubícate en la ruta de la raíz del proyecto

1. Ejecutar los siguientes comandos para levantar cada servicio que son kafka y el microservicio de anti fraude. Además de crear los tópicos.

### Opción 1

- Si el servicio ms-financial-transaction no levantó correctamente es probable que la causa sea porque un servicio anterior falló, debe de reintentar ejecutar el comando en unos 15 segundos aprox.

```bash
$ docker compose up -d
```

### Opción 2

- Tener en cuenta al levantar el servicio ms-financial-transaction deben estar levantados todos los anteriores servicios. Esperar entre cada servicio unos 15 segundos aprox.

```bash
$ docker compose up -d kafka
$ docker compose up -d ms-antifraud
```

### Crear Tópicos

```bash
$ docker exec -it kafka_server bash
$ kafka-topics --bootstrap-server localhost:9092 --create --topic transaction-created --partitions 1 --replication-factor 1
$ kafka-topics --bootstrap-server localhost:9092 --create --topic transaction-validated --partitions 1 --replication-factor 1
```

## Valores a si deseas utilizarlo o probar localmente

- Active profiles: local
- Version 0.0.1: levantar local
- Version 0.0.2: levantar el contenedor

## Valores a usar para la alta transaccionalidad (Utilizar Active Profiles: dev para apuntar a estos valores)

TPS: 8000

Se realizan pruebas de performance utilizando JMeter, de donde obtenemos una configuración recomendable.

### En Kubernetes

- KAFKA
- Número de hilos para consumidores kafka: 3
- Total de consumidores: 6 pods x 3 = 18 consumers
- Cantidad de particiones: 18 (cada consumer podrá consumir de una partición sin bloquearse)
38 changes: 38 additions & 0 deletions ms-antifraud/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
name: yape-resources
services:
zookeeper:
image: confluentinc/cp-zookeeper:5.5.3
container_name: zookeeper_server
environment:
ZOOKEEPER_CLIENT_PORT: 2181
kafka:
image: confluentinc/cp-enterprise-kafka:5.5.3
container_name: kafka_server
depends_on: [ zookeeper ]
environment:
KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://kafka:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_BROKER_ID: 1
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_JMX_PORT: 9991
ports:
- "9092:9092"
ms-antifraud:
build: .
image: ciprianobryan/ms-antifraud:0.0.1
container_name: ms-antifraud
depends_on:
- kafka
ports:
- "8081:8080"
environment:
TRANSACTION_MAX_AMOUNT_TO_BE_APROVED: 1000

KAFKA_BOOTSTRAP_SERVERS: kafka:9092
KAFKA_CONSUMER_GROUP_ID: antifraud-group
KAFKA_TOPIC_TRANSACTION_CREATED: transaction-created
KAFKA_TOPIC_TRANSACTION_VALIDATED: transaction-validated

volumes:
postgres_data:
72 changes: 72 additions & 0 deletions ms-antifraud/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>4.0.3</version>
<relativePath/>
</parent>
<groupId>com.yape</groupId>
<artifactId>ms-antifraud</artifactId>
<version>0.0.3</version>
<name>ms-antifraud</name>
<description>ms-antifraud</description>

<properties>
<java.version>25</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-kafka</artifactId>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>

</project>
Loading