@Service
@AllArgsConstructor
public class CustomerService {
private final CustomerRepository customerRepository;
private final CustomerCriteriaRepository customerCriteriaRepository;
public List<CustomerDto> getAllCustomers(){
return toDtoList(customerRepository.findAll());
}
public Customer addCustomer(CustomerDto customerDto){
Customer customer = toEntity(customerDto);
for (Order order : customer.getOrderList()){
order.setCustomer(customer);
}
return customerRepository.save(customer);
}
public CustomerDto getCustomerById(Long id){
return toDto(customerRepository.findById(id).orElse(null));
}
public List<CustomerDto> getCustomerByCriteria(CustomerDto customerDto){
return toDtoList(customerCriteriaRepository.getCustomerByCriteria(toEntity(customerDto)));
}
public CustomerDto toDto(Customer customer){
return new CustomerDto(customer.getId(), customer.getFirstName(), customer.getLastName(), null, customer.getAge(), customer.getOrderList());
}
public Customer toEntity(CustomerDto customerDto){
Customer customer = new Customer();
customer.setFirstName(customerDto.firstName());
customer.setLastName(customerDto.lastName());
customer.setEmail(customerDto.email());
customer.setAge(customerDto.age());
customer.setOrderList(customerDto.orderList());
return customer;
}
public List<CustomerDto> toDtoList(List<Customer> customers){
List<CustomerDto> customerDtos = new ArrayList<>();
for (Customer customer : customers){
customerDtos.add(toDto(customer));
}
return customerDtos;
}
}
Enter fullscreen mode
Exit fullscreen mode
@RestController
@AllArgsConstructor
@RequestMapping("/customer")
public class CustomerController {
private final CustomerService customerService;
@GetMapping("/all")
public List<CustomerDto> getAllCustomers(){
return customerService.getAllCustomers();
}
@PostMapping("/add")
public Customer addCustomer(@RequestBody CustomerDto customerDto){
return customerService.addCustomer(customerDto);
}
@GetMapping("/{id}")
public CustomerDto getById(@PathVariable("id") Long id){
return customerService.getCustomerById(id);
}
@GetMapping("/criteria")
public List<CustomerDto> getByCriteria(@RequestBody CustomerDto customerDto){
return customerService.getCustomerByCriteria(customerDto);
}
}
Enter fullscreen mode
Exit fullscreen mode
// DataJpaTest for testing database interaction of Customer Repository
@DataJpaTest
public class CustomerRepositoryTest {
@Autowired
private CustomerRepository customerRepository;
@Test
void findOrdersByCustomerId(){
Customer customer = new Customer();
customer.setId(1L);
customer.setFirstName("Harry");
customer.setLastName("Reddington");
customer.setEmail("hreddington@gmx.com");
customer.setAge(39);
Order o1 = new Order();
o1.setId(1L);
o1.setOrderDate("28-05-2025");
o1.setAmount(10.0);
o1.setCustomer(customer);
Order o2 = new Order();
o2.setId(2L);
o2.setOrderDate("30-05-2025");
o2.setAmount(20.0);
o2.setCustomer(customer);
customer.setOrderList(List.of(o1,o2));
customerRepository.save(customer);
List<Order> orders = customerRepository.findOrdersByCustomerId(customer.getId());
assertEquals(2, orders.size());
}
}
Enter fullscreen mode
Exit fullscreen mode
// Unit test for Customer Service using Mockito
@ExtendWith(MockitoExtension.class)
public class CustomerServiceTest {
@Mock
private CustomerRepository customerRepository;
private CustomerCriteriaRepository customerCriteriaRepository;
@InjectMocks
private CustomerService customerService;
@Test
void testGetAllCustomers() {
List<Customer> customerList = List.of(
new Customer(1L, "Sarah", "Miller", 28, "sarah@example.com", null),
new Customer(2L, "Wentworth", "Burrows", 38, "wentworth@example.com", null)
);
when(customerRepository.findAll()).thenReturn(customerList);
List<CustomerDto> result = customerService.getAllCustomers();
assertEquals(2, result.size());
assertEquals("Sarah", result.get(0).firstName());
}
@Test
void testAddCustomer() {
Order order = new Order();
CustomerDto dto = new CustomerDto(null, "Katy", "Pery", "katy@example.com", 30, List.of(order));
Customer savedCustomer = new Customer(1L, "Katy", "Pery", 30, "katy@example.com", List.of(order));
when(customerRepository.save(org.mockito.ArgumentMatchers.any(Customer.class))).thenReturn(savedCustomer);
Customer result = customerService.addCustomer(dto);
assertEquals("Katy", result.getFirstName());
}
@Test
void testGetCustomerById() {
Customer customer = new Customer(1L, "John", "Johnson", 40, "john@example.com", null);
when(customerRepository.findById(1L)).thenReturn(java.util.Optional.of(customer));
CustomerDto dto = customerService.getCustomerById(1L);
assertEquals("John", dto.firstName());
assertEquals("Johnson", dto.lastName());
assertEquals(40, dto.age());
assertEquals(null, dto.email());
}
@Test
void testGetCustomerByCriteria() {
Customer customer = new Customer(1L, "Sara", "Miller", 25, "sara@example.com", null);
when(customerCriteriaRepository.getCustomerByCriteria(org.mockito.ArgumentMatchers.any()))
.thenReturn(List.of(customer));
CustomerDto criteria = new CustomerDto(null, "Sara", "Miller", "sara@example.com", 25, null);
List<CustomerDto> result = customerService.getCustomerByCriteria(criteria);
assertEquals(1, result.size());
}
}
Enter fullscreen mode
Exit fullscreen mode
// WebMvcTest for testing Customer Controller REST endpoints
@WebMvcTest(controllers = CustomerController.class)
@AutoConfigureMockMvc(addFilters = false)
public class CustomerControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private CustomerService customerService;
@Autowired
private ObjectMapper objectMapper;
@Test
void getAllCustomers() throws Exception{
CustomerDto customerDto1 = new CustomerDto(1L, "Tibor", "Focu", null, 45, null);
CustomerDto customerDto2 = new CustomerDto(2L, "Lady", "Gaga", null, 43, null);
List<CustomerDto> customerDtoList = Arrays.asList(customerDto1, customerDto2);
when(customerService.getAllCustomers()).thenReturn(customerDtoList);
ResultActions result = mockMvc.perform(get("/customer")
.contentType(MediaType.APPLICATION_JSON));
result.andExpect(status().isOk())
.andExpect(jsonPath("$[0].firstName", CoreMatchers.is("Tibor")))
.andExpect(jsonPath("$[1].firstName", CoreMatchers.is("Lady")));
}
}
Enter fullscreen mode
Exit fullscreen mode
// Custom repository for dynamic customer queries using JPA Criteria API
@Repository
public class CustomerCriteriaRepository {
@Autowired
private EntityManager entityManager;
public List<Customer> getCustomerByCriteria(Customer customer){
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Customer> query = cb.createQuery(Customer.class);
Root<Customer> root = query.from(Customer.class);
Predicate firstNamePredicate = cb.like(root.get("firstName"), customer.getFirstName());
Predicate lastNamePredicate = cb.like(root.get("lastName"), customer.getLastName());
Predicate agePredicate = cb.equal(root.get("age"), customer.getAge());
Predicate firstNameAndAge = cb.and(firstNamePredicate, agePredicate);
Predicate lastNameAndAge = cb.and(lastNamePredicate, agePredicate);
Predicate orPredicate = cb.or(firstNameAndAge, lastNameAndAge);
query.where(orPredicate);
return entityManager.createQuery(query).getResultList();
}
}
Enter fullscreen mode
Exit fullscreen mode
// Simple client for sending tasks to a server via socket
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 1234);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
System.out.println("To-Do client started. Type tasks, 'list' to view all, or 'exit' to quit.");
String userInput;
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput);
String response;
while ((response = in.readLine()) != null) {
if (response.equals("END")) break;
System.out.println("Server: " + response);
if (!userInput.equalsIgnoreCase("list")) break;
}
if (userInput.equalsIgnoreCase("exit")) break;
}
socket.close();
}
}
Enter fullscreen mode
Exit fullscreen mode
// Simple server for managing a to-do list via socket
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(1234);
System.out.println("Server running...");
List<String> todoList = new ArrayList<>();
Socket clientSocket = serverSocket.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
String inputLine;
while ((inputLine = in.readLine()) != null) {
if (inputLine.equalsIgnoreCase("exit")) {
out.println("Closing connection.");
break;
} else if (inputLine.equalsIgnoreCase("list")) {
out.println("To-Do List:");
for (int i = 0; i < todoList.size(); i++) {
out.println((i + 1) + ". " + todoList.get(i));
}
out.println("END");
} else {
todoList.add(inputLine);
out.println("Task added: " + inputLine);
}
}
clientSocket.close();
serverSocket.close();
}
}
Enter fullscreen mode
Exit fullscreen mode
Top comments (0)