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
33 changes: 33 additions & 0 deletions .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/
58 changes: 58 additions & 0 deletions anti-fraud-app/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>java-code-challenge</artifactId>
<groupId>com.interbank.anti.fraud</groupId>
<version>1.0.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>anti-fraud-app</artifactId>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.interbank.anti.fraud</groupId>
<artifactId>anti-fraud-core</artifactId>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.interbank.anti.fraud.app.AntiFraudApplication</mainClass>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<skip>false</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<compilerArgs>
<arg>-Xlint:all</arg>
<arg>-Xlint:-processing</arg>
</compilerArgs>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.interbank.anti.fraud.app;

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication(scanBasePackages = "com.interbank.anti.fraud")
public class AntiFraudApplication extends SpringBootServletInitializer {

public static void main(String[] args) {
new SpringApplicationBuilder(AntiFraudApplication.class)
.initializers()
.run(args);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.interbank.anti.fraud.app.config;

import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

@Configuration
@EnableJpaRepositories("com.interbank.anti.fraud.core.repository")
@EntityScan("com.interbank.anti.fraud")
public class JpaConfiguration {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.interbank.anti.fraud.app.config;

import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.common.serialization.StringDeserializer;
import org.apache.kafka.common.serialization.StringSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.annotation.EnableKafka;
import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
import org.springframework.kafka.core.*;

import java.util.HashMap;
import java.util.Map;

@EnableKafka
@Configuration
public class KafkaConfig {

@Bean
public ProducerFactory<String, String> producerFactory() {
Map<String, Object> configProps = new HashMap<>();
configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
return new DefaultKafkaProducerFactory<>(configProps);
}

@Bean
public KafkaTemplate<String, String> kafkaTemplate() {
return new KafkaTemplate<>(producerFactory());
}

@Bean
public ConsumerFactory<String, String> consumerFactory() {
Map<String, Object> props = new HashMap<>();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
props.put(ConsumerConfig.GROUP_ID_CONFIG, "group-prueba-fraude");
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
return new DefaultKafkaConsumerFactory<>(props);
}

@Bean
public ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(consumerFactory());
return factory;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.interbank.anti.fraud.app.controller;

import com.interbank.anti.fraud.app.facade.AntiFraudFacade;
import com.interbank.anti.fraud.core.dto.FraudDetailRequestDto;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
@RequestMapping("/anti-fraud")
public class AntiFraudController {
private final AntiFraudFacade antiFraudFacade;

@PostMapping("/register")
public ResponseEntity<Void> registerOperation(@RequestBody FraudDetailRequestDto fraudDetailRequestDto) {
antiFraudFacade.registerOperation(fraudDetailRequestDto);
return new ResponseEntity<>(HttpStatus.CREATED);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.interbank.anti.fraud.app.facade;

import com.interbank.anti.fraud.core.dto.FraudDetailRequestDto;
import com.interbank.anti.fraud.core.service.AntiFraudService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

@Component
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class AntiFraudFacade {

private final AntiFraudService antiFraudService;

public void registerOperation(FraudDetailRequestDto fraudDetailRequestDto) {
this.antiFraudService.registerOperation(fraudDetailRequestDto);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.interbank.anti.fraud.app.kafka.suscriptor;

import com.interbank.anti.fraud.core.service.AntiFraudService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Service;

@Service
@Slf4j
@RequiredArgsConstructor
public class KafkaConsumerService {
private final AntiFraudService antiFraudService;

@KafkaListener(topics = "fraud-topic", groupId = "group-prueba-fraude")
public void listen(String message) {
try {
log.info("[ANTI-FRAUD-KAFKA] Recived init...");
antiFraudService.validOperation(Long.parseLong(message));
log.info("[ANTI-FRAUD-KAFKA] Recived end");
} catch (Exception e) {
log.error("[ANTI-FRAUD-KAFKA] message:{}, trace:{}", e.getMessage(), e);
}
}
}
29 changes: 29 additions & 0 deletions anti-fraud-app/src/main/resources/application.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
spring.application.name=anti-fraud
server.port=8090
# Configuraci�n de postgresql
spring.datasource.url=jdbc:postgresql://localhost:5432/AntiFraud
spring.datasource.username=postgres
spring.datasource.password=admin
spring.datasource.driver-class-name=org.postgresql.Driver

spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

# Configuraci�n del servidor Kafka
spring.kafka.consumer.bootstrap-servers=localhost:9092
spring.kafka.consumer.auto-offset-reset=earliest
spring.kafka.consumer.enable-auto-commit=false
spring.kafka.consumer.max-poll-records=500
spring.kafka.consumer.properties.spring.json.trusted.packages=*

spring.kafka.listener.concurrency=5

# Configuraci�n del productor Kafka
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer

# Configuraci�n del consumidor Kafka
spring.kafka.consumer.group-id=group-prueba-fraude
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
9 changes: 9 additions & 0 deletions anti-fraud-app/src/main/resources/bootstrap.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
server:
port: 8080
servlet:
context-path: /anti-fraud
spring:
application:
name: anti-fraud
main:
allow-bean-definition-overriding: true
44 changes: 44 additions & 0 deletions anti-fraud-core/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>java-code-challenge</artifactId>
<groupId>com.interbank.anti.fraud</groupId>
<version>1.0.0</version>
</parent>

<artifactId>anti-fraud-core</artifactId>

<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.4.2.Final</version>
</dependency>
</dependencies>
<modelVersion>4.0.0</modelVersion>


<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.interbank.anti.fraud.app.AntiFraudApplication</mainClass>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<compilerArgs>
<arg>-Xlint:all</arg>
<arg>-Xlint:-processing</arg>
</compilerArgs>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.interbank.anti.fraud.core.domain;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.io.Serializable;

@Entity
@Getter
@Setter
public class AntiFraudDetail extends BaseEntity implements Serializable {

private static final long serialVersionUID = 2934008372670552374L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String accountExternalIdDebit;
private String accountExternalIdCredit;
private String tranferTypeId;
private String value;
private String status;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.interbank.anti.fraud.core.domain;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.Column;
import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import java.io.Serializable;
import java.time.LocalDateTime;

@Getter
@Setter
@ToString
@MappedSuperclass
@EntityListeners({AuditingEntityListener.class})
public class BaseEntity implements Serializable {
private static final long serialVersionUID = -6990628184361464179L;

@Column(name = "createdAt", updatable = false)
@CreatedDate
protected LocalDateTime createdAt;

}
Loading