From ad6c268a298a602124b8aa070d7b15831f501051 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 5 Nov 2025 13:43:20 +0530 Subject: [PATCH 1/2] Add HealthTest controller for application health check endpoint --- .../example/ead_backend/controller/HealthTest.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/main/java/com/example/ead_backend/controller/HealthTest.java diff --git a/src/main/java/com/example/ead_backend/controller/HealthTest.java b/src/main/java/com/example/ead_backend/controller/HealthTest.java new file mode 100644 index 0000000..354764e --- /dev/null +++ b/src/main/java/com/example/ead_backend/controller/HealthTest.java @@ -0,0 +1,14 @@ +package com.example.ead_backend.controller; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/health") +public class HealthTest { + @GetMapping + public String healthTest(){ + return "App is running..."; + } +} \ No newline at end of file From 67800cd306b654d1ee453b06caed57644ee0dc6d Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 5 Nov 2025 19:25:54 +0530 Subject: [PATCH 2/2] Implement Employee management features with CRUD operations and health check endpoints --- .../ead_backend/config/SecurityConfig.java | 2 + .../controller/EmployeeController.java | 57 +++++++++++++++++++ .../example/ead_backend/dto/EmployeeDTO.java | 35 ++++++------ .../exceptions/EmployeeNotFoundException.java | 12 ++++ .../ead_backend/mapper/EmployeeMapper.java | 28 +++++++++ .../ead_backend/model/entity/Employee.java | 16 ++---- .../ead_backend/service/EmployeeService.java | 4 ++ .../service/impl/EmployeeServiceImpl.java | 29 +++++++++- 8 files changed, 153 insertions(+), 30 deletions(-) create mode 100644 src/main/java/com/example/ead_backend/exceptions/EmployeeNotFoundException.java create mode 100644 src/main/java/com/example/ead_backend/mapper/EmployeeMapper.java diff --git a/src/main/java/com/example/ead_backend/config/SecurityConfig.java b/src/main/java/com/example/ead_backend/config/SecurityConfig.java index 2ccff87..7521f38 100644 --- a/src/main/java/com/example/ead_backend/config/SecurityConfig.java +++ b/src/main/java/com/example/ead_backend/config/SecurityConfig.java @@ -39,6 +39,8 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti .requestMatchers("/api/password/forgot", "/api/password/verify-otp", "/api/password/reset").permitAll() .requestMatchers("/api/password/change").authenticated() .requestMatchers("/api/admin/**").hasRole("ADMIN") + .requestMatchers("/api/health/**").permitAll() + .requestMatchers("/api/employee/**").permitAll() // .requestMatchers("/api/employee/**").hasAnyRole("EMPLOYEE", "ADMIN") // .requestMatchers("/api/customer/**").hasAnyRole("CUSTOMER", "EMPLOYEE", "ADMIN") .anyRequest().authenticated()) diff --git a/src/main/java/com/example/ead_backend/controller/EmployeeController.java b/src/main/java/com/example/ead_backend/controller/EmployeeController.java index 00c6afc..1b917b3 100644 --- a/src/main/java/com/example/ead_backend/controller/EmployeeController.java +++ b/src/main/java/com/example/ead_backend/controller/EmployeeController.java @@ -1,5 +1,62 @@ package com.example.ead_backend.controller; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.example.ead_backend.dto.EmployeeCreateDTO; +import com.example.ead_backend.exceptions.EmployeeNotFoundException; +import com.example.ead_backend.service.EmployeeService; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequestMapping("/api/employee") +@RequiredArgsConstructor public class EmployeeController { + private final EmployeeService employeeService; + + @GetMapping("/{id}") + public ResponseEntity getEmployeeById(@PathVariable Long id) { + if(id == null){ + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); + } + try{ + EmployeeCreateDTO employeeDTO = employeeService.getEmployeeById(id); + return new ResponseEntity<>(employeeDTO, HttpStatus.OK); + }catch (EmployeeNotFoundException e){ + e.printStackTrace(); + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + }catch (Exception e){ + e.printStackTrace(); + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @PutMapping("/{id}") + public ResponseEntity updateEmployee( + @PathVariable Long id, + @RequestBody EmployeeCreateDTO dto) { + + if (id == null || dto == null) { + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); + } + try{ + EmployeeCreateDTO updated = employeeService.updateEmployee(id, dto); + return new ResponseEntity<>(updated,HttpStatus.OK); + }catch (EmployeeNotFoundException e){ + e.printStackTrace(); + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + }catch (Exception e){ + e.printStackTrace(); + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + } + } } diff --git a/src/main/java/com/example/ead_backend/dto/EmployeeDTO.java b/src/main/java/com/example/ead_backend/dto/EmployeeDTO.java index 188c5dc..e019a9b 100644 --- a/src/main/java/com/example/ead_backend/dto/EmployeeDTO.java +++ b/src/main/java/com/example/ead_backend/dto/EmployeeDTO.java @@ -1,20 +1,21 @@ -package com.example.ead_backend.dto; +// package com.example.ead_backend.dto; -import java.io.Serializable; -import java.time.LocalDate; +// import java.io.Serializable; +// import java.time.LocalDate; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; +// import lombok.AllArgsConstructor; +// import lombok.Data; +// import lombok.NoArgsConstructor; -@AllArgsConstructor -@NoArgsConstructor -@Data -public class EmployeeDTO implements Serializable { - private String employeeId; - private String name; - private String email; - private String password; - private String specialization; - private LocalDate joinedDate; -} +// @AllArgsConstructor +// @NoArgsConstructor +// @Data +// public class EmployeeDTO implements Serializable { +// private Long employeeId; +// private String firstName; +// private String lastName; +// private String email; +// private String password; +// private String specialization; +// private LocalDate joinedDate; +// } diff --git a/src/main/java/com/example/ead_backend/exceptions/EmployeeNotFoundException.java b/src/main/java/com/example/ead_backend/exceptions/EmployeeNotFoundException.java new file mode 100644 index 0000000..cc6331c --- /dev/null +++ b/src/main/java/com/example/ead_backend/exceptions/EmployeeNotFoundException.java @@ -0,0 +1,12 @@ +package com.example.ead_backend.exceptions; + +public class EmployeeNotFoundException extends RuntimeException { + public EmployeeNotFoundException() { + } + + public EmployeeNotFoundException(String message) { + } + + public EmployeeNotFoundException(String message, Throwable cause) { + } +} diff --git a/src/main/java/com/example/ead_backend/mapper/EmployeeMapper.java b/src/main/java/com/example/ead_backend/mapper/EmployeeMapper.java new file mode 100644 index 0000000..2fa5818 --- /dev/null +++ b/src/main/java/com/example/ead_backend/mapper/EmployeeMapper.java @@ -0,0 +1,28 @@ +package com.example.ead_backend.mapper; + +import org.mapstruct.*; + +import com.example.ead_backend.dto.EmployeeCreateDTO; +import com.example.ead_backend.model.entity.Employee; + +@Mapper(componentModel = "spring", nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE) +public interface EmployeeMapper { + + // Map Employee Entity to DTO + @Mapping(source = "user.firstName", target = "firstName") + @Mapping(source = "user.lastName", target = "lastName") + @Mapping(source = "user.email", target = "email") + @Mapping(source = "joinedDate", target = "joinedDate") + EmployeeCreateDTO toDTO(Employee employee); + + // Update existing Employee from DTO + @Mapping(source = "firstName", target = "user.firstName") + @Mapping(source = "lastName", target = "user.lastName") + @Mapping(source = "email", target = "user.email") + @Mapping(target = "joinedDate", ignore = true) + @Mapping(target = "id", ignore = true) + @Mapping(target = "role", ignore = true) + @Mapping(target = "appointments", ignore = true) + @Mapping(target = "projects", ignore = true) + void updateEntityFromDTO(EmployeeCreateDTO dto, @MappingTarget Employee employee); +} diff --git a/src/main/java/com/example/ead_backend/model/entity/Employee.java b/src/main/java/com/example/ead_backend/model/entity/Employee.java index 9ba0bc0..8f816db 100644 --- a/src/main/java/com/example/ead_backend/model/entity/Employee.java +++ b/src/main/java/com/example/ead_backend/model/entity/Employee.java @@ -30,11 +30,11 @@ public class Employee { @Column(nullable = false) private LocalDate joinedDate; -// @OneToMany(mappedBy = "employee", cascade = CascadeType.ALL, orphanRemoval = true) -// private List appointments; -// -// @OneToMany(mappedBy = "employee", cascade = CascadeType.ALL, orphanRemoval = true) -// private List projects; + @OneToMany(mappedBy = "employee", cascade = CascadeType.ALL, orphanRemoval = true) + private List appointments; + + @OneToMany(mappedBy = "employee", cascade = CascadeType.ALL, orphanRemoval = true) + private List projects; public Employee(User user, Role role, LocalDate joinedDate) { this.user = user; @@ -42,8 +42,4 @@ public Employee(User user, Role role, LocalDate joinedDate) { this.joinedDate = joinedDate; } } - @OneToMany(mappedBy = "employee", cascade = CascadeType.ALL, orphanRemoval = true) - private List appointments; - @OneToMany(mappedBy = "employee", cascade = CascadeType.ALL, orphanRemoval = true) - private List projects; -} + diff --git a/src/main/java/com/example/ead_backend/service/EmployeeService.java b/src/main/java/com/example/ead_backend/service/EmployeeService.java index ec48467..3fa1bf4 100644 --- a/src/main/java/com/example/ead_backend/service/EmployeeService.java +++ b/src/main/java/com/example/ead_backend/service/EmployeeService.java @@ -1,5 +1,6 @@ package com.example.ead_backend.service; +import com.example.ead_backend.dto.EmployeeCreateDTO; import com.example.ead_backend.model.entity.Employee; import com.example.ead_backend.model.entity.User; import com.example.ead_backend.model.enums.Role; @@ -9,4 +10,7 @@ public interface EmployeeService { Employee createEmployee(User user, Role role, LocalDate joinedDate); Employee findByUserId(Long userId); + + EmployeeCreateDTO getEmployeeById(Long id); + EmployeeCreateDTO updateEmployee(Long id, EmployeeCreateDTO dto); } diff --git a/src/main/java/com/example/ead_backend/service/impl/EmployeeServiceImpl.java b/src/main/java/com/example/ead_backend/service/impl/EmployeeServiceImpl.java index 918da41..3739dd4 100644 --- a/src/main/java/com/example/ead_backend/service/impl/EmployeeServiceImpl.java +++ b/src/main/java/com/example/ead_backend/service/impl/EmployeeServiceImpl.java @@ -1,21 +1,27 @@ package com.example.ead_backend.service.impl; +import com.example.ead_backend.dto.EmployeeCreateDTO; +import com.example.ead_backend.mapper.EmployeeMapper; import com.example.ead_backend.model.entity.Employee; import com.example.ead_backend.model.entity.User; import com.example.ead_backend.model.enums.Role; import com.example.ead_backend.repository.EmployeeRepository; import com.example.ead_backend.service.EmployeeService; -import org.springframework.beans.factory.annotation.Autowired; + +import lombok.RequiredArgsConstructor; + import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; @Service +@Transactional +@RequiredArgsConstructor public class EmployeeServiceImpl implements EmployeeService { - @Autowired - private EmployeeRepository employeeRepository; + private final EmployeeRepository employeeRepository; + private final EmployeeMapper employeeMapper; @Override @Transactional @@ -31,4 +37,21 @@ public Employee createEmployee(User user, Role role, LocalDate joinedDate) { public Employee findByUserId(Long userId) { return employeeRepository.findByUserId(userId).orElse(null); } + + @Override + public EmployeeCreateDTO getEmployeeById(Long id) { + Employee employee = employeeRepository.findById(id) + .orElseThrow(() -> new RuntimeException("Employee not found with id: " + id)); + return employeeMapper.toDTO(employee); + } + + @Override + public EmployeeCreateDTO updateEmployee(Long id, EmployeeCreateDTO dto) { + Employee employee = employeeRepository.findById(id) + .orElseThrow(() -> new RuntimeException("Employee not found with id: " + id)); + + employeeMapper.updateEntityFromDTO(dto, employee); + + return employeeMapper.toDTO(employee); + } }