diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000000..ab1f4164ed
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,10 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Ignored default folder with query files
+/queries/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
+# Editor-based HTTP Client requests
+/httpRequests/
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000000..2733fb773c
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000000..63e9001932
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
new file mode 100644
index 0000000000..178046e38e
--- /dev/null
+++ b/.idea/jarRepositories.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000000..82dbec8ad2
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000000..a9c09d3cb6
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000000..35eb1ddfbb
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000000..1d2a032dcd
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,12 @@
+FROM maven:3.9.6-eclipse-temurin-17 AS build
+WORKDIR /app
+COPY pom.xml .
+RUN mvn dependency:go-offline
+COPY src ./src
+RUN mvn clean package -DskipTests
+
+FROM eclipse-temurin:17-jre-alpine
+WORKDIR /app
+COPY --from=build /app/target/*.jar app.jar
+EXPOSE 8080
+ENTRYPOINT ["java", "-jar", "app.jar"]
\ No newline at end of file
diff --git a/app-nodejs-codechallenge.iml b/app-nodejs-codechallenge.iml
new file mode 100644
index 0000000000..68a9707efd
--- /dev/null
+++ b/app-nodejs-codechallenge.iml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000000..a8320df3e5
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,64 @@
+
+
+ 4.0.0
+
+ com.transactions
+ transaction-system
+ 1.0.0
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 3.2.0
+
+
+
+ 17
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
+
+ org.springframework.kafka
+ spring-kafka
+
+
+
+ com.h2database
+ h2
+ runtime
+
+
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/com/transactions/TransactionApplication.java b/src/main/java/com/transactions/TransactionApplication.java
new file mode 100644
index 0000000000..404cd1ab97
--- /dev/null
+++ b/src/main/java/com/transactions/TransactionApplication.java
@@ -0,0 +1,18 @@
+package com.transactions;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableAsync;
+
+@SpringBootApplication
+@EnableAsync
+public class TransactionApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(TransactionApplication.class, args);
+ System.out.println("🚀 Transaction Service started on port 8080");
+ System.out.println("📊 H2 Console: http://localhost:8080/h2-console");
+ System.out.println("📝 JDBC URL: jdbc:h2:mem:transactionsdb");
+ System.out.println("👤 Username: sa");
+ System.out.println("🔑 Password: (empty)");
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/transactions/controller/TransactionController.java b/src/main/java/com/transactions/controller/TransactionController.java
new file mode 100644
index 0000000000..f9f24e243d
--- /dev/null
+++ b/src/main/java/com/transactions/controller/TransactionController.java
@@ -0,0 +1,49 @@
+package com.transactions.controller;
+
+import com.transactions.model.dto.CreateTransactionRequest;
+import com.transactions.model.dto.TransactionResponse;
+import com.transactions.service.TransactionService;
+import jakarta.validation.Valid;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+@RestController
+@RequestMapping("/api/v1/transactions")
+@RequiredArgsConstructor
+public class TransactionController {
+
+ private final TransactionService transactionService;
+
+ @PostMapping
+ public ResponseEntity createTransaction(
+ @Valid @RequestBody CreateTransactionRequest request) {
+ TransactionResponse response = transactionService.createTransaction(request);
+ return ResponseEntity.status(HttpStatus.CREATED).body(response);
+ }
+
+ @GetMapping("/{id}")
+ public ResponseEntity getTransaction(@PathVariable UUID id) {
+ TransactionResponse response = transactionService.getTransaction(id);
+ return ResponseEntity.ok(response);
+ }
+
+ @GetMapping
+ public ResponseEntity> getAllTransactions() {
+ List responses = transactionService.getAllTransactions();
+ return ResponseEntity.ok(responses);
+ }
+
+ @GetMapping("/health")
+ public ResponseEntity