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
42 changes: 42 additions & 0 deletions application.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
server:
port: 33400


spring:
kafka:
group-id: midas-core-group
consumer:
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
properties:
spring.json.trusted.packages: "*"
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.springframework.kafka.support.serializer.JsonSerializer

datasource:
url: jdbc:h2:file:./db/midasdb
driver-class-name: org.h2.Driver
username: admin
password: password
jpa:
database-platform: org.hibernate.dialect.H2Dialect
hibernate:
ddl-auto: update
show-sql: true

h2:
console:
enabled: true
path: /db-console
settings:
web-allow-others: false



kafka:
topic:
transaction: transactions

general:
kafka-topic: transactions
Binary file added db/midasdb.mv.db
Binary file not shown.
62 changes: 61 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,68 @@
<name>midas-core</name>
<description>Midas Core</description>
<properties>
<java.version>17</java.version>
<java.version>22</java.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-jpa -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>3.2.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.2.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.kafka/spring-kafka -->
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
<version>3.1.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.2.224</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>3.2.5</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.kafka/spring-kafka-test -->
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka-test</artifactId>
<version>3.1.4</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.testcontainers/kafka -->
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>kafka</artifactId>
<version>1.19.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>

<build>
Expand All @@ -25,6 +84,7 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

</plugins>
</build>

Expand Down
12 changes: 12 additions & 0 deletions src/main/java/com/jpmc/midascore/configurations/Appconfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.jpmc.midascore.configurations;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class Appconfig {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
62 changes: 62 additions & 0 deletions src/main/java/com/jpmc/midascore/configurations/KafkaConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package com.jpmc.midascore.configurations;


import com.jpmc.midascore.foundation.Transaction;
import lombok.Value;
import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.admin.NewTopic;
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 org.springframework.kafka.support.serializer.JsonDeserializer;
import org.springframework.kafka.support.serializer.JsonSerializer;

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


@Configuration
@EnableKafka
public class KafkaConfig {


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

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

@Bean
public ConsumerFactory<String, Transaction> consumerFactory() {
Map<String, Object> config = new HashMap<>();
config.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,"localhost:9092");
config.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
config.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JsonDeserializer.class);
config.put(JsonDeserializer.TRUSTED_PACKAGES,"*");
config.put(ConsumerConfig.GROUP_ID_CONFIG, "midas-core-group");
return new DefaultKafkaConsumerFactory<>(config,new StringDeserializer(),new JsonDeserializer<>(Transaction.class));
}

@Bean
public ConcurrentKafkaListenerContainerFactory<String, Transaction> kafkaListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory<String, Transaction> factory = new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(consumerFactory());
return factory;
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.jpmc.midascore.consumer;

import com.jpmc.midascore.foundation.Transaction;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Service;

@Service
public class KafkaConsumerService {
@KafkaListener(topics = "${kafka.topic.transaction}",
groupId = "midas-core-group",
containerFactory = "kafkaListenerContainerFactory")
public void listen(Transaction transaction) {
System.out.println("Transaction from topic "+transaction);
}
}
31 changes: 31 additions & 0 deletions src/main/java/com/jpmc/midascore/controller/BalanceController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.jpmc.midascore.controller;

import com.jpmc.midascore.entity.UserRecord;
import com.jpmc.midascore.foundation.Balance;
import com.jpmc.midascore.repository.UserRepository;
import org.springframework.web.bind.annotation.*;

import java.util.Optional;

@RestController

public class BalanceController {

private final UserRepository userRepository;

public BalanceController(UserRepository userRepository) {
this.userRepository = userRepository;
}

@GetMapping("/balance")
public Balance getBalance(@RequestParam("userId") Long userId) {
Optional<UserRecord> user=userRepository.findById(userId);

float balance= 0.0F;
if(user.isPresent()){
balance=user.get().getBalance();
}
return new Balance(balance);

}
}
40 changes: 40 additions & 0 deletions src/main/java/com/jpmc/midascore/entity/TransactionRecord.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.jpmc.midascore.entity;

import jakarta.persistence.*;
import lombok.*;

import java.math.BigDecimal;

@Entity
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TransactionRecord {

public TransactionRecord(UserRecord sender, UserRecord recipient, float amount) {
this.Sender = sender;
this.Recipient = recipient;
this.amount = amount;

}

@Id
@GeneratedValue()
private long id;

@ManyToOne
@JoinColumn(name = "sender_id")
private UserRecord Sender;

@ManyToOne
@JoinColumn(name = "recipent_id")
private UserRecord Recipient;

private float amount;




}
11 changes: 11 additions & 0 deletions src/main/java/com/jpmc/midascore/entity/UserRecord.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package com.jpmc.midascore.entity;

import jakarta.persistence.*;
import org.apache.catalina.LifecycleState;

import java.math.BigDecimal;
import java.util.List;

@Entity
public class UserRecord {
Expand All @@ -15,6 +19,13 @@ public class UserRecord {
@Column(nullable = false)
private float balance;

@OneToMany(mappedBy = "Sender")
private List<TransactionRecord> senderTransactions;

@OneToMany(mappedBy = "Recipient")
private List<TransactionRecord> recipientTransactions ;


protected UserRecord() {
}

Expand Down
5 changes: 5 additions & 0 deletions src/main/java/com/jpmc/midascore/foundation/Transaction.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
package com.jpmc.midascore.foundation;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@JsonIgnoreProperties(ignoreUnknown = true)
public class Transaction {
private long senderId;
private long recipientId;
private float amount;
private float incentive;

public Transaction() {
}
Expand Down
10 changes: 10 additions & 0 deletions src/main/java/com/jpmc/midascore/models/Incentive.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.jpmc.midascore.models;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class Incentive {
private float amount;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.jpmc.midascore.repository;

import com.jpmc.midascore.entity.TransactionRecord;
import com.jpmc.midascore.entity.UserRecord;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface TransactionRepository extends CrudRepository<TransactionRecord,Long> {
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,6 @@

public interface UserRepository extends CrudRepository<UserRecord, Long> {
UserRecord findById(long id);

UserRecord findByName(String name);
}
Loading