From c5889199fa16bc1c3cf81c698ec1267c85e0ef49 Mon Sep 17 00:00:00 2001 From: shubhamsenudz Date: Tue, 9 May 2023 17:57:06 +0530 Subject: [PATCH 1/4] Create entities --- pom.xml | 93 +++++++++++-------- .../controller/package-info.java | 2 + .../springbootcodingtest/entity/Project.java | 38 ++++++++ .../springbootcodingtest/entity/Task.java | 71 ++++++++++++++ .../springbootcodingtest/entity/User.java | 46 +++++++++ 5 files changed, 209 insertions(+), 41 deletions(-) create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/entity/Project.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/entity/Task.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/entity/User.java diff --git a/pom.xml b/pom.xml index b0a6389..387acb5 100644 --- a/pom.xml +++ b/pom.xml @@ -1,41 +1,52 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 2.6.3 - - - com.accenture.codingtest - spring-boot-coding-test - 0.0.1-SNAPSHOT - spring-boot-coding-test - Demo project for Spring Boot - - 11 - - - - org.springframework.boot - spring-boot-starter - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.6.3 + + + com.accenture.codingtest + spring-boot-coding-test + 0.0.1-SNAPSHOT + spring-boot-coding-test + Demo project for Spring Boot + + 11 + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/controller/package-info.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/controller/package-info.java index e69de29..b27ea09 100644 --- a/src/main/java/com/accenture/codingtest/springbootcodingtest/controller/package-info.java +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/controller/package-info.java @@ -0,0 +1,2 @@ +package com.accenture.codingtest.springbootcodingtest.controller; + diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/Project.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/Project.java new file mode 100644 index 0000000..e4974ba --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/Project.java @@ -0,0 +1,38 @@ +package com.accenture.codingtest.springbootcodingtest.entity; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Lob; +import javax.validation.constraints.NotBlank; + +@Entity +public class Project { + + @Id + @NotBlank(message = "Project ID can not be empty !!") + private int id; + @Column(unique=true) + @NotBlank(message = "Name can not be empty !!") + private String name; + @Lob + private String description; + public int getId() { + return id; + } + public void setId(int id) { + this.id = id; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getDescription() { + return description; + } + public void setDescription(String description) { + this.description = description; + } +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/Task.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/Task.java new file mode 100644 index 0000000..9bb7a39 --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/Task.java @@ -0,0 +1,71 @@ +package com.accenture.codingtest.springbootcodingtest.entity; + + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Lob; +import javax.validation.constraints.NotBlank; + + +@Entity +public class Task { + + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @NotBlank(message = "Task ID can not be empty !!") + private int taskId; + @NotBlank(message = "Title can not be empty !!") + private String title; + @Lob + private String description; + @NotBlank(message = "Status can not be empty !!") + private String status; + @NotBlank(message = "Project Id can not be empty !!") + private int project_id; + @NotBlank(message = "User Id can not be empty !!") + private int user_id; + public int getTaskId() { + return taskId; + } + public void setTaskId(int taskId) { + this.taskId = taskId; + } + public String getTitle() { + return title; + } + public void setTitle(String title) { + this.title = title; + } + public String getDescription() { + return description; + } + public void setDescription(String description) { + this.description = description; + } + public String getStatus() { + return status; + } + public void setStatus(String status) { + this.status = status; + } + public int getProject_id() { + return project_id; + } + public void setProject_id(int project_id) { + this.project_id = project_id; + } + public int getUser_id() { + return user_id; + } + public void setUser_id(int user_id) { + this.user_id = user_id; + } + + + + + +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/User.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/User.java new file mode 100644 index 0000000..50470f1 --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/User.java @@ -0,0 +1,46 @@ +package com.accenture.codingtest.springbootcodingtest.entity; + + + +import javax.persistence.Column; +import javax.persistence.Entity; + +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +import javax.validation.constraints.NotBlank; + +@Entity +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @NotBlank(message = "User ID can not be empty !!") + private int user_id; + @NotBlank(message = "User Name can not be empty !!") + @Column(unique=true) + private String user_name; + @NotBlank(message = "Password can not be empty !!") + private String password; + public int getUser_id() { + return user_id; + } + public void setUser_id(int user_id) { + this.user_id = user_id; + } + public String getUser_name() { + return user_name; + } + public void setUser_name(String user_name) { + this.user_name = user_name; + } + public String getPassword() { + return password; + } + public void setPassword(String password) { + this.password = password; + } + + +} From 508cd142f952c5c05adb09aa74476b01cc7f0a44 Mon Sep 17 00:00:00 2001 From: shubhamsenudz Date: Thu, 11 May 2023 19:26:53 +0530 Subject: [PATCH 2/4] Create REST APIs --- pom.xml | 14 +++ .../controller/UserController.java | 116 ++++++++++++++++++ .../springbootcodingtest/entity/User.java | 6 +- .../repository/UserRepository.java | 52 ++++++++ .../service/UserInterface.java | 13 ++ src/main/resources/application.properties | 9 ++ 6 files changed, 208 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/controller/UserController.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/repository/UserRepository.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/service/UserInterface.java diff --git a/pom.xml b/pom.xml index 387acb5..2477a8c 100644 --- a/pom.xml +++ b/pom.xml @@ -35,6 +35,20 @@ org.springframework.boot spring-boot-starter-data-jpa + + org.springframework.boot + spring-boot-starter-web + + + org.postgresql + postgresql + runtime + + + org.hibernate.validator + hibernate-validator + 8.0.0.Final + diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/controller/UserController.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/controller/UserController.java new file mode 100644 index 0000000..6d45623 --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/controller/UserController.java @@ -0,0 +1,116 @@ +package com.accenture.codingtest.springbootcodingtest.controller; + +import java.util.List; +import java.util.Optional; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.RequestEntity; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +import com.accenture.codingtest.springbootcodingtest.entity.User; +import com.accenture.codingtest.springbootcodingtest.repository.UserRepository; + + +@Controller +public class UserController { + + @Autowired + UserRepository userRepository; + @Autowired + User user; + //GET retrieve all resources (ex. GET /api/v1/users) + @RequestMapping(value="/api/v1/users", method=RequestMethod.GET) + public ResponseEntity> getUser() { + + List list=null; + try { + list=(List)userRepository.getUser(); + if(list.size()<=0) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); + + } + return ResponseEntity.of(Optional.of(list)); + } catch (Exception e) { + e.printStackTrace(); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + } + + } + //GET retrieve one resource by id (ex. GET /api/v1/users/{user_id}) + @RequestMapping(value="/api/v1/users/{user_id}", method=RequestMethod.GET) + public ResponseEntity getUser(@PathVariable("user_id") int user_id) { + + User u=null; + try { + Optional bb=userRepository.getUserById(user_id); + if(bb.isEmpty()) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); + } + return ResponseEntity.of(bb); + } catch (Exception e) { + e.printStackTrace(); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + } + + } + //POST create one resource (ex. POST /api/v1/users) + @RequestMapping(value="/api/v1/users", method=RequestMethod.POST) + public ResponseEntity createUser(@RequestBody User user) { + User u=null; + try { + u=userRepository.insertUser(user); + return ResponseEntity.of(Optional.of(u)); + } catch (Exception e) { + e.printStackTrace(); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + } + + } + //PUT update one resource idempotent (ex. PUT /api/v1/users/{user_id}) + @RequestMapping(value="/api/v1/users/{user_id}", method=RequestMethod.PUT) + public ResponseEntity updateUserById( @PathVariable("user_id") int user_id, @RequestBody User user) { + User u=null; + + try { + u=userRepository.updateUser(user,user_id); + return ResponseEntity.of(Optional.of(u)); + } catch (Exception e) { + e.printStackTrace(); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + } + + } + //PATCH update one resource (ex. PATCH /api/v1/users/{user_id}) + @PatchMapping(value="/api/v1/users/{user_id}") + public ResponseEntity updateUserByIdPatch( @PathVariable("user_id") String user_id, @RequestBody User user) { + User u=null; + try { + u=userRepository.updateUser(user,Integer.parseInt(user_id)); + return ResponseEntity.of(Optional.of(u)); + } catch (Exception e) { + e.printStackTrace(); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + } + + } + //DELETE remove one resource (ex. DELETE /api/v1/users/{user_id}) + @RequestMapping(value="/api/v1/users/{user_id}", method=RequestMethod.DELETE) + public ResponseEntity deleteUserById( @PathVariable("user_id") int user_id) { + + try { + userRepository.deleteUser(user_id); + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); + } catch (Exception e) { + e.printStackTrace(); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + } + + } +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/User.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/User.java index 50470f1..951db7f 100644 --- a/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/User.java +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/User.java @@ -4,14 +4,16 @@ import javax.persistence.Column; import javax.persistence.Entity; - import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; - +import javax.persistence.Table; import javax.validation.constraints.NotBlank; +import org.springframework.stereotype.Component; +@Component @Entity +@Table(name="user09") public class User { @Id diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/repository/UserRepository.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/repository/UserRepository.java new file mode 100644 index 0000000..786d81e --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/repository/UserRepository.java @@ -0,0 +1,52 @@ +package com.accenture.codingtest.springbootcodingtest.repository; + +import java.util.List; +import java.util.Optional; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +import com.accenture.codingtest.springbootcodingtest.entity.User; + +import com.accenture.codingtest.springbootcodingtest.service.UserInterface; + +@Repository + +public class UserRepository { + + @Autowired + UserInterface userInterface; + @Autowired + User user; + + public List getUser() { + + List list=(List)userInterface.findAll(); + return list; + + } + + public Optional getUserById(int id) { + + Optional u=userInterface.findById(id); + return u; + } + + public User insertUser(User u) { + + User ub=userInterface.save(u); + return ub; + } + + public User updateUser(User u,int uid) { + + User ub=userInterface.save(u); + return ub; + } + + public void deleteUser(int uid) { + + userInterface.deleteById(uid); + + } +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/service/UserInterface.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/service/UserInterface.java new file mode 100644 index 0000000..a5e53bb --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/service/UserInterface.java @@ -0,0 +1,13 @@ +package com.accenture.codingtest.springbootcodingtest.service; + +import org.springframework.data.repository.CrudRepository; + +import com.accenture.codingtest.springbootcodingtest.entity.User; + + + +public interface UserInterface extends CrudRepository{ + + + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8b13789..a86cded 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,10 @@ +server.port=7777 +spring.datasource.url=jdbc:postgresql://localhost:5432/hibernate +spring.datasource.username=postgres +spring.datasource.password=postgres +spring.datasource.driver-class-name=org.postgresql.Driver +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect +spring.jpa.hibernate.ddl-auto=update +spring.jpa.show-sql=true +spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true From 427005d2c1cafeec6e3319031d69b56e82461c32 Mon Sep 17 00:00:00 2001 From: shubhamsenudz Date: Fri, 12 May 2023 03:16:12 +0530 Subject: [PATCH 3/4] Implement features --- pom.xml | 97 ++++++++++++ .../SpringBootCodingTestApplication.java | 5 +- .../controller/UserController.java | 145 ++++++++---------- .../springbootcodingtest/entity/Project.java | 6 + .../springbootcodingtest/entity/Task.java | 22 ++- .../springbootcodingtest/entity/User.java | 28 ++++ .../repository/UserRepository.java | 46 +----- .../service/UserInterface.java | 10 +- src/main/resources/application.properties | 11 +- 9 files changed, 220 insertions(+), 150 deletions(-) diff --git a/pom.xml b/pom.xml index 2477a8c..68337d7 100644 --- a/pom.xml +++ b/pom.xml @@ -27,6 +27,10 @@ spring-boot-starter-test test + + org.springframework.boot + spring-boot-starter-security + org.springframework.boot spring-boot-starter-validation @@ -49,6 +53,99 @@ hibernate-validator 8.0.0.Final + + org.springframework.security + spring-security-config + + + io.jsonwebtoken + jjwt + 0.9.1 + + + + + org.springframework.security + spring-security-core + + + + org.springframework.security + spring-security-web + + + + + io.jsonwebtoken + jjwt + 0.9.1 + + + + + javax.xml.bind + jaxb-api + 2.3.0 + + + + + org.springframework.boot + spring-boot-starter-security + + + io.springfox + springfox-swagger2 +2.9.2 + + + io.springfox + springfox-swagger-ui + 2.9.2 + + + + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + + mysql + mysql-connector-java + runtime + + + org.projectlombok + lombok + true + + + org.mindrot + jbcrypt + 0.4 + + + + io.springfox + springfox-swagger2 +2.9.2 + + + io.springfox + springfox-swagger-ui + 2.9.2 + diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/SpringBootCodingTestApplication.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/SpringBootCodingTestApplication.java index 14e2bbf..8879653 100644 --- a/src/main/java/com/accenture/codingtest/springbootcodingtest/SpringBootCodingTestApplication.java +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/SpringBootCodingTestApplication.java @@ -2,8 +2,11 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; - +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +@Configuration @SpringBootApplication +@ComponentScan(basePackages = "com.accenture.codingtest.springbootcodingtest") public class SpringBootCodingTestApplication { public static void main(String[] args) { diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/controller/UserController.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/controller/UserController.java index 6d45623..7e76b52 100644 --- a/src/main/java/com/accenture/codingtest/springbootcodingtest/controller/UserController.java +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/controller/UserController.java @@ -1,116 +1,91 @@ package com.accenture.codingtest.springbootcodingtest.controller; +import java.security.Principal; import java.util.List; -import java.util.Optional; +import java.util.UUID; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; -import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; +import org.springframework.security.access.annotation.Secured; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +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.PostMapping; +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.RequestMethod; +import org.springframework.web.bind.annotation.RestController; -import com.accenture.codingtest.springbootcodingtest.entity.User; -import com.accenture.codingtest.springbootcodingtest.repository.UserRepository; +import com.accenture.codingtest.springbootcodingtest.model.UserModel; +import com.accenture.codingtest.springbootcodingtest.service.UserService; -@Controller -public class UserController { +@RestController +@RequestMapping("/v1") +@SuppressWarnings("rawtypes") +public class UserController { + @Autowired - UserRepository userRepository; - @Autowired - User user; - //GET retrieve all resources (ex. GET /api/v1/users) - @RequestMapping(value="/api/v1/users", method=RequestMethod.GET) - public ResponseEntity> getUser() { + UserService userService; + + - List list=null; - try { - list=(List)userRepository.getUser(); - if(list.size()<=0) { - return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); - - } - return ResponseEntity.of(Optional.of(list)); - } catch (Exception e) { - e.printStackTrace(); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + @PostMapping(value = "/User/User") + // @PreAuthorize("hasAuthority('ROLE_ADMIN')") + // @Secured("ROLE_ADMIN") + public ResponseEntityuser(@RequestBody UserModel userModel) throws Exception { + UserModel userModel1 = userService.user(userModel); + return new ResponseEntity<>(userModel1, HttpStatus.CREATED); } - } - //GET retrieve one resource by id (ex. GET /api/v1/users/{user_id}) - @RequestMapping(value="/api/v1/users/{user_id}", method=RequestMethod.GET) - public ResponseEntity getUser(@PathVariable("user_id") int user_id) { - User u=null; - try { - Optional bb=userRepository.getUserById(user_id); - if(bb.isEmpty()) { - return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); - } - return ResponseEntity.of(bb); - } catch (Exception e) { - e.printStackTrace(); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + @GetMapping(value = "/User/Access/{userId}/{userRole}") + // @PreAuthorize("hasAuthority('ROLE_ADMIN')") + // @Secured("ROLE_ADMIN") + public ResponseEntity giveaccessToUser(@PathVariable UUID id, @PathVariable String UserRole, Principal principal) throws Exception{ + return new ResponseEntity<>(userService.giveaccessToUser(id, UserRole, principal), HttpStatus.OK); } - } - //POST create one resource (ex. POST /api/v1/users) - @RequestMapping(value="/api/v1/users", method=RequestMethod.POST) - public ResponseEntity createUser(@RequestBody User user) { - User u=null; - try { - u=userRepository.insertUser(user); - return ResponseEntity.of(Optional.of(u)); - } catch (Exception e) { - e.printStackTrace(); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + @PutMapping(value = "/User/updateUserIdempotent") + @PreAuthorize("hasAuthority('ROLE_ADMIN')") + @Secured("ROLE_ADMIN") + public ResponseEntity updateUserIdempotent(@PathVariable UUID id) throws Exception{ + UserModel userModel = userService.getUserById(id); + return new ResponseEntity<>(userService.updateUserIdempotent(userModel), HttpStatus.OK); } - } - //PUT update one resource idempotent (ex. PUT /api/v1/users/{user_id}) - @RequestMapping(value="/api/v1/users/{user_id}", method=RequestMethod.PUT) - public ResponseEntity updateUserById( @PathVariable("user_id") int user_id, @RequestBody User user) { - User u=null; - - try { - u=userRepository.updateUser(user,user_id); - return ResponseEntity.of(Optional.of(u)); - } catch (Exception e) { - e.printStackTrace(); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + @PatchMapping(value = "/User/updateUser") + @PreAuthorize("hasAuthority('ROLE_ADMIN')") + @Secured("ROLE_ADMIN") + public ResponseEntity updateUser (@PathVariable UUID id) throws Exception{ + UserModel userModel = userService.getUserById(id); + return new ResponseEntity<>(userService.updateUser(userModel,null), HttpStatus.OK); } - } - //PATCH update one resource (ex. PATCH /api/v1/users/{user_id}) - @PatchMapping(value="/api/v1/users/{user_id}") - public ResponseEntity updateUserByIdPatch( @PathVariable("user_id") String user_id, @RequestBody User user) { - User u=null; - try { - u=userRepository.updateUser(user,Integer.parseInt(user_id)); - return ResponseEntity.of(Optional.of(u)); - } catch (Exception e) { - e.printStackTrace(); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + @DeleteMapping(value = "/User/DeleteUser") + @PreAuthorize("hasAuthority('ROLE_ADMIN')") + @Secured("ROLE_ADMIN") + public ResponseEntity deleteUserById (@PathVariable UUID id) throws Exception{ + return new ResponseEntity<>(userService.deleteUserById(id), HttpStatus.OK); } - } - //DELETE remove one resource (ex. DELETE /api/v1/users/{user_id}) - @RequestMapping(value="/api/v1/users/{user_id}", method=RequestMethod.DELETE) - public ResponseEntity deleteUserById( @PathVariable("user_id") int user_id) { - - try { - userRepository.deleteUser(user_id); - return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); - } catch (Exception e) { - e.printStackTrace(); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + @GetMapping(value = "/User/GetUserById") + @PreAuthorize("hasAuthority('ROLE_ADMIN')") + @Secured("ROLE_ADMIN") + public ResponseEntity getProjectById (@PathVariable UUID id) throws Exception{ + return new ResponseEntity<>(userService.getUserById(id), HttpStatus.OK); } - } + @GetMapping(value = "/User/GetAllUsers") + // @PreAuthorize("hasAuthority('ROLE_ADMIN')") + // @Secured("ROLE_ADMIN") + public ResponseEntity> getAllUsers () throws Exception{ + return new ResponseEntity<>(userService.getAllUsers(), HttpStatus.OK); + } + + } diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/Project.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/Project.java index e4974ba..01ac441 100644 --- a/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/Project.java +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/Project.java @@ -2,14 +2,20 @@ import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Lob; import javax.validation.constraints.NotBlank; +import org.springframework.stereotype.Component; +@Component @Entity + public class Project { @Id + @GeneratedValue(strategy = GenerationType.AUTO) @NotBlank(message = "Project ID can not be empty !!") private int id; @Column(unique=true) diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/Task.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/Task.java index 9bb7a39..d388236 100644 --- a/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/Task.java +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/Task.java @@ -1,6 +1,8 @@ package com.accenture.codingtest.springbootcodingtest.entity; +import java.util.UUID; + import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; @@ -8,7 +10,9 @@ import javax.persistence.Lob; import javax.validation.constraints.NotBlank; +import org.springframework.stereotype.Component; +@Component @Entity public class Task { @@ -24,9 +28,11 @@ public class Task { @NotBlank(message = "Status can not be empty !!") private String status; @NotBlank(message = "Project Id can not be empty !!") - private int project_id; + private UUID project_id; @NotBlank(message = "User Id can not be empty !!") - private int user_id; + + private UUID user_id; + public int getTaskId() { return taskId; } @@ -51,17 +57,17 @@ public String getStatus() { public void setStatus(String status) { this.status = status; } - public int getProject_id() { + public @NotBlank(message = "Project Id can not be empty !!") UUID getProject_id() { return project_id; } - public void setProject_id(int project_id) { - this.project_id = project_id; + public void setProject_id(UUID uuid) { + this.project_id = uuid; } - public int getUser_id() { + public @NotBlank(message = "User Id can not be empty !!") UUID getUser_id() { return user_id; } - public void setUser_id(int user_id) { - this.user_id = user_id; + public void setUser_id(UUID uuid) { + this.user_id = uuid; } diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/User.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/User.java index 951db7f..d2da47e 100644 --- a/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/User.java +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/User.java @@ -2,6 +2,7 @@ + import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; @@ -24,7 +25,34 @@ public class User { @Column(unique=true) private String user_name; @NotBlank(message = "Password can not be empty !!") + @Column(unique = true) + private String email; private String password; + @Column(name = "isActive") + private Boolean isActive; + + @Column(name = "role") + private String role; + + public Boolean getIsActive() { + return isActive; + } + public void setIsActive(Boolean isActive) { + this.isActive = isActive; + } + public String getRole() { + return role; + } + public void setRole(String role) { + this.role = role; + } + public String getEmail() { + return email; + } + public void setEmail(String email) { + this.email = email; + } + public int getUser_id() { return user_id; } diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/repository/UserRepository.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/repository/UserRepository.java index 786d81e..9db541c 100644 --- a/src/main/java/com/accenture/codingtest/springbootcodingtest/repository/UserRepository.java +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/repository/UserRepository.java @@ -1,52 +1,14 @@ package com.accenture.codingtest.springbootcodingtest.repository; -import java.util.List; import java.util.Optional; +import java.util.UUID; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Repository; +import org.springframework.data.jpa.repository.JpaRepository; import com.accenture.codingtest.springbootcodingtest.entity.User; -import com.accenture.codingtest.springbootcodingtest.service.UserInterface; +public interface UserRepository extends JpaRepository { -@Repository + Optional findByUsername(String username); -public class UserRepository { - - @Autowired - UserInterface userInterface; - @Autowired - User user; - - public List getUser() { - - List list=(List)userInterface.findAll(); - return list; - - } - - public Optional getUserById(int id) { - - Optional u=userInterface.findById(id); - return u; - } - - public User insertUser(User u) { - - User ub=userInterface.save(u); - return ub; - } - - public User updateUser(User u,int uid) { - - User ub=userInterface.save(u); - return ub; - } - - public void deleteUser(int uid) { - - userInterface.deleteById(uid); - - } } diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/service/UserInterface.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/service/UserInterface.java index a5e53bb..212594b 100644 --- a/src/main/java/com/accenture/codingtest/springbootcodingtest/service/UserInterface.java +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/service/UserInterface.java @@ -1,13 +1,15 @@ package com.accenture.codingtest.springbootcodingtest.service; -import org.springframework.data.repository.CrudRepository; +import java.util.Optional; +import java.util.UUID; -import com.accenture.codingtest.springbootcodingtest.entity.User; +import org.springframework.data.jpa.repository.JpaRepository; +import com.accenture.codingtest.springbootcodingtest.entity.User; -public interface UserInterface extends CrudRepository{ - +public interface UserInterface extends JpaRepository{ + Optional findByUsername(String username); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index a86cded..4fdd7ad 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,10 +1 @@ -server.port=7777 -spring.datasource.url=jdbc:postgresql://localhost:5432/hibernate -spring.datasource.username=postgres -spring.datasource.password=postgres -spring.datasource.driver-class-name=org.postgresql.Driver -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect -spring.jpa.hibernate.ddl-auto=update -spring.jpa.show-sql=true -spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true - +spring.profiles.active=local From b2edab0372a012ce398a81962016b8e703bd3ba9 Mon Sep 17 00:00:00 2001 From: shubhamsenudz Date: Fri, 12 May 2023 03:21:55 +0530 Subject: [PATCH 4/4] final Commit --- .../config/SecurityConfig.java | 72 +++++++ .../config/SwaggerConfig.java | 24 +++ .../constant/TaskStatus.java | 15 ++ .../constants/RoleConstants.java | 11 ++ .../controller/JwtController.java | 50 +++++ .../controller/ProjectController.java | 76 ++++++++ .../controller/TaskController.java | 68 +++++++ .../controller/TaskStatusController.java | 45 +++++ .../springbootcodingtest/entity/Admin.java | 61 ++++++ .../springbootcodingtest/entity/Role.java | 49 +++++ .../entity/TaskStatusMD.java | 51 +++++ .../springbootcodingtest/filter/JwtUtil.java | 87 +++++++++ .../model/JwtRequestModel.java | 43 +++++ .../model/JwtResponseModel.java | 32 +++ .../model/ProjectModel.java | 44 +++++ .../springbootcodingtest/model/RoleModel.java | 28 +++ .../springbootcodingtest/model/TaskModel.java | 97 ++++++++++ .../model/TaskStatusModel.java | 24 +++ .../springbootcodingtest/model/UserModel.java | 94 +++++++++ .../repository/ProjectRepo.java | 11 ++ .../repository/ProjectRepository.java | 23 +++ .../repository/TaskRepo.java | 11 ++ .../repository/TaskRepository.java | 24 +++ .../repository/TaskStatusRepo.java | 11 ++ .../repository/UserRepo.java | 14 ++ .../service/GroupUserDetails.java | 82 ++++++++ .../service/GroupUserDetailsService.java | 32 +++ .../service/ProjectInterface.java | 10 + .../service/ProjectService.java | 23 +++ .../service/ProjectServiceImpl.java | 119 ++++++++++++ .../service/TaskInterface.java | 10 + .../service/TaskService.java | 23 +++ .../service/TaskServiceImpl.java | 142 ++++++++++++++ .../service/TaskStatusService.java | 15 ++ .../service/TaskStatusServiceImpl.java | 45 +++++ .../service/UserService.java | 30 +++ .../service/UserServiceImpl.java | 182 ++++++++++++++++++ .../utils/IDGenerate.java | 18 ++ ...itional-spring-configuration-metadata.json | 5 + .../resources/application-local.properties | 20 ++ src/main/webapp/WEB-INF/view/login.jsp | 28 +++ 41 files changed, 1849 insertions(+) create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/config/SecurityConfig.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/config/SwaggerConfig.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/constant/TaskStatus.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/constants/RoleConstants.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/controller/JwtController.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/controller/ProjectController.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/controller/TaskController.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/controller/TaskStatusController.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/entity/Admin.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/entity/Role.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/entity/TaskStatusMD.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/filter/JwtUtil.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/model/JwtRequestModel.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/model/JwtResponseModel.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/model/ProjectModel.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/model/RoleModel.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/model/TaskModel.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/model/TaskStatusModel.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/model/UserModel.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/repository/ProjectRepo.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/repository/ProjectRepository.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/repository/TaskRepo.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/repository/TaskRepository.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/repository/TaskStatusRepo.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/repository/UserRepo.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/service/GroupUserDetails.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/service/GroupUserDetailsService.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/service/ProjectInterface.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/service/ProjectService.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/service/ProjectServiceImpl.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/service/TaskInterface.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/service/TaskService.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/service/TaskServiceImpl.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/service/TaskStatusService.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/service/TaskStatusServiceImpl.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/service/UserService.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/service/UserServiceImpl.java create mode 100644 src/main/java/com/accenture/codingtest/springbootcodingtest/utils/IDGenerate.java create mode 100644 src/main/resources/META-INF/additional-spring-configuration-metadata.json create mode 100644 src/main/resources/application-local.properties create mode 100644 src/main/webapp/WEB-INF/view/login.jsp diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/config/SecurityConfig.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/config/SecurityConfig.java new file mode 100644 index 0000000..da8909d --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/config/SecurityConfig.java @@ -0,0 +1,72 @@ +package com.accenture.codingtest.springbootcodingtest.config; + +import java.util.Arrays; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.builders.WebSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.CorsConfigurationSource; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; + +@Configuration +@EnableWebSecurity +@EnableGlobalMethodSecurity(securedEnabled = true,prePostEnabled = true) +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + @Autowired + UserDetailsService userDetailsService; + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.userDetailsService(userDetailsService); + super.configure(auth); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.csrf().disable() + .authorizeRequests().antMatchers("/v1/**","/swagger-resources/configuration/ui", "/swagger-resources", + "/swagger-ui.html", "/webjars/**") + .permitAll() + .antMatchers("/v1/User/**").access("hasRole('ROLE_ADMIN')") + .antMatchers("/v1/Task/**", "/v1/Project/**").access("hasRole('ROLE_PROJECT_OWNER')") + + .anyRequest().authenticated().and().sessionManagement() + .sessionCreationPolicy(SessionCreationPolicy.STATELESS); + + } + + @Bean + public BCryptPasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + + } + + @Bean + public AuthenticationManager authenticationManagerBean() throws Exception { + return super.authenticationManager(); + + } + + CorsConfigurationSource corsConfigurationSource() { + CorsConfiguration configuration = new CorsConfiguration(); + configuration.addAllowedOrigin(""); + configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE")); + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", configuration); + return source; + } + + +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/config/SwaggerConfig.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/config/SwaggerConfig.java new file mode 100644 index 0000000..b4cc9d0 --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/config/SwaggerConfig.java @@ -0,0 +1,24 @@ +package com.accenture.codingtest.springbootcodingtest.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +@Configuration +@EnableSwagger2 +public class SwaggerConfig { + + @Bean + public Docket api() { + return new Docket(DocumentationType.SWAGGER_2) + .select() + .apis(RequestHandlerSelectors.basePackage("com.accenture.codingtest.springbootcodingtest")) + .paths(PathSelectors.any()) + .build(); +} +} \ No newline at end of file diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/constant/TaskStatus.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/constant/TaskStatus.java new file mode 100644 index 0000000..256cc52 --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/constant/TaskStatus.java @@ -0,0 +1,15 @@ +package com.accenture.codingtest.springbootcodingtest.constant; + +public class TaskStatus { + + + public static final String[] TaskStatus = {"NOT_STARTED","IN_PROGRESS","READY_FOR_TEST","COMPLETED"}; + + public static final String NOT_STARTED = "NOT_STARTED"; + + public static final String IN_PROGRESS = "IN_PROGRESS"; + + public static final String READY_FOR_TEST = "READY_FOR_TEST"; + + public static final String COMPLETED = "COMPLETED"; +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/constants/RoleConstants.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/constants/RoleConstants.java new file mode 100644 index 0000000..d07f655 --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/constants/RoleConstants.java @@ -0,0 +1,11 @@ +package com.accenture.codingtest.springbootcodingtest.constants; + +import org.springframework.stereotype.Component; + +@Component +public class RoleConstants { + + public static final String DEFAULT_ROLE = "ROLE_USER"; + public static final String[] ADMIN_ACCESS = {"ROLE_ADMIN" ,"ROLE_PRODUCT_OWNER"}; + public static final String[] PRODUCT_OWNER_ACCESS = {"ROLE_PRODUCT_OWNER"}; +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/controller/JwtController.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/controller/JwtController.java new file mode 100644 index 0000000..8a3e0b0 --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/controller/JwtController.java @@ -0,0 +1,50 @@ +package com.accenture.codingtest.springbootcodingtest.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.accenture.codingtest.springbootcodingtest.filter.JwtUtil; +import com.accenture.codingtest.springbootcodingtest.model.JwtRequestModel; +import com.accenture.codingtest.springbootcodingtest.model.JwtResponseModel; +import com.accenture.codingtest.springbootcodingtest.service.GroupUserDetailsService; + +@RestController + public class JwtController { + + @Autowired + private JwtUtil jwtUtil; + + @Autowired + private GroupUserDetailsService groupUserDetailsService; + + @Autowired + private AuthenticationManager authenticationManager; + + @PostMapping(value = "/Token/GenerateToken") + public ResponseEntity GenerateToken(@RequestBody JwtRequestModel jwtRequestM) throws Exception { + try { + + this.authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(jwtRequestM.getUsername(), jwtRequestM.getPassword())); + + }catch(UsernameNotFoundException e) + { + e.printStackTrace(); + throw new Exception("Bad Credentials"); + } + //fine area + UserDetails userDetails = this.groupUserDetailsService.loadUserByUsername(jwtRequestM.getUsername()); + + String token = jwtUtil.generateToken(jwtRequestM.getUsername()); + System.out.println(token); + + + return ResponseEntity.ok( new JwtResponseModel(token)); + } +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/controller/ProjectController.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/controller/ProjectController.java new file mode 100644 index 0000000..e001d51 --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/controller/ProjectController.java @@ -0,0 +1,76 @@ +package com.accenture.codingtest.springbootcodingtest.controller; + +import java.util.List; +import java.util.UUID; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.annotation.Secured; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +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.PostMapping; +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.accenture.codingtest.springbootcodingtest.model.ProjectModel; +import com.accenture.codingtest.springbootcodingtest.service.ProjectService; + +@RestController +@RequestMapping("/v1") +@SuppressWarnings("rawtypes") +public class ProjectController { + + @Autowired + ProjectService projectService; + + + @PostMapping(value = "/Project/Project") + @PreAuthorize("hasAuthority('ROLE_PRODUCT_OWNER')") + @Secured("ROLE_PRODUCT_OWNER") + public ResponseEntity project(@RequestBody ProjectModel projectModel) throws Exception { + ProjectModel projectModel1 = projectService.project(projectModel); + return new ResponseEntity<>(projectModel1, HttpStatus.CREATED); + } + + @PutMapping(value = "/Project/updateProjectIdempotent") + @PreAuthorize("hasAuthority('ROLE_PRODUCT_OWNER')") + @Secured("ROLE_PRODUCT_OWNER") + public ResponseEntity updateProjectIdempotent(@PathVariable UUID id) throws Exception{ + ProjectModel projectModel = projectService.getProjectById(id); + return new ResponseEntity<>(projectService.updateProjectIdempotent(projectModel), HttpStatus.OK); + } + + @PatchMapping(value = "/Project/updateProject") + @PreAuthorize("hasAuthority('ROLE_PRODUCT_OWNER')") + @Secured("ROLE_PRODUCT_OWNER") + public ResponseEntity updateProjects (@PathVariable UUID id) throws Exception{ + ProjectModel projectModel = projectService.getProjectById(id); + return new ResponseEntity<>(projectService.updateProjects(projectModel,null), HttpStatus.OK); + } + + @DeleteMapping(value = "/Project/DeleteProject") + public ResponseEntity deleteProjectById (@PathVariable UUID id) throws Exception{ + return new ResponseEntity<>(projectService.deleteProjectById(id), HttpStatus.OK); + } + + @GetMapping(value = "/Project/GetProjectById") + public ResponseEntity getProjectById (@PathVariable UUID id) throws Exception{ + return new ResponseEntity<>(projectService.getProjectById(id), HttpStatus.OK); + } + + @GetMapping(value = "/Project/GetAllProjects") + public ResponseEntity> getAllProjects () throws Exception{ + return new ResponseEntity<>(projectService.getAllProjects(), HttpStatus.OK); + } + + + +} + + diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/controller/TaskController.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/controller/TaskController.java new file mode 100644 index 0000000..0b88e5d --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/controller/TaskController.java @@ -0,0 +1,68 @@ +package com.accenture.codingtest.springbootcodingtest.controller; + +import java.util.List; +import java.util.UUID; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.annotation.Secured; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +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.PostMapping; +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.accenture.codingtest.springbootcodingtest.model.TaskModel; +import com.accenture.codingtest.springbootcodingtest.service.TaskService; + +@RestController +@RequestMapping("/v1") +@SuppressWarnings("rawtypes") +public class TaskController { + + @Autowired + TaskService taskService; + + + @PostMapping(value = "/Task/Task") + @PreAuthorize("hasAuthority('ROLE_PRODUCT_OWNER')") + @Secured("ROLE_PRODUCT_OWNER") + public ResponseEntity task(@RequestBody TaskModel taskModel) throws Exception { + TaskModel taskModel1 = taskService.task(taskModel); + return new ResponseEntity<>(taskModel1, HttpStatus.CREATED); + } + + @PutMapping(value = "/Task/updateTaskIdempotent") + public ResponseEntity updateTaskIdempotent(@PathVariable UUID id) throws Exception{ + TaskModel taskModel = taskService.getTaskById(id); + return new ResponseEntity<>(taskService.updateTaskIdempotent(taskModel), HttpStatus.OK); + } + + @PatchMapping(value = "/Task/updateTask") + public ResponseEntity updateTask (@PathVariable UUID id) throws Exception{ + TaskModel taskModel = taskService.getTaskById(id); + return new ResponseEntity<>(taskService.updateTask(taskModel,null), HttpStatus.OK); + } + + @DeleteMapping(value = "/Task/DeleteTask") + public ResponseEntity deleteTaskById (@PathVariable UUID id) throws Exception{ + return new ResponseEntity<>(taskService.deleteTaskById(id), HttpStatus.OK); + } + + @GetMapping(value = "/Task/GetTaskById") + public ResponseEntity getTaskById (@PathVariable UUID id) throws Exception{ + return new ResponseEntity<>(taskService.getTaskById(id), HttpStatus.OK); + } + + @GetMapping(value = "/Task/GetAllTasks") + public ResponseEntity> getAllTasks () throws Exception{ + return new ResponseEntity<>(taskService.getAllTasks(), HttpStatus.OK); + } + +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/controller/TaskStatusController.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/controller/TaskStatusController.java new file mode 100644 index 0000000..9dbd8cf --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/controller/TaskStatusController.java @@ -0,0 +1,45 @@ +package com.accenture.codingtest.springbootcodingtest.controller; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.annotation.Secured; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.accenture.codingtest.springbootcodingtest.model.TaskStatusModel; +import com.accenture.codingtest.springbootcodingtest.service.TaskStatusService; + +@RestController +@RequestMapping("/v1") +@SuppressWarnings("rawtypes") +public class TaskStatusController { + + @Autowired + TaskStatusService taskStatusService; + + @PostMapping(value = "/TaskStatus/AddTaskStatus") + @PreAuthorize("hasAuthority('ROLE_PRODUCT_OWNER')") + @Secured("ROLE_PRODUCT_OWNER") + public ResponseEntity addTaskStatus(@RequestBody TaskStatusModel taskStatusModel) throws Exception { + String respon = taskStatusService.addTaskStatus(taskStatusModel); + return new ResponseEntity<>(respon, HttpStatus.CREATED); + } + + @PostMapping(value = "/TaskStatus/deleteTaskStatus") + public ResponseEntity deleteTaskStatus(@PathVariable String taskStatus) throws Exception { + String respon = taskStatusService.deleteTaskStatus(taskStatus); + return new ResponseEntity<>(respon, HttpStatus.OK); + } + + @PostMapping(value = "/TaskStatus/getAllTaskStatus") + public ResponseEntity> getAllTaskStatus () throws Exception { + return new ResponseEntity<>(taskStatusService.getTasks(), HttpStatus.OK); + } +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/Admin.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/Admin.java new file mode 100644 index 0000000..8c86e2f --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/Admin.java @@ -0,0 +1,61 @@ +package com.accenture.codingtest.springbootcodingtest.entity; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotBlank; + +import org.springframework.stereotype.Component; + +@Component +@Entity +@Table(name="adminDetails") +public class Admin { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @NotBlank(message = "Admin ID can not be empty !!") + private int admin_id; + @NotBlank(message = "Admin Name can not be empty !!") + @Column(unique=true, name="admin_name") + private String adminName; + @NotBlank(message = "Password can not be empty !!") + private String password; + private String role; + private String email; + public String getEmail() { + return email; + } + public void setEmail(String email) { + this.email = email; + } + public String getRole() { + return role; + } + public void setRole(String role) { + this.role = role; + } + public int getAdmin_id() { + return admin_id; + } + public void setAdmin_id(int admin_id) { + this.admin_id = admin_id; + } + + public String getAdminName() { + return adminName; + } + public void setAdminName(String adminName) { + this.adminName = adminName; + } + public String getPassword() { + return password; + } + public void setPassword(String password) { + this.password = password; + } + +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/Role.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/Role.java new file mode 100644 index 0000000..c64f0d3 --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/Role.java @@ -0,0 +1,49 @@ +package com.accenture.codingtest.springbootcodingtest.entity; + +import java.io.Serializable; +import java.util.UUID; + +import javax.persistence.Column; +import javax.persistence.Id; + + +public class Role implements Serializable{ + + + private static final long serialVersionUID = 1898433577523417600L; + + @Id + @Column(name = "id") + private UUID id; + + @Column(name = "username") + private String username; + + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public static long getSerialversionuid() { + return serialVersionUID; + } + + public Role(UUID id, String username) { + super(); + this.id = id; + this.username = username; + } + +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/TaskStatusMD.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/TaskStatusMD.java new file mode 100644 index 0000000..5ba9d51 --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/entity/TaskStatusMD.java @@ -0,0 +1,51 @@ +package com.accenture.codingtest.springbootcodingtest.entity; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; + +@Entity +public class TaskStatusMD implements Serializable{ + + + private static final long serialVersionUID = -6328607138767139580L; + @Id + @Column(name = "sid") + private int sid; + + @Column(name = "status") + private String status; + + public int getSid() { + return sid; + } + + public void setSid(int sid) { + this.sid = sid; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public static long getSerialversionuid() { + return serialVersionUID; + } + + public TaskStatusMD(int sid, String status) { + super(); + this.sid = sid; + this.status = status; + } + + public TaskStatusMD() { + super(); + // TODO Auto-generated constructor stub + } +} \ No newline at end of file diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/filter/JwtUtil.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/filter/JwtUtil.java new file mode 100644 index 0000000..32e8c9f --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/filter/JwtUtil.java @@ -0,0 +1,87 @@ +package com.accenture.codingtest.springbootcodingtest.filter; + +import java.io.Serializable; +import java.sql.Date; +import java.util.HashMap; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; + +import com.google.common.base.Function; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; + +@PropertySource(value = {"classpath:application.properties"}) +@Component +public class JwtUtil implements Serializable{ + + + /** + * + */ + private static final long serialVersionUID = -8325036297193567264L; + + + + + @Value("${jwt.secret}") + private String secret; + + @Value("${jwt.expiry.hour}") + private int expiryHour; + + // retrieve username from jwt token + public String getUsernameFromToken(String token) { + return getClaimFromToken(token, Claims::getSubject); + } + + // retrieve expiration date from jwt token + public Date getExpirationDateFromToken(String token) { + return (Date) getClaimFromToken(token, Claims::getExpiration); + } + + public T getClaimFromToken(String token, Function claimsResolver) { + final Claims claims = getAllClaimsFromToken(token); + return claimsResolver.apply(claims); + } + + // for retrieveing any information from token we will need the secret key + private Claims getAllClaimsFromToken(String token) { + return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody(); + } + + // check if the token has expired + private Boolean isTokenExpired(String token) { + final Date expiration = getExpirationDateFromToken(token); + return expiration.before(new Date(expiryHour)); + } + + // generate token for user + public String generateToken(String username) { + Map claims = new HashMap<>(); + return doGenerateToken(claims, username); + } + + // while creating the token - + // 1. Define claims of the token, like Issuer, Expiration, Subject, and the ID + // 2. Sign the JWT using the HS512 algorithm and secret key. + // 3. According to JWS Compact + // Serialization(https://tools.ietf.org/html/draft-ietf-jose-json-web-signature-41#section-3.1) + // compaction of the JWT to a URL-safe string + private String doGenerateToken(Map claims, String subject) { + return Jwts.builder().setClaims(claims).setSubject(subject).setIssuedAt(new Date(System.currentTimeMillis())) + .setExpiration(new Date(System.currentTimeMillis() + (expiryHour * 60 * 60 * 1000))) + .signWith(SignatureAlgorithm.HS512, secret).compact(); + } + + // validate token + public Boolean isValidToken(String token, String api) { + final String usernameToken = getUsernameFromToken(token); + return !isTokenExpired(token); + } + +} \ No newline at end of file diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/model/JwtRequestModel.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/model/JwtRequestModel.java new file mode 100644 index 0000000..acdc79a --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/model/JwtRequestModel.java @@ -0,0 +1,43 @@ +package com.accenture.codingtest.springbootcodingtest.model; + +public class JwtRequestModel { + + String username; + + String password; + + public JwtRequestModel() { + super(); + // TODO Auto-generated constructor stub + } + + public JwtRequestModel(String username, String password) { + super(); + this.username = username; + this.password = password; + } + + @Override + public String toString() { + return "JwtRequestModel [username=" + username + ", password=" + password + "]"; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + + +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/model/JwtResponseModel.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/model/JwtResponseModel.java new file mode 100644 index 0000000..bb6ee1d --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/model/JwtResponseModel.java @@ -0,0 +1,32 @@ +package com.accenture.codingtest.springbootcodingtest.model; + +public class JwtResponseModel { + + String token; + + public JwtResponseModel() { + super(); + // TODO Auto-generated constructor stub + } + + public JwtResponseModel(String token) { + super(); + this.token = token; + } + + @Override + public String toString() { + return "JwtResponseModel [token=" + token + "]"; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + + +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/model/ProjectModel.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/model/ProjectModel.java new file mode 100644 index 0000000..ffbff22 --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/model/ProjectModel.java @@ -0,0 +1,44 @@ +package com.accenture.codingtest.springbootcodingtest.model; + +import java.io.Serializable; +import java.util.UUID; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ProjectModel implements Serializable { + + + + private static final long serialVersionUID = 1560371548692436354L; + + private UUID id; + + private String name; + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public static long getSerialversionuid() { + return serialVersionUID; + } + + +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/model/RoleModel.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/model/RoleModel.java new file mode 100644 index 0000000..2d4f1de --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/model/RoleModel.java @@ -0,0 +1,28 @@ +package com.accenture.codingtest.springbootcodingtest.model; + +import java.io.Serializable; +import java.util.UUID; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class RoleModel implements Serializable{ + + + + /** + * + */ + private static final long serialVersionUID = 1322907224617771740L; + + private UUID id; + + private String username; + + + +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/model/TaskModel.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/model/TaskModel.java new file mode 100644 index 0000000..4f512d8 --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/model/TaskModel.java @@ -0,0 +1,97 @@ +package com.accenture.codingtest.springbootcodingtest.model; + +import java.io.Serializable; +import java.util.UUID; + + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class TaskModel implements Serializable{ + + + + /** + * + */ + private static final long serialVersionUID = 4352086038378546132L; + + private UUID id; + + private String title; + + private String description; + + private String status; + + private UUID project_id; + + private UUID user_id; + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public UUID getProject_id() { + return project_id; + } + + public void setProject_id(UUID project_id) { + this.project_id = project_id; + } + + public UUID getUser_id() { + return user_id; + } + + public void setUser_id(UUID user_id) { + this.user_id = user_id; + } + + public static long getSerialversionuid() { + return serialVersionUID; + } + + public TaskModel(UUID id, String title, String description, String status, UUID project_id, UUID user_id) { + super(); + this.id = id; + this.title = title; + this.description = description; + this.status = status; + this.project_id = project_id; + this.user_id = user_id; + } + +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/model/TaskStatusModel.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/model/TaskStatusModel.java new file mode 100644 index 0000000..744f3de --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/model/TaskStatusModel.java @@ -0,0 +1,24 @@ +package com.accenture.codingtest.springbootcodingtest.model; + +import java.io.Serializable; +import java.util.UUID; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class TaskStatusModel implements Serializable{ + + + /** + * + */ + private static final long serialVersionUID = 3754540549554061689L; + + private int sid; + private String status; + +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/model/UserModel.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/model/UserModel.java new file mode 100644 index 0000000..3fb034f --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/model/UserModel.java @@ -0,0 +1,94 @@ +package com.accenture.codingtest.springbootcodingtest.model; + +import java.io.Serializable; +import java.util.UUID; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UserModel implements Serializable{ + + /** + * + */ + private static final long serialVersionUID = 1185129676552210354L; + + private UUID id; + + private String username; + + private String password; + + private Boolean isActive; + + private String role; + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Boolean getIsActive() { + return isActive; + } + + public void setIsActive(Boolean isActive) { + this.isActive = isActive; + } + + public String getRole() { + return role; + } + + public void setRole(String role) { + this.role = role; + } + + public static long getSerialversionuid() { + return serialVersionUID; + } + + public UserModel(UUID id, String username, String password, Boolean isActive, String role) { + super(); + this.id = id; + this.username = username; + this.password = password; + this.isActive = isActive; + this.role = role; + } + + public UserModel() { + super(); + // TODO Auto-generated constructor stub + } + + + + + + + +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/repository/ProjectRepo.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/repository/ProjectRepo.java new file mode 100644 index 0000000..9e25342 --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/repository/ProjectRepo.java @@ -0,0 +1,11 @@ +package com.accenture.codingtest.springbootcodingtest.repository; + +import java.util.UUID; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.accenture.codingtest.springbootcodingtest.entity.Project; + +public interface ProjectRepo extends JpaRepository { + +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/repository/ProjectRepository.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/repository/ProjectRepository.java new file mode 100644 index 0000000..a94a062 --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/repository/ProjectRepository.java @@ -0,0 +1,23 @@ +package com.accenture.codingtest.springbootcodingtest.repository; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +import com.accenture.codingtest.springbootcodingtest.entity.Project; +import com.accenture.codingtest.springbootcodingtest.service.ProjectInterface; + +@Repository +public class ProjectRepository { + + @Autowired + ProjectInterface projectInterface; + @Autowired + Project project; + + + public Project insertProject(Project u) { + + Project p=projectInterface.save(u); + return p; + } +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/repository/TaskRepo.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/repository/TaskRepo.java new file mode 100644 index 0000000..9c496ab --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/repository/TaskRepo.java @@ -0,0 +1,11 @@ +package com.accenture.codingtest.springbootcodingtest.repository; + +import java.util.UUID; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.accenture.codingtest.springbootcodingtest.entity.Task; + +public interface TaskRepo extends JpaRepository{ + +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/repository/TaskRepository.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/repository/TaskRepository.java new file mode 100644 index 0000000..6b53f5e --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/repository/TaskRepository.java @@ -0,0 +1,24 @@ +package com.accenture.codingtest.springbootcodingtest.repository; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +import com.accenture.codingtest.springbootcodingtest.entity.Task; +import com.accenture.codingtest.springbootcodingtest.service.TaskInterface; + +@Repository +public class TaskRepository { + + + @Autowired + TaskInterface taskInterface; + @Autowired + Task task; + + + public Task insertTask(Task u) { + + Task t=taskInterface.save(u); + return t; + } +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/repository/TaskStatusRepo.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/repository/TaskStatusRepo.java new file mode 100644 index 0000000..4bb5cb6 --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/repository/TaskStatusRepo.java @@ -0,0 +1,11 @@ +package com.accenture.codingtest.springbootcodingtest.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.accenture.codingtest.springbootcodingtest.entity.TaskStatusMD; + +public interface TaskStatusRepo extends JpaRepository{ + + public void deleteByStatus(String taskStatus); + +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/repository/UserRepo.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/repository/UserRepo.java new file mode 100644 index 0000000..8496b2d --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/repository/UserRepo.java @@ -0,0 +1,14 @@ +package com.accenture.codingtest.springbootcodingtest.repository; + +import java.util.Optional; +import java.util.UUID; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.accenture.codingtest.springbootcodingtest.entity.User; + +public interface UserRepo extends JpaRepository { + + Optional findByUsername(String username); + +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/service/GroupUserDetails.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/service/GroupUserDetails.java new file mode 100644 index 0000000..0a3ae04 --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/service/GroupUserDetails.java @@ -0,0 +1,82 @@ +package com.accenture.codingtest.springbootcodingtest.service; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import com.accenture.codingtest.springbootcodingtest.entity.User; + + +public class GroupUserDetails implements UserDetails { + + /** + * + */ + private static final long serialVersionUID = 751053069909157468L; + + private String username; + private String password; + private Boolean isActive; + private List authorities; + + public GroupUserDetails(User userM) + { + this.username = (String) userM.getUser_name(); + this.password = userM.getPassword(); + this.isActive = userM.getIsActive(); + + + this.authorities = Arrays.stream(userM.getRole().split(",")) + .map(SimpleGrantedAuthority ::new).collect(Collectors.toList()); + + + + } + @Override + public Collection getAuthorities() { + // TODO Auto-generated method stub + return authorities; + } + + @Override + public String getPassword() { + // TODO Auto-generated method stub + return password; + } + + @Override + public String getUsername() { + // TODO Auto-generated method stub + return username; + } + + @Override + public boolean isAccountNonExpired() { + // TODO Auto-generated method stub + return true; + } + + @Override + public boolean isAccountNonLocked() { + // TODO Auto-generated method stub + return true; + } + + @Override + public boolean isCredentialsNonExpired() { + // TODO Auto-generated method stub + return true; + } + + @Override + public boolean isEnabled() { + // TODO Auto-generated method stub + return isActive; + } + +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/service/GroupUserDetailsService.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/service/GroupUserDetailsService.java new file mode 100644 index 0000000..86b49a5 --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/service/GroupUserDetailsService.java @@ -0,0 +1,32 @@ +package com.accenture.codingtest.springbootcodingtest.service; + +import java.util.Optional; + +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +import com.accenture.codingtest.springbootcodingtest.entity.User; +import com.accenture.codingtest.springbootcodingtest.model.UserModel; +import com.accenture.codingtest.springbootcodingtest.repository.UserRepo; + +@Service +public class GroupUserDetailsService implements UserDetailsService{ + + @Autowired + UserRepo userRepo; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + Optional userD = userRepo.findByUsername(username); + Optional userM = null ; + BeanUtils.copyProperties(userD, userM); + return userD.map(GroupUserDetails :: new) + .orElseThrow(()-> new UsernameNotFoundException(username +"User Doesnt Exist")); + } + +} + \ No newline at end of file diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/service/ProjectInterface.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/service/ProjectInterface.java new file mode 100644 index 0000000..7ccf3c4 --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/service/ProjectInterface.java @@ -0,0 +1,10 @@ +package com.accenture.codingtest.springbootcodingtest.service; + +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +import com.accenture.codingtest.springbootcodingtest.entity.Project; + +public interface ProjectInterface extends CrudRepository{ + +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/service/ProjectService.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/service/ProjectService.java new file mode 100644 index 0000000..3edd2e2 --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/service/ProjectService.java @@ -0,0 +1,23 @@ +package com.accenture.codingtest.springbootcodingtest.service; + +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import com.accenture.codingtest.springbootcodingtest.model.ProjectModel; + +public interface ProjectService { + + public ProjectModel project (ProjectModel projetModel)throws Exception; + + public String updateProjectIdempotent (ProjectModel projectModel)throws Exception; + + public String updateProjects(ProjectModel projectModel, Map updates) throws Exception; + + public String deleteProjectById (UUID id)throws Exception; + + public ProjectModel getProjectById (UUID id)throws Exception; + + public List getAllProjects ()throws Exception; + +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/service/ProjectServiceImpl.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/service/ProjectServiceImpl.java new file mode 100644 index 0000000..475cce1 --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/service/ProjectServiceImpl.java @@ -0,0 +1,119 @@ +package com.accenture.codingtest.springbootcodingtest.service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; +import org.springframework.web.server.ResponseStatusException; + +import com.accenture.codingtest.springbootcodingtest.entity.Project; +import com.accenture.codingtest.springbootcodingtest.model.ProjectModel; +import com.accenture.codingtest.springbootcodingtest.repository.ProjectRepo; +import com.accenture.codingtest.springbootcodingtest.utils.IDGenerate; +import com.fasterxml.jackson.databind.ObjectMapper; + + +@Service +public class ProjectServiceImpl implements ProjectService { + + @Autowired + ProjectRepo projectRepo; + + @Autowired + IDGenerate idGenerate; + + + @Override + public ProjectModel project(ProjectModel projetModel) throws Exception { + Project projectDomain = new Project(); + UUID id = idGenerate.GenerateId(); + projetModel.setId(id); + BeanUtils.copyProperties(projetModel, projectDomain); + projectRepo.save(projectDomain); + return projetModel; + } + + @Override + public String updateProjectIdempotent(ProjectModel projectModel) throws Exception { + Project projectDomain = new Project(); + BeanUtils.copyProperties(projectModel, projectDomain); + if(projectRepo.existsById(projectModel.getId())) + { + projectRepo.save(projectDomain); + } + else + { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Project not found"); + } + return "Project Updated Successfully"; + } + + @Override + public String updateProjects(ProjectModel projectModel, Map updates) throws Exception { + Project projectDomain = new Project(); + projectDomain = projectRepo.getById(projectModel.getId()); + if(projectDomain ==null) + { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Project not found"); + } + ObjectMapper objectMapper = new ObjectMapper(); + ProjectModel projectM = objectMapper.convertValue(updates, ProjectModel.class); + + if(projectM.getName()!=null) + { + projectDomain.setName(projectM.getName()); + } + projectRepo.save(projectDomain); + return "Project Updated Successfully"; + } + + @Override + public String deleteProjectById(UUID id) throws Exception { + if(projectRepo.existsById(id)) + { + projectRepo.deleteById(id); + } + else + { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Project not found"); + } + return "Project Deleted Successfully"; + } + + @Override + public ProjectModel getProjectById(UUID id) throws Exception { + ProjectModel projectModel = new ProjectModel(); + Project projectDomain = new Project(); + if(id==null) + { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Project_id is Null"); + } + else + { + projectDomain = projectRepo.getById(id); + BeanUtils.copyProperties(projectDomain, projectModel); + } + return projectModel; + } + + @Override + public List getAllProjects() throws Exception { + List projectModel = new ArrayList(); + List projectDomain = new ArrayList(); + projectDomain = projectRepo.findAll(); + for(Project projectD : projectDomain) + { + ProjectModel projectM = new ProjectModel(); + BeanUtils.copyProperties(projectD, projectM); + projectModel.add(projectM); + } + + return projectModel; + } + +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/service/TaskInterface.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/service/TaskInterface.java new file mode 100644 index 0000000..187caa5 --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/service/TaskInterface.java @@ -0,0 +1,10 @@ +package com.accenture.codingtest.springbootcodingtest.service; + +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +import com.accenture.codingtest.springbootcodingtest.entity.Task; + +public interface TaskInterface extends CrudRepository{ + +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/service/TaskService.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/service/TaskService.java new file mode 100644 index 0000000..ae443ad --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/service/TaskService.java @@ -0,0 +1,23 @@ +package com.accenture.codingtest.springbootcodingtest.service; + +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import com.accenture.codingtest.springbootcodingtest.model.TaskModel; + +public interface TaskService { + + public TaskModel task (TaskModel taskModel)throws Exception; + + public String updateTaskIdempotent (TaskModel taskModel)throws Exception; + + public String updateTask(TaskModel taskModel, Map updates) throws Exception; + + public String deleteTaskById (UUID id)throws Exception; + + public TaskModel getTaskById (UUID id)throws Exception; + + public List getAllTasks ()throws Exception; + +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/service/TaskServiceImpl.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/service/TaskServiceImpl.java new file mode 100644 index 0000000..d5e54f4 --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/service/TaskServiceImpl.java @@ -0,0 +1,142 @@ +package com.accenture.codingtest.springbootcodingtest.service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; +import org.springframework.web.server.ResponseStatusException; + +import com.accenture.codingtest.springbootcodingtest.constant.TaskStatus; +import com.accenture.codingtest.springbootcodingtest.entity.Task; +import com.accenture.codingtest.springbootcodingtest.model.TaskModel; +import com.accenture.codingtest.springbootcodingtest.repository.TaskRepo; +import com.accenture.codingtest.springbootcodingtest.utils.IDGenerate; +import com.fasterxml.jackson.databind.ObjectMapper; + +@Service +public class TaskServiceImpl implements TaskService{ + + @Autowired + TaskRepo taskRepo; + + @Autowired + IDGenerate idGenerate; + + @Override + public TaskModel task(TaskModel taskModel) throws Exception { + Task taskDomain = new Task(); + UUID id = idGenerate.GenerateId(); + taskModel.setId(id); + taskModel.setStatus(TaskStatus.NOT_STARTED); + BeanUtils.copyProperties(taskModel, taskDomain); + taskRepo.save(taskDomain); + return taskModel; + } + + @Override + public String updateTaskIdempotent(TaskModel taskModel) throws Exception { + Task taskDomain = new Task(); + BeanUtils.copyProperties(taskModel, taskDomain); + if(taskRepo.existsById(taskModel.getId())) + { + taskRepo.save(taskDomain); + } + else + { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Task not found"); + } + return "Task Updated Successfully"; + } + + + @Override + public String updateTask(TaskModel taskModel, Map updates) throws Exception { + Task taskDomain = new Task(); + taskDomain = taskRepo.getById(taskModel.getId()); + if(taskDomain ==null) + { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Task not found"); + } + ObjectMapper objectMapper = new ObjectMapper(); + TaskModel taskM = objectMapper.convertValue(updates, TaskModel.class); + + if(taskM.getDescription()!=null) + { + taskDomain.setDescription(taskM.getDescription()); + + } + if(taskM.getTitle()!=null) + { + taskDomain.setTitle(taskM.getTitle()); + + } + if(taskM.getStatus()!=null) + { + taskDomain.setStatus(taskM.getStatus()); + + } + if(taskM.getProject_id()!=null) + { + taskDomain.setProject_id(taskM.getProject_id()); + + } + if(taskM.getUser_id()!=null) + { + taskDomain.setUser_id(taskM.getUser_id()); + + } + taskRepo.save(taskDomain); + return "Task Updated Successfully"; +} + @Override + public String deleteTaskById(UUID id) throws Exception { + if(taskRepo.existsById(id)) + { + taskRepo.deleteById(id); + } + else + { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Task not found"); + } + return "Task Deleted Successfully"; + } + + @Override + public TaskModel getTaskById(UUID id) throws Exception { + TaskModel taskModel = new TaskModel(id, null, null, null, id, id); + Task taskDomain = new Task(); + if(id==null) + { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Task_id is Null"); + } + else + { + taskDomain = taskRepo.getById(id); + BeanUtils.copyProperties(taskDomain, taskModel); + } + return taskModel; + } + + @Override + public List getAllTasks() throws Exception { + List taskModel = new ArrayList(); + List taskDomain = new ArrayList(); + taskDomain = taskRepo.findAll(); + for(Task taskD : taskDomain) + { + TaskModel taskM = new TaskModel(null, null, null, null, null, null); + BeanUtils.copyProperties(taskD, taskM); + taskModel.add(taskM); + } + + return taskModel; + } + + + +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/service/TaskStatusService.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/service/TaskStatusService.java new file mode 100644 index 0000000..590879d --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/service/TaskStatusService.java @@ -0,0 +1,15 @@ +package com.accenture.codingtest.springbootcodingtest.service; + +import java.util.List; + +import com.accenture.codingtest.springbootcodingtest.model.TaskStatusModel; + +public interface TaskStatusService { + + public String addTaskStatus (TaskStatusModel taskModel)throws Exception; + + public String deleteTaskStatus (String taskStatus) throws Exception; + + public List getTasks ()throws Exception; + +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/service/TaskStatusServiceImpl.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/service/TaskStatusServiceImpl.java new file mode 100644 index 0000000..d5afd32 --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/service/TaskStatusServiceImpl.java @@ -0,0 +1,45 @@ +package com.accenture.codingtest.springbootcodingtest.service; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.accenture.codingtest.springbootcodingtest.entity.TaskStatusMD; +import com.accenture.codingtest.springbootcodingtest.model.TaskStatusModel; +import com.accenture.codingtest.springbootcodingtest.repository.TaskStatusRepo; + +@Service +class TaskStatusServiceImpl implements TaskStatusService{ + + @Autowired + TaskStatusRepo taskStatusRepo; + + @Override + public String addTaskStatus(TaskStatusModel taskStatusModel) throws Exception { + TaskStatusMD taskStatusDomain = new TaskStatusMD(); + BeanUtils.copyProperties(taskStatusModel, taskStatusDomain); + taskStatusRepo.save(taskStatusDomain); + return "Task Status Added Successfully"; + } + + @Override + public String deleteTaskStatus(String taskStatus) throws Exception { + taskStatusRepo.deleteByStatus(taskStatus); + return "Task Status Deleted Successfully"; + } + + @Override + public List getTasks() throws Exception { + List taskStatusDomain = new ArrayList<>(); + List taskStatusModel = new ArrayList(); + taskStatusDomain = taskStatusRepo.findAll(); + BeanUtils.copyProperties(taskStatusDomain, taskStatusModel); + return taskStatusModel; + } + + + +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/service/UserService.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/service/UserService.java new file mode 100644 index 0000000..6d9730e --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/service/UserService.java @@ -0,0 +1,30 @@ +package com.accenture.codingtest.springbootcodingtest.service; + +import java.security.Principal; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import org.springframework.web.bind.annotation.PathVariable; + +import com.accenture.codingtest.springbootcodingtest.model.UserModel; + +public interface UserService { + + public UserModel user (UserModel UserModel)throws Exception; + + public String giveaccessToUser(@PathVariable UUID id, @PathVariable String UserRole, Principal principal)throws Exception; + + public String updateUserIdempotent (UserModel UserModel)throws Exception; + + public String updateUser(UserModel UserModel, Map updates) throws Exception; + + public String deleteUserById (UUID id)throws Exception; + + public UserModel getUserById (UUID id)throws Exception; + + public List getAllUsers ()throws Exception; + + + +} diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/service/UserServiceImpl.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/service/UserServiceImpl.java new file mode 100644 index 0000000..56c1338 --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/service/UserServiceImpl.java @@ -0,0 +1,182 @@ +package com.accenture.codingtest.springbootcodingtest.service; + +import java.security.Principal; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.stream.Collectors; + +import org.mindrot.jbcrypt.BCrypt; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.server.ResponseStatusException; + +import com.accenture.codingtest.springbootcodingtest.constants.RoleConstants; +import com.accenture.codingtest.springbootcodingtest.entity.User; +import com.accenture.codingtest.springbootcodingtest.model.UserModel; +import com.accenture.codingtest.springbootcodingtest.repository.UserRepo; +import com.accenture.codingtest.springbootcodingtest.utils.IDGenerate; +import com.fasterxml.jackson.databind.ObjectMapper; + +@Service +public class UserServiceImpl implements UserService { + + @Autowired + UserRepo userRepo; + + @Autowired + IDGenerate idGenerate; + + + + @Override + public UserModel user(UserModel userModel) throws Exception { + User userDomain = new User(); + UUID id = idGenerate.GenerateId(); + userModel.setId(id); + String hashpassword = encode(userModel.getPassword()); + userModel.setPassword(hashpassword); + userModel.setIsActive(true); + userModel.setRole(RoleConstants.DEFAULT_ROLE); + BeanUtils.copyProperties(userModel, userDomain); + userRepo.save(userDomain); + return userModel; + } + + public static String encode(String password) { + String salt = BCrypt.gensalt(); + return BCrypt.hashpw(password, salt); + } + + @Override + public String giveaccessToUser(@PathVariable UUID id, @PathVariable String UserRole, Principal principal) { + UserModel userModel = new UserModel(); + User userDomain = userRepo.getById(id); + BeanUtils.copyProperties(userDomain, userModel); + List activeRoles = getRolesByLoggedInUser(principal); + String newRole = ""; + if(activeRoles.contains(UserRole)) { + newRole = userModel.getRole() +","+UserRole; + userModel.setRole(newRole); + } + User userD = new User(); + BeanUtils.copyProperties(userModel, userD); + userRepo.save(userD); + return "New Role has been assigned to "+userModel.getUsername()+" by "+principal.getName(); + } + + private List getRolesByLoggedInUser(Principal principal){ + + String roles = getLoggedInUser(principal).getRole(); + List assignRoles = Arrays.stream(roles.split(",")).collect(Collectors.toList()); + if(assignRoles.contains("ROLE_ADMIN")) { + return Arrays.stream(RoleConstants.ADMIN_ACCESS).collect(Collectors.toList()); + } + if(assignRoles.contains("ROLE_PRODUCT_OWNER")) { + return Arrays.stream(RoleConstants.PRODUCT_OWNER_ACCESS).collect(Collectors.toList()); + } + return Collections.emptyList(); + } + + private UserModel getLoggedInUser(Principal principal) { + UserModel userM = new UserModel(); + User userD = userRepo.findByUsername(principal.getName()).get(); + BeanUtils.copyProperties(userD, userM); + return userM; + } + + + + @Override + public String updateUserIdempotent(UserModel userModel) throws Exception { + User userDomain = new User(); + String hashpassword = encode(userModel.getPassword()); + userModel.setPassword(hashpassword); + BeanUtils.copyProperties(userModel, userDomain); + if(userRepo.existsById(userModel.getId())) + { + userRepo.save(userDomain); + } + else + { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "User not found"); + } + return "User Updated Successfully"; + } + + @Override + public String updateUser(UserModel userModel, Map updates) throws Exception { + User userDomain = new User(); + String hashpassword = encode(userModel.getPassword()); + userModel.setPassword(hashpassword); + userDomain = userRepo.getById(userModel.getId()); + if(userDomain ==null) + { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "User not found"); + } + ObjectMapper objectMapper = new ObjectMapper(); + UserModel userM = objectMapper.convertValue(updates, UserModel.class); + + + if(userM.getUsername()!=null) + { + userDomain.setUser_name(userM.getUsername()); + } + + userRepo.save(userDomain); + return "User Updated Successfully"; + } + + @Override + public String deleteUserById(UUID id) throws Exception { + if(userRepo.existsById(id)) + { + userRepo.deleteById(id); + } + else + { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "User not found"); + } + return "User Deleted Successfully"; + } + + @Override + public UserModel getUserById(UUID id) throws Exception { + UserModel userModel = new UserModel(); + User userDomain = new User(); + if(id==null) + { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "User_id is Null"); + } + else + { + userDomain = userRepo.getById(id); + BeanUtils.copyProperties(userDomain, userModel); + } + + return userModel; + } + @Override + public List getAllUsers() throws Exception { + List userModel = new ArrayList(); + List userDomain = new ArrayList(); + userDomain = userRepo.findAll(); + for(User userD : userDomain) + { + UserModel userM = new UserModel(); + BeanUtils.copyProperties(userD, userM); + userModel.add(userM); + } + + return userModel; + } + + +} + diff --git a/src/main/java/com/accenture/codingtest/springbootcodingtest/utils/IDGenerate.java b/src/main/java/com/accenture/codingtest/springbootcodingtest/utils/IDGenerate.java new file mode 100644 index 0000000..3a62f8a --- /dev/null +++ b/src/main/java/com/accenture/codingtest/springbootcodingtest/utils/IDGenerate.java @@ -0,0 +1,18 @@ +package com.accenture.codingtest.springbootcodingtest.utils; + +import java.util.UUID; + +import org.springframework.stereotype.Component; + +@Component + public class IDGenerate + { + //generates random UUID + + public UUID GenerateId() + { + UUID uuid=UUID.randomUUID(); + return uuid; + } + } + diff --git a/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/src/main/resources/META-INF/additional-spring-configuration-metadata.json new file mode 100644 index 0000000..cf01318 --- /dev/null +++ b/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -0,0 +1,5 @@ +{"properties": [{ + "name": "jwt.expiry.hour", + "type": "java.lang.String", + "description": "A description for 'jwt.expiry.hour'" +}]} \ No newline at end of file diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties new file mode 100644 index 0000000..a550dcd --- /dev/null +++ b/src/main/resources/application-local.properties @@ -0,0 +1,20 @@ +server.port=7776 +spring.mvc.view.prefix=/WEB-INF/view/ +spring.mvc.view.suffix=.jsp +spring.datasource.url=jdbc:postgresql://localhost:5432/jsp +spring.datasource.username=postgres +spring.datasource.password=postgres +spring.datasource.driver-class-name=org.postgresql.Driver +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect +spring.jpa.hibernate.ddl-auto=update +spring.jpa.show-sql=true +spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true + + +spring.mvc.pathmatch.matching-strategy = ANT_PATH_MATCHER + + +jwt.secret=jwtAccentureCodingSecret +jwt.expiry.hour=24 + + diff --git a/src/main/webapp/WEB-INF/view/login.jsp b/src/main/webapp/WEB-INF/view/login.jsp new file mode 100644 index 0000000..f308d3f --- /dev/null +++ b/src/main/webapp/WEB-INF/view/login.jsp @@ -0,0 +1,28 @@ +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + <%@ taglib uri="http://www.springframework.org/tags/form" prefix="h" %> + + + + +Insert title here + + + + + + + + + + +Add + + + +
UID
Pass
VIEW
+
+ + + + \ No newline at end of file