diff --git a/pom.xml b/pom.xml index b937cae8d67980ee2105facf93b71583ba79724e..ee4c80991558c630fdfeee1bda726c032b140ffd 100644 --- a/pom.xml +++ b/pom.xml @@ -29,17 +29,17 @@ <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-jwt</artifactId> - <version>1.1.0.RELEASE</version> + <version>1.1.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.security.oauth</groupId> <artifactId>spring-security-oauth2</artifactId> - <version>2.5.0.RELEASE</version> + <version>2.5.2.RELEASE</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> - <version>0.6.0</version> + <version>0.9.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> @@ -85,12 +85,13 @@ <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> + <version>3.1.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-artifact-manager</artifactId> - <version>2.0</version> + <version>2.2.1</version> </dependency> </dependencies> diff --git a/src/main/java/org/upsmf/grievance/controller/RoleController.java b/src/main/java/org/upsmf/grievance/controller/RoleController.java new file mode 100644 index 0000000000000000000000000000000000000000..9f5bbba6cbff15bfcb33669d2bcd276d9c6f9d51 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/controller/RoleController.java @@ -0,0 +1,47 @@ +package org.upsmf.grievance.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.upsmf.grievance.model.Role; +import org.upsmf.grievance.service.RoleService; + +import javax.management.relation.RoleNotFoundException; +import java.util.List; + +@RestController +@RequestMapping("/api/roles") +public class RoleController { + + @Autowired + private RoleService roleService; + + @PostMapping("/addrole") + public ResponseEntity<Role> createRole(@RequestParam String roleName) { + Role createdRole = roleService.createRole(roleName); + return ResponseEntity.status(HttpStatus.CREATED).body(createdRole); + } + + @PutMapping("/{roleId}") + public ResponseEntity<Role> updateRole(@PathVariable Long roleId, @RequestParam String newRoleName) throws RoleNotFoundException { + Role updatedRole = roleService.updateRole(roleId, newRoleName); + return ResponseEntity.ok(updatedRole); + } + + @GetMapping + public ResponseEntity<List<Role>> getAllRoles() { + List<Role> roles = roleService.getAllRoles(); + return ResponseEntity.ok(roles); + } + + @GetMapping("/{roleId}") + public ResponseEntity<Role> getRoleById(@PathVariable Long roleId) { + Role role = roleService.getRoleById(roleId); + if (role != null) { + return ResponseEntity.ok(role); + } else { + return ResponseEntity.notFound().build(); + } + } +} diff --git a/src/main/java/org/upsmf/grievance/controller/UserController.java b/src/main/java/org/upsmf/grievance/controller/UserController.java new file mode 100644 index 0000000000000000000000000000000000000000..8b3721f916130c05382acf1a9bad52dba9876a4a --- /dev/null +++ b/src/main/java/org/upsmf/grievance/controller/UserController.java @@ -0,0 +1,64 @@ +package org.upsmf.grievance.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +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.RequestParam; +import org.upsmf.grievance.model.User; +import org.upsmf.grievance.service.UserService; + + +@Controller +@RequestMapping("/user") +public class UserController { + + @Autowired + private UserService userService; + + @PostMapping("/register") + public ResponseEntity<String> registerUser(@RequestBody User user) { + userService.registerUser(user); + return ResponseEntity.ok("User registered successfully."); + } + + @PostMapping("/forgot-password") + public ResponseEntity<String> forgotPassword(@RequestParam String email) { + User user = userService.findByEmail(email); + // Logic for sending reset password instructions + return ResponseEntity.ok("Password reset instructions sent."); + } + + @PostMapping("/reset-password") + public ResponseEntity<String> resetPassword(@RequestParam String email, @RequestParam String newPassword) { + try { + userService.resetUserPassword(email, newPassword); + return ResponseEntity.ok("Password reset successful."); + } catch (Exception e) { + return ResponseEntity.badRequest().body("User not found."); + } + } + + @PostMapping("/login") + public ResponseEntity<String> loginUser(@RequestParam String username, @RequestParam String password) { + User user = userService.findByUsername(username); + + if (user == null) { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid username or password."); + } + + // Compare the provided password with the stored hashed password + if (userService.matchPassword(password, user.getPassword())) { + return ResponseEntity.ok("Login successful."); + } else { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid username or password."); + } + } + + + + +} diff --git a/src/main/java/org/upsmf/grievance/model/Role.java b/src/main/java/org/upsmf/grievance/model/Role.java new file mode 100644 index 0000000000000000000000000000000000000000..f8996acba548c0690bfa762c9a6681bd09f7fa26 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/model/Role.java @@ -0,0 +1,25 @@ +package org.upsmf.grievance.model; + +import lombok.*; + +import javax.persistence.*; +import java.util.List; + +@Entity +@Table(name = "role") +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +@ToString +public class Role { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable=false, unique=true) + private String name; + +} diff --git a/src/main/java/org/upsmf/grievance/model/User.java b/src/main/java/org/upsmf/grievance/model/User.java new file mode 100644 index 0000000000000000000000000000000000000000..f408cfb286ba9dbc2e9a7e67f0ec158352cf780c --- /dev/null +++ b/src/main/java/org/upsmf/grievance/model/User.java @@ -0,0 +1,39 @@ +package org.upsmf.grievance.model; + +import lombok.*; + +import javax.persistence.*; +import java.util.HashSet; +import java.util.Set; + +@Entity +@Table(name = "users") +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +@ToString +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable=false) + private String username; + + @Column(nullable=false, unique=true) + private String email; + + @Column(nullable=false) + private String password; + + @ManyToMany(fetch = FetchType.EAGER) + @JoinTable( + name = "user_roles", + joinColumns = @JoinColumn(name = "user_id"), + inverseJoinColumns = @JoinColumn(name = "role_id") + ) + private Set<Role> roles = new HashSet<>(); +} diff --git a/src/main/java/org/upsmf/grievance/repository/RoleRepository.java b/src/main/java/org/upsmf/grievance/repository/RoleRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..b46cdf46071839b4280266000843f478bf5d6bb3 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/repository/RoleRepository.java @@ -0,0 +1,9 @@ +package org.upsmf.grievance.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import org.upsmf.grievance.model.Role; +@Repository("roleRepository") +public interface RoleRepository extends JpaRepository<Role,Long> { + Role findByName(String name); +} diff --git a/src/main/java/org/upsmf/grievance/repository/UserRepository.java b/src/main/java/org/upsmf/grievance/repository/UserRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..ac2528667d50171a4c829d9ade5d1f785b959b7f --- /dev/null +++ b/src/main/java/org/upsmf/grievance/repository/UserRepository.java @@ -0,0 +1,11 @@ +package org.upsmf.grievance.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import org.upsmf.grievance.model.User; +@Repository("userRepository") +public interface UserRepository extends JpaRepository<User,Long> { + + User findByUsername(String username); + User findByEmail(String email); +} diff --git a/src/main/java/org/upsmf/grievance/service/RoleService.java b/src/main/java/org/upsmf/grievance/service/RoleService.java new file mode 100644 index 0000000000000000000000000000000000000000..9ed4de05dd2c67603f91998d60d4b8dabb59c6e1 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/service/RoleService.java @@ -0,0 +1,17 @@ +package org.upsmf.grievance.service; + +import org.springframework.stereotype.Service; +import org.upsmf.grievance.model.Role; + +import javax.management.relation.RoleNotFoundException; +import java.util.List; + +public interface RoleService { + + Role createRole(String roleName); + Role updateRole(Long roleId, String newRoleName) throws RoleNotFoundException; + + List<Role> getAllRoles(); + + Role getRoleById(Long roleId); +} diff --git a/src/main/java/org/upsmf/grievance/service/UserService.java b/src/main/java/org/upsmf/grievance/service/UserService.java new file mode 100644 index 0000000000000000000000000000000000000000..371ec6743f2e4b77116ba6a2ab6ed99f6c356c40 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/service/UserService.java @@ -0,0 +1,18 @@ +package org.upsmf.grievance.service; + +import org.springframework.stereotype.Service; +import org.upsmf.grievance.model.User; + + +public interface UserService { + + User registerUser(User user); + User findByEmail(String email); + + User findByUsername(String username); + + boolean matchPassword(String rawPassword, String hashedPassword); + + void resetUserPassword(String email, String newPassword) throws Exception; + +} diff --git a/src/main/java/org/upsmf/grievance/service/impl/RoleServiceImpl.java b/src/main/java/org/upsmf/grievance/service/impl/RoleServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..2ca7a2ed1b9de78672030e86e1b122c760ad6835 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/service/impl/RoleServiceImpl.java @@ -0,0 +1,48 @@ +package org.upsmf.grievance.service.impl; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.upsmf.grievance.model.Role; +import org.upsmf.grievance.repository.RoleRepository; +import org.upsmf.grievance.service.RoleService; + +import javax.management.relation.RoleNotFoundException; +import java.util.List; +import java.util.Optional; + +@Service +public class RoleServiceImpl implements RoleService { + + @Autowired + private RoleRepository roleRepository; + @Override + public Role createRole(String roleName) { + Role role = new Role(); + role.setName(roleName); + return roleRepository.save(role); + } + + @Override + public Role updateRole(Long roleId, String newRoleName) throws RoleNotFoundException { + Optional<Role> optionalRole = roleRepository.findById(roleId); + + if (optionalRole.isPresent()) { + Role role = optionalRole.get(); + role.setName(newRoleName); + return roleRepository.save(role); + } else { + // Handle the case where the role with the given ID is not found + throw new RoleNotFoundException("Role not found with ID: " + roleId); + } + } + + @Override + public List<Role> getAllRoles() { + return roleRepository.findAll(); + } + + @Override + public Role getRoleById(Long roleId) { + return roleRepository.findById(roleId).orElse(null); + } +} diff --git a/src/main/java/org/upsmf/grievance/service/impl/UserServiceImpl.java b/src/main/java/org/upsmf/grievance/service/impl/UserServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..09af433005fa5106444137820896491301a7ee39 --- /dev/null +++ b/src/main/java/org/upsmf/grievance/service/impl/UserServiceImpl.java @@ -0,0 +1,65 @@ +package org.upsmf.grievance.service.impl; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.stereotype.Service; +import org.upsmf.grievance.model.Role; +import org.upsmf.grievance.model.User; +import org.upsmf.grievance.repository.RoleRepository; +import org.upsmf.grievance.repository.UserRepository; +import org.upsmf.grievance.service.UserService; + +import java.util.Collections; + +@Service +public class UserServiceImpl implements UserService { + + @Autowired + private UserRepository userRepository; + + @Autowired + private RoleRepository roleRepository; + + @Autowired + private BCryptPasswordEncoder passwordEncoder; + + + @Override + public User registerUser(User user) { + user.setPassword(passwordEncoder.encode(user.getPassword())); + // Assign a default role for new users + Role userRole = roleRepository.findByName("ROLE_USER"); + user.setRoles(Collections.singleton(userRole)); + return userRepository.save(user); + } + + @Override + public User findByUsername(String username) { + + return userRepository.findByUsername(username); + } + + @Override + public boolean matchPassword(String rawPassword, String hashedPassword) { + return passwordEncoder.matches(rawPassword, hashedPassword); + } + + @Override + public void resetUserPassword(String email, String newPassword) throws Exception { + User user = userRepository.findByEmail(email); + + if (user == null) { + throw new Exception("User not found"); + } + + user.setPassword(newPassword); + userRepository.save(user); + } + + @Override + public User findByEmail(String email) { + + return userRepository.findByEmail(email); + } + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 3434466049ea180d8e16778601a098b223803f1e..cd21f6f2a2efa93e88e3bec0f39c10065179a1b7 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -43,4 +43,7 @@ gcp.bucket.folder.name=grievance gcp.max.file.size=2mb gcp.config.file.path=/Users/shishirsuman/Desktop/upsmf.json gcp.client.id= +gcp.client.email= +gcp.pkcs.key= +gcp.private.key.id=