Commit db8e0602 authored by Kenil Mavani's avatar Kenil Mavani

updating the project with comments

parent 502d14a4
package com.example.kafka.consumer; package com.example.kafka.consumer;
import com.example.kafka.service.OrderServiceImpl; import com.example.kafka.service.OrderServiceImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.annotation.KafkaListener; import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
/**
* Message consumer class :: to consume messages from kafka topics
*/
@Component @Component
public class MessageConsumer { public class MessageConsumer {
private static final Logger log = LoggerFactory.getLogger(MessageConsumer.class.getName());
@Autowired @Autowired
private OrderServiceImpl orderService; private OrderServiceImpl orderService;
/**
* read message method define to consume messages from kafka
* @param order the message
*/
@KafkaListener(topics = "${app.topic.name}",groupId = "group1") @KafkaListener(topics = "${app.topic.name}",groupId = "group1")
public void readMessage(String order){ public void readMessage(String order){
orderService.validateOrder(order).doOnNext(log.info("order has been validated")); orderService.validateOrder(order);
} }
} }
...@@ -7,6 +7,9 @@ import org.springframework.http.HttpStatus; ...@@ -7,6 +7,9 @@ import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
/**
* Order controller for order related apis
*/
@RestController @RestController
@RequestMapping("/v1/order") @RequestMapping("/v1/order")
public class OrderController { public class OrderController {
...@@ -14,6 +17,11 @@ public class OrderController { ...@@ -14,6 +17,11 @@ public class OrderController {
@Autowired @Autowired
private OrderServiceImpl orderService; private OrderServiceImpl orderService;
/**
* Save order api for creating new order
* @param order The order
* @return The mono object of Order
*/
@PostMapping("/save") @PostMapping("/save")
@ResponseStatus(HttpStatus.ACCEPTED) @ResponseStatus(HttpStatus.ACCEPTED)
public Mono<Order> saveOrderDetails(@RequestBody Order order){ public Mono<Order> saveOrderDetails(@RequestBody Order order){
......
...@@ -9,6 +9,10 @@ import org.springframework.web.bind.annotation.*; ...@@ -9,6 +9,10 @@ import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux; import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
/**
* User controller for CRUD operation of user activities
*/
@RestController @RestController
@RequestMapping("/v1/user") @RequestMapping("/v1/user")
public class UserController { public class UserController {
...@@ -16,16 +20,31 @@ public class UserController { ...@@ -16,16 +20,31 @@ public class UserController {
@Autowired @Autowired
private UserServiceImpl userService; private UserServiceImpl userService;
/**
* Create user
* @param user The user
* @return The mono of User
*/
@PostMapping("/create") @PostMapping("/create")
@ResponseStatus(HttpStatus.ACCEPTED) @ResponseStatus(HttpStatus.ACCEPTED)
public Mono<User> createUser(@RequestBody User user){ public Mono<User> createUser(@RequestBody User user){
return userService.createUser(user); return userService.createUser(user);
} }
/**
* Display all users data
* @return The Flux of user
*/
@GetMapping("/all") @GetMapping("/all")
public Flux<User> getAllUsers(){ public Flux<User> getAllUsers(){
return userService.getAllUsers(); return userService.getAllUsers();
} }
/**
* Fetch particular user by user id
* @param userId The userId
* @return ResponseEntity of user
*/
@GetMapping("/{userId}") @GetMapping("/{userId}")
public Mono<ResponseEntity<User>> getUserById(@PathVariable String userId){ public Mono<ResponseEntity<User>> getUserById(@PathVariable String userId){
Mono<User> user = userService.findById(userId); Mono<User> user = userService.findById(userId);
...@@ -33,6 +52,12 @@ public class UserController { ...@@ -33,6 +52,12 @@ public class UserController {
.defaultIfEmpty(ResponseEntity.notFound().build()); .defaultIfEmpty(ResponseEntity.notFound().build());
} }
/**
* Update the user data
* @param userId The userId
* @param user The user data
* @return ResponseEntity of user
*/
@PutMapping("/{userId}") @PutMapping("/{userId}")
public Mono<ResponseEntity<User>> updateUserById(@PathVariable String userId, @RequestBody User user){ public Mono<ResponseEntity<User>> updateUserById(@PathVariable String userId, @RequestBody User user){
return userService.updateUser(userId,user) return userService.updateUser(userId,user)
......
...@@ -7,6 +7,10 @@ import lombok.*; ...@@ -7,6 +7,10 @@ import lombok.*;
import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Document;
/**
* Order entity class which has define all properties for Order class
*/
@Data @Data
@ToString @ToString
@EqualsAndHashCode(of={"id","name"}) @EqualsAndHashCode(of={"id","name"})
...@@ -15,16 +19,29 @@ import org.springframework.data.mongodb.core.mapping.Document; ...@@ -15,16 +19,29 @@ import org.springframework.data.mongodb.core.mapping.Document;
@JsonInclude(JsonInclude.Include.NON_NULL) @JsonInclude(JsonInclude.Include.NON_NULL)
@Document(value = "orders") @Document(value = "orders")
public class Order { public class Order {
/**
* Order id
*/
@Id @Id
@JsonProperty(value = "id") @JsonProperty(value = "id")
private String id; private String id;
/**
* Order's name
*/
@JsonProperty(value = "name") @JsonProperty(value = "name")
private String name; private String name;
/**
* Order amount
*/
@JsonProperty(value = "amount") @JsonProperty(value = "amount")
private double amount; private double amount;
/**
* Order status
*/
@JsonProperty(value = "orderStatus") @JsonProperty(value = "orderStatus")
private OrderStatus orderStatus; private OrderStatus orderStatus;
} }
...@@ -4,6 +4,9 @@ import lombok.*; ...@@ -4,6 +4,9 @@ import lombok.*;
import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Document;
/**
* User entity class model for user details
*/
@ToString @ToString
@EqualsAndHashCode(of = {"id","name"}) @EqualsAndHashCode(of = {"id","name"})
@AllArgsConstructor @AllArgsConstructor
...@@ -12,9 +15,24 @@ import org.springframework.data.mongodb.core.mapping.Document; ...@@ -12,9 +15,24 @@ import org.springframework.data.mongodb.core.mapping.Document;
@Document(value = "users") @Document(value = "users")
public class User { public class User {
/**
* User id
*/
@Id @Id
private String id; private String id;
/**
* User name
*/
private String name; private String name;
/**
* User's age
*/
private int age; private int age;
/**
* User's balance
*/
private double balance; private double balance;
} }
package com.example.kafka.enumerator; package com.example.kafka.enumerator;
/**
* Enumerator for Order Status
*/
public enum OrderStatus { public enum OrderStatus {
ACCEPTED,REJECTED; ACCEPTED,REJECTED;
} }
package com.example.kafka.producer; package com.example.kafka.producer;
import com.example.kafka.entity.Order;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -8,6 +7,9 @@ import org.springframework.beans.factory.annotation.Value; ...@@ -8,6 +7,9 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.kafka.core.KafkaTemplate; import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
/**
* Message producer class to produce messages into kafka topic
*/
@Component("/msgProducer") @Component("/msgProducer")
public class MessageProducer { public class MessageProducer {
...@@ -19,6 +21,10 @@ public class MessageProducer { ...@@ -19,6 +21,10 @@ public class MessageProducer {
@Value("${app.topic.name}") @Value("${app.topic.name}")
private String topicName; private String topicName;
/**
* Publish the order to kafka topic
* @param order The order
*/
public void publishOrder(String order){ public void publishOrder(String order){
template.send(topicName,order); template.send(topicName,order);
log.info("published order {} ::",order); log.info("published order {} ::",order);
......
...@@ -2,8 +2,9 @@ package com.example.kafka.repository; ...@@ -2,8 +2,9 @@ package com.example.kafka.repository;
import com.example.kafka.entity.Order; import com.example.kafka.entity.Order;
import org.springframework.data.mongodb.repository.ReactiveMongoRepository; import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
import org.springframework.stereotype.Repository;
@Repository /**
* Order repository to perform DB actions on order
*/
public interface OrderRepository extends ReactiveMongoRepository<Order,String> { public interface OrderRepository extends ReactiveMongoRepository<Order,String> {
} }
...@@ -3,5 +3,8 @@ package com.example.kafka.repository; ...@@ -3,5 +3,8 @@ package com.example.kafka.repository;
import com.example.kafka.entity.User; import com.example.kafka.entity.User;
import org.springframework.data.mongodb.repository.ReactiveMongoRepository; import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
/**
* User repository to perform DB actions on User
*/
public interface UserRepository extends ReactiveMongoRepository<User,String> { public interface UserRepository extends ReactiveMongoRepository<User,String> {
} }
...@@ -4,10 +4,12 @@ import com.example.kafka.entity.Order; ...@@ -4,10 +4,12 @@ import com.example.kafka.entity.Order;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
/**
* Order service
*/
public interface OrderService { public interface OrderService {
Mono<Order> saveOrderIntoDB(Order order) throws JsonProcessingException;
Mono<Order> findById(String userId); Mono<Order> saveOrderIntoDB(Order order) throws JsonProcessingException;
Mono<Order> validateOrder(String order); void validateOrder(String order);
} }
...@@ -10,11 +10,11 @@ import org.slf4j.Logger; ...@@ -10,11 +10,11 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import java.util.Map; /**
* OrderServiceImpl is implementation of OrderService class
*/
@Service @Service
public class OrderServiceImpl implements OrderService { public class OrderServiceImpl implements OrderService {
...@@ -28,6 +28,12 @@ public class OrderServiceImpl implements OrderService { ...@@ -28,6 +28,12 @@ public class OrderServiceImpl implements OrderService {
@Autowired @Autowired
private MessageProducer messageProducer; private MessageProducer messageProducer;
/**
* Save order data into DB
* @param order The order
* @return The mono of order
*/
@Override @Override
public Mono<Order> saveOrderIntoDB(Order order){ public Mono<Order> saveOrderIntoDB(Order order){
try { try {
...@@ -39,37 +45,22 @@ public class OrderServiceImpl implements OrderService { ...@@ -39,37 +45,22 @@ public class OrderServiceImpl implements OrderService {
return orderRepository.save(order); return orderRepository.save(order);
} }
@Override
public Mono<Order> findById(String orderId){
return orderRepository.findById(orderId);
}
/**
* Validate the order to either accept or reject
* @param orderJson The order json
*/
@Override @Override
public Mono<Order> validateOrder(String orderJson) { public void validateOrder(String orderJson) {
// try { try {
return orderRepository.findById("1") ObjectMapper mapper = new ObjectMapper();
.flatMap(dbOrder -> { Order order = mapper.readValue(orderJson,Order.class);
dbOrder.setOrderStatus(OrderStatus.REJECTED); userService.findById(order.getId()).flatMap(user -> {
return orderRepository.save(dbOrder); order.setOrderStatus(order.getAmount()<=user.getBalance() ? OrderStatus.ACCEPTED : OrderStatus.REJECTED);
}); return orderRepository.save(order);
// ObjectMapper mapper = new ObjectMapper(); }).subscribe();
// Order order = mapper.readValue(orderJson,Order.class); } catch(JsonProcessingException e) {
// double amount = order.getAmount(); log.error("Caught Exception :: {} ",e);
// double balance = userService.findById(order.getId()).block().getBalance(); }
// OrderStatus orderStatus;
// if(amount>balance) {
// orderStatus=OrderStatus.REJECTED;
// } else {
// orderStatus=OrderStatus.ACCEPTED;
// }
// Order dbOrder = orderRepository.findById(order.getId()).block();
// if(dbOrder!=null)
// {
// dbOrder.setOrderStatus(orderStatus);
// }
// orderRepository.save(dbOrder);
// } catch(JsonProcessingException e) {
// log.error("Caught Exception {}:: ",e);
// }
} }
} }
package com.example.kafka.service; package com.example.kafka.service;
import com.example.kafka.entity.Order;
import com.example.kafka.entity.User; import com.example.kafka.entity.User;
import reactor.core.publisher.Flux; import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
/**
* UserService
*/
public interface UserService { public interface UserService {
Mono<User> createUser(User user); Mono<User> createUser(User user);
......
package com.example.kafka.service; package com.example.kafka.service;
import com.example.kafka.entity.Order;
import com.example.kafka.entity.User; import com.example.kafka.entity.User;
import com.example.kafka.enumerator.OrderStatus;
import com.example.kafka.repository.OrderRepository;
import com.example.kafka.repository.UserRepository; import com.example.kafka.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux; import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
/**
* UserServiceImpl is implementation of UserService class
*/
@Service @Service
public class UserServiceImpl implements UserService { public class UserServiceImpl implements UserService {
@Autowired @Autowired
private UserRepository userRepository; private UserRepository userRepository;
@Autowired
private OrderRepository orderRepository;
/**
* Create user into DB
* @param user The user
* @return The mono user
*/
@Override @Override
public Mono<User> createUser(User user){ public Mono<User> createUser(User user){
return userRepository.save(user); return userRepository.save(user);
} }
/**
* Get all users
* @return The flux user
*/
@Override @Override
public Flux<User> getAllUsers(){ public Flux<User> getAllUsers(){
return userRepository.findAll(); return userRepository.findAll();
} }
/**
* Find user by id
* @param userId The userId
* @return The mono user
*/
@Override @Override
public Mono<User> findById(String userId){ public Mono<User> findById(String userId){
return userRepository.findById(userId); return userRepository.findById(userId);
} }
/**
* Update the User details
* @param userId The userId
* @param user The user
* @return The mono user
*/
@Override @Override
public Mono<User> updateUser(String userId, User user){ public Mono<User> updateUser(String userId, User user){
return userRepository.findById(userId) return userRepository.findById(userId).flatMap(dbUser -> {
.flatMap(dbUser -> {
dbUser.setAge(user.getAge()); dbUser.setAge(user.getAge());
dbUser.setBalance(user.getBalance()); dbUser.setBalance(user.getBalance());
return userRepository.save(dbUser); return userRepository.save(dbUser);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment