diff --git a/fileLogger b/fileLogger new file mode 100644 index 0000000..e69de29 diff --git a/fileLogger.1 b/fileLogger.1 new file mode 100644 index 0000000..e69de29 diff --git a/fileLogger.1.lck b/fileLogger.1.lck new file mode 100644 index 0000000..e69de29 diff --git a/fileLogger.lck b/fileLogger.lck new file mode 100644 index 0000000..e69de29 diff --git a/pom.xml b/pom.xml index 04ef2c9..060a6ac 100644 --- a/pom.xml +++ b/pom.xml @@ -28,6 +28,20 @@ spring-boot-starter-web + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + org.springframework.boot + spring-boot-devtools + runtime + + + org.projectlombok + lombok + true + mysql mysql-connector-java diff --git a/src/main/java/com/ausy_technologies/demospring/Controller/.UserController.java.swp b/src/main/java/com/ausy_technologies/demospring/Controller/.UserController.java.swp new file mode 100644 index 0000000..55a34b5 Binary files /dev/null and b/src/main/java/com/ausy_technologies/demospring/Controller/.UserController.java.swp differ diff --git a/src/main/java/com/ausy_technologies/demospring/Controller/UserController.java b/src/main/java/com/ausy_technologies/demospring/Controller/UserController.java index 97265cb..6d69edc 100644 --- a/src/main/java/com/ausy_technologies/demospring/Controller/UserController.java +++ b/src/main/java/com/ausy_technologies/demospring/Controller/UserController.java @@ -1,9 +1,13 @@ package com.ausy_technologies.demospring.Controller; +import com.ausy_technologies.demospring.Exceptions.ErrorResponse; import com.ausy_technologies.demospring.Model.DAO.Role; import com.ausy_technologies.demospring.Model.DAO.User; import com.ausy_technologies.demospring.Service.UserService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -18,59 +22,154 @@ public class UserController { @PostMapping("/addRole") - public Role saveRole(@RequestBody Role role) { - - + public ResponseEntity saveRole(@RequestBody Role role) { Role roleAdded = this.userService.saveRole(role); - return roleAdded; + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Response ","saveRole"); + return ResponseEntity.status(HttpStatus.CREATED).headers(httpHeaders).body(roleAdded); } @PostMapping("/addUser") - public User saveUser(@RequestBody User user) { + public ResponseEntity saveUser(@RequestBody User user) { User userAdded = this.userService.saveUser(user); - return userAdded; + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Response","saveUser"); + return ResponseEntity.status(HttpStatus.ACCEPTED).headers(httpHeaders).body(userAdded); } @PostMapping("/addUser2/{idRole}") - public User saveUser2(@RequestBody User user, @PathVariable int idRole) + public ResponseEntity saveUser2(@RequestBody User user, @PathVariable int idRole) { - return this.userService.saveUser2(user,idRole); + User usedAdded = userService.saveUser2(user,idRole); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Response","saveUser2"); + return ResponseEntity.status(HttpStatus.OK).headers(httpHeaders).body(usedAdded); } @PostMapping("/addUser3/{roleList}") - public User saveUser3(@RequestBody User user , @PathVariable List roleList) + public ResponseEntity saveUser3(@RequestBody User user , @PathVariable List roleList) { - return this.userService.saveUser3(user,roleList); + User userAdded = userService.saveUser3(user,roleList); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Response","saveUser3"); + return ResponseEntity.status(HttpStatus.CREATED).headers(httpHeaders).body(userAdded); } - @GetMapping("/findRoleBy/{id}") - public Role findRoleById(@PathVariable int id) + @GetMapping("/getRole/{id}") + public ResponseEntity findRoleById(@PathVariable int id) { - return this.userService.findRoleById(id); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Response","findRoleById"); + Role roleSearched = null; + try { + roleSearched = this.userService.findRoleById(id); + }catch (ErrorResponse e){ + ErrorResponse.LogError(e); + return ResponseEntity.status(HttpStatus.NOT_FOUND).headers(httpHeaders).body(null); + } + + return ResponseEntity.status(HttpStatus.FOUND).headers(httpHeaders).body(roleSearched); } @GetMapping("/findAllRoles") - public List findAllRoles() + public ResponseEntity> findAllRoles() { - return userService.findAllRoles(); + List allRoles = userService.findAllRoles(); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Response","findAllRoles"); + if(allRoles.size() == 0 ){ + return ResponseEntity.status(HttpStatus.NO_CONTENT).headers(httpHeaders).body(null); + } + return ResponseEntity.status(HttpStatus.FOUND).headers(httpHeaders).body(allRoles); } @GetMapping("/allUsers") - public List findAllUsers() + public ResponseEntity> findAllUsers() { - return this.userService.findAllUsers(); + List allUsers = this.userService.findAllUsers(); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Response","findAllUsers"); + if(allUsers.size() == 0 ){ + return ResponseEntity.status(HttpStatus.NO_CONTENT).headers(httpHeaders).body(null); + } + return ResponseEntity.status(HttpStatus.FOUND).headers(httpHeaders).body(allUsers); } - @DeleteMapping("/deleteUserById/{id}") + @DeleteMapping("/deleteUser/{id}") public void deleteUser(@PathVariable int id) { this.userService.deleteUserById(id); } + @PutMapping("/updateUser") + public ResponseEntity updateUser(@RequestParam int id, @RequestBody User user){ + User updatedUser = null; + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Response","updateUser"); + try{ + updatedUser = userService.updateUser(id,user); + + }catch (ErrorResponse errorResponse){ + ErrorResponse.LogError(errorResponse); + return ResponseEntity.status(HttpStatus.NOT_FOUND).headers(httpHeaders).body(null); + } + + return ResponseEntity.status(HttpStatus.RESET_CONTENT).headers(httpHeaders).body(updatedUser); + } + + @PutMapping("/updateUser2/{roleList}") + public ResponseEntity updateUser2(@RequestParam int id , @PathVariable List roleList){ + User updatedUser = null ; + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Response","updateUser"); + try{ + updatedUser = userService.updateUser2(id,roleList); + }catch (ErrorResponse e){ + ErrorResponse.LogError(e); + return ResponseEntity.status(HttpStatus.NOT_FOUND).headers(httpHeaders).body(null); + } + + return ResponseEntity.status(HttpStatus.RESET_CONTENT).headers(httpHeaders).body(updatedUser); + } + + @PutMapping("/updateRole/{name}") + public ResponseEntity updateRole(@PathVariable String name, @RequestParam int id){ + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Response","updateRole"); + Role updatedRole = null; + try { + updatedRole = userService.updateRole(id,name); + }catch (ErrorResponse e){ + ErrorResponse.LogError(e); + return ResponseEntity.status(HttpStatus.NOT_FOUND).headers(httpHeaders).body(null); + } + + return ResponseEntity.status(HttpStatus.RESET_CONTENT).headers(httpHeaders).body(updatedRole); + } + + @DeleteMapping("deleteRole/{id}") + public void deleteRolebyId(@PathVariable int id){ + userService.deleteRolebyId(id); + } + + @GetMapping("getUser/{id}") + public ResponseEntity findUserById(@PathVariable int id){ + User searchedUser = null ; + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Response","getuser"); + try{ + searchedUser = userService.findUserById(id); + }catch (ErrorResponse e){ + ErrorResponse.LogError(e); + return ResponseEntity.status(HttpStatus.NOT_FOUND).headers(httpHeaders).body(null); + } + return ResponseEntity.status(HttpStatus.FOUND).headers(httpHeaders).body(searchedUser); + } + } diff --git a/src/main/java/com/ausy_technologies/demospring/DemospringApplication.java b/src/main/java/com/ausy_technologies/demospring/DemospringApplication.java index 76466f6..0ee1d00 100644 --- a/src/main/java/com/ausy_technologies/demospring/DemospringApplication.java +++ b/src/main/java/com/ausy_technologies/demospring/DemospringApplication.java @@ -1,13 +1,19 @@ package com.ausy_technologies.demospring; +import com.ausy_technologies.demospring.Exceptions.ErrorResponse; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import java.util.logging.Logger; + @SpringBootApplication public class DemospringApplication { - + public static final Logger lgr = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); public static void main(String[] args) { + ErrorResponse.setupLogger(); SpringApplication.run(DemospringApplication.class, args); + } + } diff --git a/src/main/java/com/ausy_technologies/demospring/Exceptions/ApiError.java b/src/main/java/com/ausy_technologies/demospring/Exceptions/ApiError.java new file mode 100644 index 0000000..901c6c9 --- /dev/null +++ b/src/main/java/com/ausy_technologies/demospring/Exceptions/ApiError.java @@ -0,0 +1,80 @@ +package com.ausy_technologies.demospring.Exceptions; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.http.HttpStatus; + +import java.time.LocalDateTime; +import java.util.List; + +public class ApiError { + private HttpStatus status; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy hh:mm:ss") + private LocalDateTime timestamp; + private String message; + private String debugMessage; + private List subErrors; + + private ApiError() { + timestamp = LocalDateTime.now(); + } + + ApiError(HttpStatus status) { + this(); + this.status = status; + } + + ApiError(HttpStatus status, Throwable ex) { + this(); + this.status = status; + this.message = "Unexpected error"; + this.debugMessage = ex.getLocalizedMessage(); + } + + ApiError(HttpStatus status, String message, Throwable ex) { + this(); + this.status = status; + this.message = message; + this.debugMessage = ex.getLocalizedMessage(); + } + + public HttpStatus getStatus() { + return status; + } + + public void setStatus(HttpStatus status) { + this.status = status; + } + + public void setTimestamp(LocalDateTime timestamp) { + this.timestamp = timestamp; + } + + public void setMessage(String message) { + this.message = message; + } + + public void setDebugMessage(String debugMessage) { + this.debugMessage = debugMessage; + } + + public void setSubErrors(List subErrors) { + this.subErrors = subErrors; + } + + public LocalDateTime getTimestamp() { + return timestamp; + } + + public String getMessage() { + return message; + } + + public String getDebugMessage() { + return debugMessage; + } + + public List getSubErrors() { + return subErrors; + } +} + diff --git a/src/main/java/com/ausy_technologies/demospring/Exceptions/ApiSubError.java b/src/main/java/com/ausy_technologies/demospring/Exceptions/ApiSubError.java new file mode 100644 index 0000000..94a49f8 --- /dev/null +++ b/src/main/java/com/ausy_technologies/demospring/Exceptions/ApiSubError.java @@ -0,0 +1,4 @@ +package com.ausy_technologies.demospring.Exceptions; + +public abstract class ApiSubError { +} diff --git a/src/main/java/com/ausy_technologies/demospring/Exceptions/ApiValidationError.java b/src/main/java/com/ausy_technologies/demospring/Exceptions/ApiValidationError.java new file mode 100644 index 0000000..2e10464 --- /dev/null +++ b/src/main/java/com/ausy_technologies/demospring/Exceptions/ApiValidationError.java @@ -0,0 +1,21 @@ +package com.ausy_technologies.demospring.Exceptions; + + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = false) +@AllArgsConstructor +public class ApiValidationError extends ApiSubError { + private String object; + private String field; + private Object rejectedValue; + private String message; + + ApiValidationError(String object, String message) { + this.object = object; + this.message = message; + } +} diff --git a/src/main/java/com/ausy_technologies/demospring/Exceptions/ErrorResponse.java b/src/main/java/com/ausy_technologies/demospring/Exceptions/ErrorResponse.java new file mode 100644 index 0000000..8fd021c --- /dev/null +++ b/src/main/java/com/ausy_technologies/demospring/Exceptions/ErrorResponse.java @@ -0,0 +1,62 @@ +package com.ausy_technologies.demospring.Exceptions; + +import java.io.IOException; +import java.util.logging.FileHandler; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class ErrorResponse extends RuntimeException { + public static final Logger lgr = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); + private static boolean isDebug = java.lang.management.ManagementFactory.getRuntimeMXBean(). + getInputArguments().toString().contains("jdwp"); + + private String errorMessage; + private int errorId; + public ErrorResponse(){ + + } + + public ErrorResponse(String errorMessage, int errorId) { + super(errorMessage); + this.errorMessage = errorMessage; + this.errorId = errorId; + } + + public ErrorResponse(Throwable cause, String errorMessage, int errorId) { + super(errorMessage, cause); + this.errorMessage = errorMessage; + this.errorId = errorId; + } + public static void setupLogger() { + lgr.setLevel(Level.FINE); + + try { + + FileHandler fh = new FileHandler("fileLogger"); + lgr.addHandler(fh); + fh.setLevel(Level.FINE); + } + catch (IOException e){ + lgr.log(Level.SEVERE,"The logger file was not create"); + } + } + + + public static void LogError(ErrorResponse e){ + if(isDebug) { + e.printStackTrace(); + } + else { + lgr.log(Level.SEVERE,e.getErrorMessage()); + } + + } + + public String getErrorMessage() { + return errorMessage; + } + + public int getErrorId() { + return errorId; + } +} diff --git a/src/main/java/com/ausy_technologies/demospring/Exceptions/RestExceptionHandler.java b/src/main/java/com/ausy_technologies/demospring/Exceptions/RestExceptionHandler.java new file mode 100644 index 0000000..be29526 --- /dev/null +++ b/src/main/java/com/ausy_technologies/demospring/Exceptions/RestExceptionHandler.java @@ -0,0 +1,37 @@ +package com.ausy_technologies.demospring.Exceptions; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.context.request.WebRequest; +import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; + +import javax.persistence.EntityNotFoundException; + +@Order(Ordered.HIGHEST_PRECEDENCE) +@ControllerAdvice +public class RestExceptionHandler extends ResponseEntityExceptionHandler { + @Override + protected ResponseEntity handleHttpMessageNotReadable(HttpMessageNotReadableException ex, HttpHeaders headers, HttpStatus status, WebRequest request) { + String error = "Malformed JSON request"; + return buildResponseEntity(new ApiError(HttpStatus.BAD_REQUEST, error, ex)); + } + + private ResponseEntity buildResponseEntity(ApiError apiError) { + return new ResponseEntity<>(apiError, apiError.getStatus()); + } + + @ExceptionHandler(EntityNotFoundException.class) + protected ResponseEntity handleEntityNotFound( + EntityNotFoundException ex) { + ApiError apiError = new ApiError(HttpStatus.NOT_FOUND); + apiError.setMessage(ex.getMessage()); + apiError.setDebugMessage(ex.getLocalizedMessage()); + return buildResponseEntity(apiError); + } +} diff --git a/src/main/java/com/ausy_technologies/demospring/Repository/RoleRepository.java b/src/main/java/com/ausy_technologies/demospring/Repository/RoleRepository.java index 6c6715d..98571b5 100644 --- a/src/main/java/com/ausy_technologies/demospring/Repository/RoleRepository.java +++ b/src/main/java/com/ausy_technologies/demospring/Repository/RoleRepository.java @@ -6,7 +6,6 @@ import org.springframework.stereotype.Repository; import java.util.List; -import java.util.Optional; @Repository @@ -15,8 +14,8 @@ public interface RoleRepository extends JpaRepository { @Override List findAll(); - @Override - Optional findById(Integer integer); +// @Override +// Optional findById(Integer integer); diff --git a/src/main/java/com/ausy_technologies/demospring/Service/UserService.java b/src/main/java/com/ausy_technologies/demospring/Service/UserService.java index 7c260ee..28e1baa 100644 --- a/src/main/java/com/ausy_technologies/demospring/Service/UserService.java +++ b/src/main/java/com/ausy_technologies/demospring/Service/UserService.java @@ -1,5 +1,6 @@ package com.ausy_technologies.demospring.Service; +import com.ausy_technologies.demospring.Exceptions.ErrorResponse; import com.ausy_technologies.demospring.Model.DAO.Role; import com.ausy_technologies.demospring.Model.DAO.User; import com.ausy_technologies.demospring.Repository.RoleRepository; @@ -8,10 +9,7 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; @Service public class UserService { @@ -50,7 +48,7 @@ public User saveUser2(User user ,int idRole) } else { - throw new RuntimeException("Role not found"); + throw new ErrorResponse("User not found",404); } @@ -68,7 +66,13 @@ public User saveUser3( User user ,List roleList) public Role findRoleById(int id) { - return this.roleRepository.findById(id).get(); + + if (!roleRepository.findById(id).isPresent()) { + throw new ErrorResponse("Role not found !",404); + } + else { + return roleRepository.findById(id).get(); + } } @@ -77,6 +81,14 @@ public List findAllRoles() return this.roleRepository.findAll(); } + public User findUserById(int id){ + User user = this.userRepository.findById(id); + if(user == null){ + throw new ErrorResponse("User not found !",404); + + } + return user; + } public List findAllUsers() { @@ -84,11 +96,57 @@ public List findAllUsers() } - public void deleteUserById(int id) - { - this.userRepository.deleteById(id); + public void deleteUserById(int id) { this.userRepository.deleteById(id); } + + public User updateUser(int id, User user){ + User modifiedUser = userRepository.findById(id); + + if(modifiedUser != null){ + + modifiedUser.setRoleList(user.getRoleList()); + modifiedUser.setFirstName(user.getFirstName()); + modifiedUser.setLastName(user.getLastName()); + modifiedUser.setEmail(user.getEmail()); + modifiedUser.setUsername(user.getUsername()); + modifiedUser.setPassword(user.getPassword()); + userRepository.save(modifiedUser); + } + else { + throw new ErrorResponse("User not found !",404); + } + return modifiedUser; } + public User updateUser2(int id, List roleList){ + User modifiedUser = userRepository.findById(id); + + if(modifiedUser != null){ + + modifiedUser.setRoleList(roleList); + userRepository.save(modifiedUser); + } + else { + throw new ErrorResponse("User not found !",404); + } + return modifiedUser; + } + + public Role updateRole(int id, String name){ + Role modifiedRole = null; + try{ + modifiedRole = roleRepository.findById(id).get(); + modifiedRole.setName(name); + roleRepository.save(modifiedRole); + }catch (RuntimeException e){ + throw new ErrorResponse(e,"Role not found !",404); + } + + return modifiedRole; + } + + public void deleteRolebyId(int id){ + roleRepository.deleteById(id); + } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 81adda9..7decbcc 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,8 +1,7 @@ - server.port=8082 spring.datasource.url=jdbc:mysql://localhost/employees_management spring.datasource.username=root -spring.datasource.password=laurentiu +spring.datasource.password=ruT@*05!((( spring.jpa.generate-ddl=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect logging.level.org.hibernate.SQL=debug