Commit c48e453e authored by Syed Javed Ali's avatar Syed Javed Ali

Added EmployeeMapper class to convert model to dto and viceversa, Added Slf4J for logging

parent b421c25e
...@@ -26,6 +26,9 @@ dependencies { ...@@ -26,6 +26,9 @@ dependencies {
annotationProcessor 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'io.projectreactor:reactor-test' testImplementation 'io.projectreactor:reactor-test'
implementation 'org.mapstruct:mapstruct:1.4.2.Final'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final'
} }
test { test {
......
package com.nisum.example.mongodb.config;
import com.mongodb.reactivestreams.client.MongoClient;
import com.mongodb.reactivestreams.client.MongoClients;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.config.AbstractReactiveMongoConfiguration;
import org.springframework.data.mongodb.core.ReactiveMongoTemplate;
import org.springframework.data.mongodb.repository.config.EnableReactiveMongoRepositories;
@Configuration
@EnableReactiveMongoRepositories(basePackages = "com.nisum.example.mongodb.repository")
public class MongoConfig extends AbstractReactiveMongoConfiguration {
@Value("${port}")
private String port;
@Value("${dbname}")
private String dbName;
@Override
public MongoClient reactiveMongoClient() {
return MongoClients.create();
}
@Override
protected String getDatabaseName() {
return dbName;
}
@Bean
public ReactiveMongoTemplate reactiveMongoTemplate() {
return new ReactiveMongoTemplate(reactiveMongoClient(), getDatabaseName());
}
}
package com.nisum.example.mongodb.controller; package com.nisum.example.mongodb.controller;
import com.nisum.example.mongodb.mapper.EmployeeMapper;
import com.nisum.example.mongodb.model.Employee; import com.nisum.example.mongodb.model.Employee;
import com.nisum.example.mongodb.service.IEmployeeService; import com.nisum.example.mongodb.service.IEmployeeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
...@@ -12,22 +14,29 @@ import reactor.core.publisher.Mono; ...@@ -12,22 +14,29 @@ import reactor.core.publisher.Mono;
/** /**
* Controller class having http POST, GET, UPDATE and DELETE methods * Controller class having http POST, GET, UPDATE and DELETE methods
*/ */
@Slf4j
@RestController @RestController
public class EmployeeController { public class EmployeeController {
@Autowired
EmployeeMapper employeeMapper;
@Autowired @Autowired
private IEmployeeService employeeService; private IEmployeeService employeeService;
/** /**
* POST method to perform record creation * POST method to perform record creation
* @param e * @param employee
* @return Mono * @return Mono
*/ */
@PostMapping(path = "/create") @PostMapping(path = "/create")
@ResponseStatus(HttpStatus.CREATED) @ResponseStatus(HttpStatus.CREATED)
public Mono<Employee> create(@RequestBody Employee e) { public Mono<Employee> create(@RequestBody Employee employee) {
return employeeService.insert(e).log(); log.info("Calling service insert method...");
return employeeService.insert(employeeMapper.toDto(employee))
.map(employeeMapper::toModel)
.log();
} }
/** /**
...@@ -37,10 +46,11 @@ public class EmployeeController { ...@@ -37,10 +46,11 @@ public class EmployeeController {
*/ */
@GetMapping("/{id}") @GetMapping("/{id}")
public Mono<ResponseEntity<Employee>> findById(@PathVariable("id") Integer id) { public Mono<ResponseEntity<Employee>> findById(@PathVariable("id") Integer id) {
log.info("Calling service fetchById method...");
return employeeService.fetchById(id) return employeeService.fetchById(id)
.map(employeeMapper::toModel)
.log() .log()
.map(employee -> new ResponseEntity<>(employee,HttpStatus.OK)) .map(employee -> new ResponseEntity<>(employee,HttpStatus.OK))
.log()
.defaultIfEmpty(new ResponseEntity<>(HttpStatus.NOT_FOUND)); .defaultIfEmpty(new ResponseEntity<>(HttpStatus.NOT_FOUND));
} }
...@@ -51,7 +61,10 @@ public class EmployeeController { ...@@ -51,7 +61,10 @@ public class EmployeeController {
*/ */
@GetMapping("/name/{name}") @GetMapping("/name/{name}")
public Flux<Employee> findByName(@PathVariable("name") String name) { public Flux<Employee> findByName(@PathVariable("name") String name) {
return employeeService.fetchByName(name).log(); log.info("Calling service fetchByName");
return employeeService.fetchByName(name)
.map(employeeMapper::toModel)
.log();
} }
...@@ -59,9 +72,11 @@ public class EmployeeController { ...@@ -59,9 +72,11 @@ public class EmployeeController {
* GET method to fetch all records * GET method to fetch all records
* @return Flux * @return Flux
*/ */
@GetMapping(value = "") @GetMapping(path = "")
public Flux<Employee> findAll() { public Flux<Employee> findAll() {
log.info("Calling service fetchAll() method...");
Flux<Employee> emps = employeeService.fetchAll() Flux<Employee> emps = employeeService.fetchAll()
.map(employeeMapper::toModel)
.log() .log()
.filter(employee -> employee.getSalary()>2000); .filter(employee -> employee.getSalary()>2000);
return emps; return emps;
...@@ -74,16 +89,20 @@ public class EmployeeController { ...@@ -74,16 +89,20 @@ public class EmployeeController {
*/ */
@PutMapping("/update") @PutMapping("/update")
public Mono<Employee> update(@RequestBody Employee emp) { public Mono<Employee> update(@RequestBody Employee emp) {
return employeeService.modify(emp).log(); log.info("Calling service modify() method...");
return employeeService.modify(employeeMapper.toDto(emp))
.map(employeeMapper::toModel)
.log();
} }
@PutMapping("/{id}") @PutMapping("update/{id}")
public Mono<ResponseEntity<Employee>> updateById(@PathVariable("id") Integer id, public Mono<ResponseEntity<Employee>> updateById(@PathVariable("id") Integer id,
@RequestBody Employee employee){ @RequestBody Employee employee){
return employeeService.modifyById(id) return employeeService.modifyById(id)
.flatMap(emp->{ .flatMap(emp->{
emp.setSalary(employee.getSalary()); emp.setSalary(employee.getSalary());
return employeeService.insert(emp); return employeeService.insert(employeeMapper.toDto(employee))
.map(employeeMapper::toModel);
}) })
.log() .log()
.map(updateEmp-> new ResponseEntity<>(updateEmp,HttpStatus.OK)) .map(updateEmp-> new ResponseEntity<>(updateEmp,HttpStatus.OK))
......
package com.nisum.example.mongodb.mapper;
import com.nisum.example.mongodb.model.Employee;
import com.nisum.example.mongodb.model.EmployeeDTO;
import org.mapstruct.Mapper;
@Mapper(componentModel = "spring")
public interface EmployeeMapper {
EmployeeDTO toDto(Employee employee);
Employee toModel(EmployeeDTO employeeDTO);
}
package com.nisum.example.mongodb.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.context.annotation.Scope;
import org.springframework.context.annotation.ScopedProxyMode;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
/**
* DTO class for Employee
* Fields id, name and salary
*/
@Scope(scopeName = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
@Document
@Data
@NoArgsConstructor
@AllArgsConstructor
public class EmployeeDTO {
@Id
private Integer id;
private String name;
private Long salary;
}
package com.nisum.example.mongodb.repository; package com.nisum.example.mongodb.repository;
import com.nisum.example.mongodb.model.Employee; import com.nisum.example.mongodb.model.Employee;
import com.nisum.example.mongodb.model.EmployeeDTO;
import org.springframework.data.mongodb.repository.Query; import org.springframework.data.mongodb.repository.Query;
import org.springframework.data.mongodb.repository.ReactiveMongoRepository; import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
import reactor.core.publisher.Flux; import reactor.core.publisher.Flux;
public interface EmployeeRepository extends ReactiveMongoRepository<Employee,Integer> { public interface EmployeeRepository extends ReactiveMongoRepository<EmployeeDTO,Integer> {
@Query("{ 'name': ?0 }") @Query("{ 'name': ?0 }")
Flux<Employee> findByName(final String name); Flux<Employee> findByName(final String name);
} }
package com.nisum.example.mongodb.service; package com.nisum.example.mongodb.service;
import com.nisum.example.mongodb.model.Employee; import com.nisum.example.mongodb.mapper.EmployeeMapper;
import com.nisum.example.mongodb.model.EmployeeDTO;
import com.nisum.example.mongodb.repository.EmployeeRepository; import com.nisum.example.mongodb.repository.EmployeeRepository;
import lombok.extern.slf4j.Slf4j;
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;
...@@ -11,21 +13,25 @@ import reactor.core.publisher.Mono; ...@@ -11,21 +13,25 @@ import reactor.core.publisher.Mono;
*Service class having methods for CURD operations *Service class having methods for CURD operations
* Methods having Mono<T> and Flux<T> as return types * Methods having Mono<T> and Flux<T> as return types
*/ */
@Slf4j
@Service @Service
public class EmployeeServiceImpl implements IEmployeeService { public class EmployeeServiceImpl implements IEmployeeService {
@Autowired @Autowired
private EmployeeRepository employeeRepository; private EmployeeRepository employeeRepository;
@Autowired
private EmployeeMapper employeeMapper;
/** /**
* perform create operation * perform create operation
* @param emp * @param employeeDTO
* @return Mono * @return Mono
*/ */
@Override @Override
public Mono<Employee> insert(Employee emp) { public Mono<EmployeeDTO> insert(EmployeeDTO employeeDTO) {
log.info("calling repository save method...");
return employeeRepository.save(emp); return employeeRepository.save(employeeDTO);
} }
/** /**
...@@ -34,7 +40,8 @@ public class EmployeeServiceImpl implements IEmployeeService { ...@@ -34,7 +40,8 @@ public class EmployeeServiceImpl implements IEmployeeService {
* @return Mono * @return Mono
*/ */
@Override @Override
public Mono<Employee> fetchById(Integer id) { public Mono<EmployeeDTO> fetchById(Integer id) {
log.info("Calling repository findById...");
return employeeRepository.findById(id); return employeeRepository.findById(id);
} }
...@@ -46,12 +53,15 @@ public class EmployeeServiceImpl implements IEmployeeService { ...@@ -46,12 +53,15 @@ public class EmployeeServiceImpl implements IEmployeeService {
* @return Flux * @return Flux
*/ */
@Override @Override
public Flux<Employee> fetchByName(String name) { public Flux<EmployeeDTO> fetchByName(String name) {
return employeeRepository.findByName(name); log.info("Calling repository fetchByName");
return employeeRepository.findByName(name)
.map(employeeMapper::toDto);
} }
@Override @Override
public Mono<Employee> modifyById(Integer id) { public Mono<EmployeeDTO> modifyById(Integer id) {
return employeeRepository.findById(id); return employeeRepository.findById(id);
} }
...@@ -60,18 +70,20 @@ public class EmployeeServiceImpl implements IEmployeeService { ...@@ -60,18 +70,20 @@ public class EmployeeServiceImpl implements IEmployeeService {
* @return Flux * @return Flux
*/ */
@Override @Override
public Flux<Employee> fetchAll() { public Flux<EmployeeDTO> fetchAll() {
log.info("Calling repository findAll() method..");
return employeeRepository.findAll(); return employeeRepository.findAll();
} }
/** /**
* perform modify of object * perform modify of object
* @param emp * @param empDTO
* @return updated object of type Mono * @return updated object of type Mono
*/ */
@Override @Override
public Mono<Employee> modify(Employee emp) { public Mono<EmployeeDTO> modify(EmployeeDTO empDTO) {
return employeeRepository.save(emp); log.info("Calling repository save() method...");
return employeeRepository.save(empDTO);
} }
/** /**
......
package com.nisum.example.mongodb.service; package com.nisum.example.mongodb.service;
import com.nisum.example.mongodb.model.Employee; import com.nisum.example.mongodb.model.EmployeeDTO;
import reactor.core.publisher.Flux; import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
public interface IEmployeeService { public interface IEmployeeService {
Mono<Employee> insert(Employee emp); Mono<EmployeeDTO> insert(EmployeeDTO emp);
Mono<Employee> fetchById(Integer id); Mono<EmployeeDTO> fetchById(Integer id);
Flux<Employee> fetchByName(String name); Flux<EmployeeDTO> fetchByName(String name);
Flux<Employee> fetchAll(); Flux<EmployeeDTO> fetchAll();
Mono<Employee> modify(Employee emp); Mono<EmployeeDTO> modify(EmployeeDTO emp);
Mono<Employee> modifyById(Integer id); Mono<EmployeeDTO> modifyById(Integer id);
Mono<Void> removeById(Integer id); Mono<Void> removeById(Integer id);
} }
port=27017 spring.data.mongodb.database=testdb
dbname=testdb spring.data.mongodb.port=27017
\ No newline at end of file
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