From b92c8dffa3d6df85af1da4f89d822b1e9d028829 Mon Sep 17 00:00:00 2001 From: Ajay Maharjan Date: Fri, 21 Jul 2023 19:10:39 +0545 Subject: [PATCH 01/18] Password reset done --- InternSathi/build.gradle | 1 + .../controller/HomeDashboardController.java | 5 +- .../controller/UserController.java | 102 ++++++++++++------ .../javaAssignment/dto/ResetPasswordDto.java | 11 ++ .../javaAssignment/entity/EmailMessage.java | 20 ++++ .../javaAssignment/entity/Otp.java | 25 +++++ .../javaAssignment/repository/OtpRepo.java | 13 +++ .../repository/UserRepository.java | 11 ++ .../security/SecurityConfig.java | 6 +- .../javaAssignment/service/EmailService.java | 9 ++ .../javaAssignment/service/UserService.java | 4 + .../EmailServiceImplementation.java | 57 ++++++++++ .../UserServiceImplementation.java | 29 ++++- .../src/main/resources/application.yml | 12 +++ .../resources/templates/forgetPassword.html | 48 +++++++++ .../src/main/resources/templates/login.html | 4 +- .../resources/templates/otpVerification.html | 45 ++++++++ 17 files changed, 361 insertions(+), 41 deletions(-) create mode 100644 InternSathi/src/main/java/internsathi/javaAssignment/dto/ResetPasswordDto.java create mode 100644 InternSathi/src/main/java/internsathi/javaAssignment/entity/EmailMessage.java create mode 100644 InternSathi/src/main/java/internsathi/javaAssignment/entity/Otp.java create mode 100644 InternSathi/src/main/java/internsathi/javaAssignment/repository/OtpRepo.java create mode 100644 InternSathi/src/main/java/internsathi/javaAssignment/service/EmailService.java create mode 100644 InternSathi/src/main/java/internsathi/javaAssignment/serviceImplementation/EmailServiceImplementation.java create mode 100644 InternSathi/src/main/resources/templates/forgetPassword.html create mode 100644 InternSathi/src/main/resources/templates/otpVerification.html diff --git a/InternSathi/build.gradle b/InternSathi/build.gradle index a96702d..90facad 100644 --- a/InternSathi/build.gradle +++ b/InternSathi/build.gradle @@ -32,6 +32,7 @@ dependencies { implementation 'io.jsonwebtoken:jjwt-api:0.11.5' implementation 'io.jsonwebtoken:jjwt-impl:0.11.5' implementation 'io.jsonwebtoken:jjwt-jackson:0.11.5' + implementation 'org.springframework.boot:spring-boot-starter-mail:3.1.1' compileOnly 'org.projectlombok:lombok' runtimeOnly 'org.postgresql:postgresql' annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.3.Final' diff --git a/InternSathi/src/main/java/internsathi/javaAssignment/controller/HomeDashboardController.java b/InternSathi/src/main/java/internsathi/javaAssignment/controller/HomeDashboardController.java index 2242606..f05ccd0 100644 --- a/InternSathi/src/main/java/internsathi/javaAssignment/controller/HomeDashboardController.java +++ b/InternSathi/src/main/java/internsathi/javaAssignment/controller/HomeDashboardController.java @@ -2,6 +2,7 @@ import internsathi.javaAssignment.model.UserSecurity; import internsathi.javaAssignment.security.token.JwtTokenService; +import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.Authentication; import org.springframework.stereotype.Controller; @@ -25,17 +26,19 @@ public HomeDashboardController(JwtTokenService jwtTokenService) { } @GetMapping("/home") - public String homePage(Model model, Authentication authentication, Principal principal) { + public String homePage(Model model, Authentication authentication, Principal principal, HttpServletResponse response) { if (authentication.isAuthenticated()) { String loggedInUser = (String) authentication.getPrincipal(); log.info("...{}", loggedInUser); String token; try { token = jwtTokenService.generateToken(loggedInUser); + response.addHeader("Authorization", "Bearer " + token); } catch (Exception e) { token = "1234"; throw new RuntimeException(e); } + model.addAttribute("token", token); log.info("token {}", token); } diff --git a/InternSathi/src/main/java/internsathi/javaAssignment/controller/UserController.java b/InternSathi/src/main/java/internsathi/javaAssignment/controller/UserController.java index 0d307b3..7593a97 100644 --- a/InternSathi/src/main/java/internsathi/javaAssignment/controller/UserController.java +++ b/InternSathi/src/main/java/internsathi/javaAssignment/controller/UserController.java @@ -1,21 +1,17 @@ package internsathi.javaAssignment.controller; import internsathi.javaAssignment.dto.LoginDto; -import internsathi.javaAssignment.model.UserSecurity; +import internsathi.javaAssignment.dto.ResetPasswordDto; import internsathi.javaAssignment.security.token.JwtTokenService; +import internsathi.javaAssignment.service.EmailService; import internsathi.javaAssignment.service.UserService; -import lombok.extern.java.Log; +import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; -import java.security.NoSuchAlgorithmException; -import java.security.Principal; -import java.security.spec.InvalidKeySpecException; - //@RestController @Controller @RequestMapping("/internsathi/user") @@ -24,10 +20,12 @@ public class UserController { private final UserService userService; private final JwtTokenService jwtTokenService; + private final EmailService emailService; - public UserController(UserService userService, JwtTokenService jwtTokenService) { + public UserController(UserService userService, JwtTokenService jwtTokenService, EmailService emailService) { this.userService = userService; this.jwtTokenService = jwtTokenService; + this.emailService = emailService; } /*@PostMapping("/registerUser") @@ -44,33 +42,71 @@ public ResponseEntity registerUser(@RequestBody Use } }*/ - @GetMapping("/login") - public String loginPage(Model model, @RequestParam(defaultValue = "false", value = "error") boolean error) { - model.addAttribute("login", new LoginDto()); - if (error) { - model.addAttribute("error", true); - } - return "login"; + @GetMapping("/login") + public String loginPage(Model model, @RequestParam(defaultValue = "false", value = "error") boolean error, @RequestParam(value = "isOtpVerified", defaultValue = "false") boolean isOtpVerified) { + model.addAttribute("login", new LoginDto()); + if (error) { + model.addAttribute("error", true); + } + if (isOtpVerified) { + model.addAttribute("isOtpVerified", true); + } + return "login"; + } + + @PostMapping("/login") + public String login(Model model, Authentication authentication) { + if (authentication.isAuthenticated()) { + return "redirect:/internsathi/user/home"; + } + System.out.println(authentication.isAuthenticated()); + return "redirect:/internsathi/user/login?error=true"; + } + + @GetMapping("/resetPassword") + public String resetPasswordPage(Model model, @RequestParam(value = "error", defaultValue = "false") boolean error) { + model.addAttribute("resetPassword", new ResetPasswordDto()); + model.addAttribute("error", error); + return "forgetPassword"; + } + + @PostMapping("/resetPassword") + public String resetPassword(Model model, @ModelAttribute ResetPasswordDto resetPassword) { + /*ResetPasswordDto resetPassword = (ResetPasswordDto) model.getAttribute("resetPassword"); + assert resetPassword != null;*/ + boolean doesUsernameAndEmailExists = userService.doesEmailAndUsernameExits(resetPassword.getUsername(), resetPassword.getEmail()); + if (!doesUsernameAndEmailExists) { + model.addAttribute("error", true); + return "redirect:/internsathi/user/resetPassword?error=true"; + } else { + model.addAttribute("success", true); + return "redirect:/internsathi/user/otpVerification?username=" + resetPassword.getUsername(); } + } - @PostMapping("/login") - public String login(Model model, Authentication authentication) { - if (authentication.isAuthenticated()) { - /*UserSecurity loggedInUser = (UserSecurity) authentication.getPrincipal(); - log.info("...{}", loggedInUser.user()); - String token; - try { - token = jwtTokenService.generateToken(loggedInUser.getUsername()); - } catch (InvalidKeySpecException | NoSuchAlgorithmException e) { - token = "1234"; - throw new RuntimeException(e); - } - model.addAttribute("token", token); - log.info("token {}", token);*/ - return "redirect:/internsathi/user/home"; - } - System.out.println(authentication.isAuthenticated()); - return "redirect:/internsathi/user/login?error=true"; + @GetMapping("/otpVerification") + public String OtpVerificationPage(Model model, + @RequestParam(value = "error", defaultValue = "false") boolean error, + @RequestParam("username") String username) { + model.addAttribute("username", username); + model.addAttribute("otpKey", String.class); + model.addAttribute("error", error); + return "otpVerification"; + } + + @PostMapping("/otpVerification") + public String verifyOtp(Model model, + @RequestParam("username") String username, + @RequestParam("password") String password, + String otpKey) { + log.info("username: {}", username); + System.out.println(otpKey); + boolean isOtpVerified = emailService.verifyOtp(otpKey, username); + if (isOtpVerified) { + userService.updatePassword(username, password); + return "redirect:/internsathi/user/login?isOtpVerified=true"; } + return "redirect:/internsathi/user/otpVerification?username=" + username +"&error=true"; + } } diff --git a/InternSathi/src/main/java/internsathi/javaAssignment/dto/ResetPasswordDto.java b/InternSathi/src/main/java/internsathi/javaAssignment/dto/ResetPasswordDto.java new file mode 100644 index 0000000..3724cfa --- /dev/null +++ b/InternSathi/src/main/java/internsathi/javaAssignment/dto/ResetPasswordDto.java @@ -0,0 +1,11 @@ +package internsathi.javaAssignment.dto; + +import lombok.Data; + +@Data +public class ResetPasswordDto { + + private String username; + private String email; + private String password; +} diff --git a/InternSathi/src/main/java/internsathi/javaAssignment/entity/EmailMessage.java b/InternSathi/src/main/java/internsathi/javaAssignment/entity/EmailMessage.java new file mode 100644 index 0000000..36ed927 --- /dev/null +++ b/InternSathi/src/main/java/internsathi/javaAssignment/entity/EmailMessage.java @@ -0,0 +1,20 @@ +package internsathi.javaAssignment.entity; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class EmailMessage { + + private String mailTo; + public static final String EMAIL_SUBJECT = "Reset password"; + private final String message = "Your 6-digit Otp key is sent to " + this.mailTo + + ". Enter your pin within a minute.\n" + + "Otp key: "; + + public EmailMessage(String mailTo) { + this.mailTo = mailTo; + } +} diff --git a/InternSathi/src/main/java/internsathi/javaAssignment/entity/Otp.java b/InternSathi/src/main/java/internsathi/javaAssignment/entity/Otp.java new file mode 100644 index 0000000..cfc8e07 --- /dev/null +++ b/InternSathi/src/main/java/internsathi/javaAssignment/entity/Otp.java @@ -0,0 +1,25 @@ +package internsathi.javaAssignment.entity; + +import jakarta.persistence.*; +import lombok.Builder; +import lombok.Data; + +@Entity +@Table(name = "tb_otp") +@Data +public class Otp { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String username; + private String otpKey; + + public Otp(String username, String otpKey) { + this.username = username; + this.otpKey = otpKey; + } + + public Otp() { + } +} diff --git a/InternSathi/src/main/java/internsathi/javaAssignment/repository/OtpRepo.java b/InternSathi/src/main/java/internsathi/javaAssignment/repository/OtpRepo.java new file mode 100644 index 0000000..2a6f4a6 --- /dev/null +++ b/InternSathi/src/main/java/internsathi/javaAssignment/repository/OtpRepo.java @@ -0,0 +1,13 @@ +package internsathi.javaAssignment.repository; + +import internsathi.javaAssignment.entity.Otp; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +import java.util.Optional; + +public interface OtpRepo extends JpaRepository { + + @Query("select o from Otp o where o.username = ?2 and o.otpKey = ?1") + Optional findOtpByUsernameAndOtpKey(String otpKey, String username); +} diff --git a/InternSathi/src/main/java/internsathi/javaAssignment/repository/UserRepository.java b/InternSathi/src/main/java/internsathi/javaAssignment/repository/UserRepository.java index 4197f78..7db5daf 100644 --- a/InternSathi/src/main/java/internsathi/javaAssignment/repository/UserRepository.java +++ b/InternSathi/src/main/java/internsathi/javaAssignment/repository/UserRepository.java @@ -1,13 +1,24 @@ package internsathi.javaAssignment.repository; import internsathi.javaAssignment.entity.User; +import jakarta.transaction.Transactional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; +import javax.swing.text.html.Option; import java.util.Optional; +@Transactional public interface UserRepository extends JpaRepository { @Query("select u from User u where u.username = ?1") Optional findByUsername(String username); + + @Query("select u from User u where u.username = ?1 and u.email = ?2") + Optional findByUsernameAndEmail(String username, String email); + + @Modifying + @Query("update User u set u.password=?2 where u.username =?1") + void updateUserPassword(String username, String password); } diff --git a/InternSathi/src/main/java/internsathi/javaAssignment/security/SecurityConfig.java b/InternSathi/src/main/java/internsathi/javaAssignment/security/SecurityConfig.java index 85043cc..ff0f7e6 100644 --- a/InternSathi/src/main/java/internsathi/javaAssignment/security/SecurityConfig.java +++ b/InternSathi/src/main/java/internsathi/javaAssignment/security/SecurityConfig.java @@ -35,7 +35,11 @@ public SecurityFilterChain appConfig(HttpSecurity http) throws Exception { .authorizeHttpRequests( authorize -> authorize .requestMatchers("/css/**").permitAll() - .requestMatchers("/internsathi/user/login").permitAll() + .requestMatchers( + "/internsathi/user/login", + "/internsathi/user/registerUser", + "/internsathi/user/resetPassword", + "/internsathi/user/otpVerification").permitAll() .requestMatchers("/internsathi/user/registerUser").permitAll() .anyRequest().authenticated() ) diff --git a/InternSathi/src/main/java/internsathi/javaAssignment/service/EmailService.java b/InternSathi/src/main/java/internsathi/javaAssignment/service/EmailService.java new file mode 100644 index 0000000..6e4bdf2 --- /dev/null +++ b/InternSathi/src/main/java/internsathi/javaAssignment/service/EmailService.java @@ -0,0 +1,9 @@ +package internsathi.javaAssignment.service; + +import internsathi.javaAssignment.entity.EmailMessage; + +public interface EmailService { + void sendEmail(EmailMessage emailMessage, String username); + + boolean verifyOtp(String otpKey, String username); +} diff --git a/InternSathi/src/main/java/internsathi/javaAssignment/service/UserService.java b/InternSathi/src/main/java/internsathi/javaAssignment/service/UserService.java index cfa6752..1e10123 100644 --- a/InternSathi/src/main/java/internsathi/javaAssignment/service/UserService.java +++ b/InternSathi/src/main/java/internsathi/javaAssignment/service/UserService.java @@ -6,4 +6,8 @@ public interface UserService { UserRegistrationResponseDto registerUser(UserRegistrationDto userRegistrationDetails) throws Exception; + + boolean doesEmailAndUsernameExits(String username, String email); + + void updatePassword(String username, String password); } diff --git a/InternSathi/src/main/java/internsathi/javaAssignment/serviceImplementation/EmailServiceImplementation.java b/InternSathi/src/main/java/internsathi/javaAssignment/serviceImplementation/EmailServiceImplementation.java new file mode 100644 index 0000000..8da5575 --- /dev/null +++ b/InternSathi/src/main/java/internsathi/javaAssignment/serviceImplementation/EmailServiceImplementation.java @@ -0,0 +1,57 @@ +package internsathi.javaAssignment.serviceImplementation; + +import internsathi.javaAssignment.entity.EmailMessage; +import internsathi.javaAssignment.entity.Otp; +import internsathi.javaAssignment.repository.OtpRepo; +import internsathi.javaAssignment.service.EmailService; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.stereotype.Service; + +import java.util.Optional; +import java.util.Random; + +@Service +public class EmailServiceImplementation implements EmailService { + + private final JavaMailSender javaMailSender; + private final OtpRepo otpRepo; + + public EmailServiceImplementation(JavaMailSender javaMailSender, OtpRepo otpRepo) { + this.javaMailSender = javaMailSender; + this.otpRepo = otpRepo; + } + + @Override + public void sendEmail(EmailMessage emailMessage, String username) { + SimpleMailMessage simpleMailMessage = new SimpleMailMessage(); + String otpKey = generateOtpKey(); + Otp otp = new Otp(username, otpKey); + otpRepo.save(otp); + + simpleMailMessage.setFrom("ajaymaharjan0007@gmail.com"); + simpleMailMessage.setTo(emailMessage.getMailTo()); + simpleMailMessage.setSubject(EmailMessage.EMAIL_SUBJECT); + simpleMailMessage.setText(emailMessage + otpKey); + + this.javaMailSender.send(simpleMailMessage); + } + + @Override + public boolean verifyOtp(String otpKey, String username) { + Optional otp = otpRepo.findOtpByUsernameAndOtpKey(otpKey, username); + return otp.isPresent(); + } + + private String generateOtpKey() { + String digits = "0123456789"; + int lengthOfOtp = 6; + Random random = new Random(); + StringBuilder otp = new StringBuilder(); + for (int i = 0; i < lengthOfOtp; i++) { + int index = random.nextInt(digits.length()); + otp.append(digits.charAt(index)); + } + return otp.toString(); + } +} diff --git a/InternSathi/src/main/java/internsathi/javaAssignment/serviceImplementation/UserServiceImplementation.java b/InternSathi/src/main/java/internsathi/javaAssignment/serviceImplementation/UserServiceImplementation.java index fe55ac3..8cc9ebd 100644 --- a/InternSathi/src/main/java/internsathi/javaAssignment/serviceImplementation/UserServiceImplementation.java +++ b/InternSathi/src/main/java/internsathi/javaAssignment/serviceImplementation/UserServiceImplementation.java @@ -2,32 +2,32 @@ import internsathi.javaAssignment.dto.UserRegistrationDto; import internsathi.javaAssignment.dto.UserRegistrationResponseDto; -import internsathi.javaAssignment.entity.User; +import internsathi.javaAssignment.entity.EmailMessage; import internsathi.javaAssignment.mapper.UserMapper; import internsathi.javaAssignment.model.UserSecurity; import internsathi.javaAssignment.repository.UserRepository; +import internsathi.javaAssignment.service.EmailService; import internsathi.javaAssignment.service.UserService; import org.springframework.http.HttpStatus; -import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; -import javax.swing.text.html.Option; import java.util.Optional; -import java.util.function.Function; @Service public class UserServiceImplementation implements UserDetailsService, UserService { private final UserRepository userRepo; private final PasswordEncoder passwordEncoder; + private final EmailService emailService; - public UserServiceImplementation(UserRepository userRepo, PasswordEncoder passwordEncoder) { + public UserServiceImplementation(UserRepository userRepo, PasswordEncoder passwordEncoder, EmailService emailService) { this.userRepo = userRepo; this.passwordEncoder = passwordEncoder; + this.emailService = emailService; } @Override @@ -51,4 +51,23 @@ public UserRegistrationResponseDto registerUser(UserRegistrationDto userRegistra .build() ).orElseThrow(() -> new RuntimeException("User Registration Failed")); } + + @Override + public boolean doesEmailAndUsernameExits(String username, String email) { + boolean userAvailable = userRepo.findByUsernameAndEmail(username, email) + .isPresent(); + if (userAvailable) { + emailService.sendEmail( + new EmailMessage(email), username + ); + } + return userAvailable; + } + + @Override + public void updatePassword(String username, String password) { + password = passwordEncoder.encode(password); + userRepo.updateUserPassword(username, password); + + } } diff --git a/InternSathi/src/main/resources/application.yml b/InternSathi/src/main/resources/application.yml index 9e8254c..6405964 100644 --- a/InternSathi/src/main/resources/application.yml +++ b/InternSathi/src/main/resources/application.yml @@ -15,3 +15,15 @@ spring: username: postgres password: 8956 + mail: + host: smtp.gmail.com + port: 587 + username: ajaymaharjan0007@gmail.com + password: gdlxabqhpteinymu + properties: + mail: + smtp: + auth: true + starttls: + enable: true + diff --git a/InternSathi/src/main/resources/templates/forgetPassword.html b/InternSathi/src/main/resources/templates/forgetPassword.html new file mode 100644 index 0000000..260fb8f --- /dev/null +++ b/InternSathi/src/main/resources/templates/forgetPassword.html @@ -0,0 +1,48 @@ + + + + + Reset Password + + + +
+

Reset Password

+ +
+ + + + \ No newline at end of file diff --git a/InternSathi/src/main/resources/templates/login.html b/InternSathi/src/main/resources/templates/login.html index 81775f4..50322a6 100644 --- a/InternSathi/src/main/resources/templates/login.html +++ b/InternSathi/src/main/resources/templates/login.html @@ -14,6 +14,8 @@

InternSathi

Login

Invalid username and password.
+
+ Your password is reset. Please login with your new password
You have been logged out.
@@ -25,7 +27,7 @@

Login

-
forget password?
+
forget password?
Not registered yet!! click here diff --git a/InternSathi/src/main/resources/templates/otpVerification.html b/InternSathi/src/main/resources/templates/otpVerification.html new file mode 100644 index 0000000..82b14c1 --- /dev/null +++ b/InternSathi/src/main/resources/templates/otpVerification.html @@ -0,0 +1,45 @@ + + + + + + OTP Verification + + + +
+
+ +
+
+
+
+ Otp mismatch. Provide correct key.
+

Enter OTP

+
+
+ + + + +
+
+ +
+
+
Didn't receive OTP? Resend OTP
+
+
+
+ + + From 41308efb2716df87d39a50a4d3b4a6953e5747f1 Mon Sep 17 00:00:00 2001 From: Ajay Maharjan Date: Fri, 21 Jul 2023 21:49:28 +0545 Subject: [PATCH 02/18] Update and Delete Trying --- .../AdminRegistrationController.java | 37 +++++++ .../controller/HomeDashboardController.java | 46 ++++++--- .../controller/RegisterUserController.java | 16 +-- .../controller/UserController.java | 13 ++- .../javaAssignment/mapper/UserMapper.java | 13 +++ .../javaAssignment/service/UserService.java | 5 + .../UserServiceImplementation.java | 7 ++ .../src/main/resources/static/css/style2.css | 45 ++++++++- .../src/main/resources/templates/home.html | 45 --------- .../main/resources/templates/userHome.html | 99 +++++++++++++++++++ 10 files changed, 252 insertions(+), 74 deletions(-) create mode 100644 InternSathi/src/main/java/internsathi/javaAssignment/controller/AdminRegistrationController.java delete mode 100644 InternSathi/src/main/resources/templates/home.html create mode 100644 InternSathi/src/main/resources/templates/userHome.html diff --git a/InternSathi/src/main/java/internsathi/javaAssignment/controller/AdminRegistrationController.java b/InternSathi/src/main/java/internsathi/javaAssignment/controller/AdminRegistrationController.java new file mode 100644 index 0000000..b230e30 --- /dev/null +++ b/InternSathi/src/main/java/internsathi/javaAssignment/controller/AdminRegistrationController.java @@ -0,0 +1,37 @@ +package internsathi.javaAssignment.controller; + +import internsathi.javaAssignment.dto.UserRegistrationDto; +import internsathi.javaAssignment.dto.UserRegistrationResponseDto; +import internsathi.javaAssignment.service.UserService; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +@RequestMapping("/internsathi/admin/") +public class AdminRegistrationController { + + private final UserService userService; + + public AdminRegistrationController(UserService userService) { + this.userService = userService; + } + + @PostMapping(value = "/registerAdmin") + public String registerAdmin(Model model, @ModelAttribute UserRegistrationDto userRegistrationDetail) { + try { + userRegistrationDetail.setRole("ADMIN, USER"); + UserRegistrationResponseDto userRegistrationResponseDto = userService.registerUser(userRegistrationDetail); + if (userRegistrationResponseDto.getStatus().equals(HttpStatus.CREATED)) { + model.addAttribute("isRegistrationSuccessful", true); + return "redirect:/internsathi/user/registerUser?isRegistrationSuccessful=true"; + } + return "redirect:/internsathi/user/registerUser?isRegistrationError=true"; + } catch (Exception e) { + return "redirect:/internsathi/user/registerUser?isRegistrationError=true"; + } + } +} diff --git a/InternSathi/src/main/java/internsathi/javaAssignment/controller/HomeDashboardController.java b/InternSathi/src/main/java/internsathi/javaAssignment/controller/HomeDashboardController.java index f05ccd0..0394d00 100644 --- a/InternSathi/src/main/java/internsathi/javaAssignment/controller/HomeDashboardController.java +++ b/InternSathi/src/main/java/internsathi/javaAssignment/controller/HomeDashboardController.java @@ -1,49 +1,71 @@ package internsathi.javaAssignment.controller; -import internsathi.javaAssignment.model.UserSecurity; +import internsathi.javaAssignment.Enum.Role; +import internsathi.javaAssignment.entity.User; import internsathi.javaAssignment.security.token.JwtTokenService; +import internsathi.javaAssignment.service.UserService; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; -import java.security.NoSuchAlgorithmException; import java.security.Principal; -import java.security.spec.InvalidKeySpecException; +import java.util.ArrayList; +import java.util.List; -@RequestMapping("/internsathi/user") +@RequestMapping("/internsathi") @Controller @Slf4j public class HomeDashboardController { private final JwtTokenService jwtTokenService; + private final UserService userService; - public HomeDashboardController(JwtTokenService jwtTokenService) { + public HomeDashboardController(JwtTokenService jwtTokenService, UserService userService) { this.jwtTokenService = jwtTokenService; + this.userService = userService; } - @GetMapping("/home") - public String homePage(Model model, Authentication authentication, Principal principal, HttpServletResponse response) { + @GetMapping("/user/home") + public String userHomePage(Model model, Authentication authentication, Principal principal, HttpServletResponse response) { if (authentication.isAuthenticated()) { + + List authorities = authentication.getAuthorities() + .stream() + .map(GrantedAuthority::getAuthority) + .toList(); + String loggedInUser = (String) authentication.getPrincipal(); - log.info("...{}", loggedInUser); + log.info("logged In: .......{}", loggedInUser); String token; try { + token = jwtTokenService.generateToken(loggedInUser); response.addHeader("Authorization", "Bearer " + token); + model.addAttribute("token", token); + model.addAttribute("principal", principal.getName()); + + log.info("token {}", token); } catch (Exception e) { token = "1234"; throw new RuntimeException(e); } - model.addAttribute("token", token); - log.info("token {}", token); + log.info("is Admin?...." + authorities.contains(Role.ADMIN.name())); + if (authorities.contains(Role.ADMIN.name())) { + List userList = getAllUser(); + model.addAttribute("admin", true); + model.addAttribute("userList", userList); + } } - model.addAttribute("principal", principal.getName()); - return "home"; + return "userHome"; } + private List getAllUser() { + return userService.getAllUser(); + } } diff --git a/InternSathi/src/main/java/internsathi/javaAssignment/controller/RegisterUserController.java b/InternSathi/src/main/java/internsathi/javaAssignment/controller/RegisterUserController.java index bf9f9b3..d3cd0d7 100644 --- a/InternSathi/src/main/java/internsathi/javaAssignment/controller/RegisterUserController.java +++ b/InternSathi/src/main/java/internsathi/javaAssignment/controller/RegisterUserController.java @@ -5,7 +5,6 @@ import internsathi.javaAssignment.service.UserService; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; @@ -34,6 +33,7 @@ public String registerPage(Model model, @PostMapping(value = "/registerUser") public String registerUser(Model model, @ModelAttribute UserRegistrationDto userRegistrationDetail) { try { + userRegistrationDetail.setRole("USER"); UserRegistrationResponseDto userRegistrationResponseDto = userService.registerUser(userRegistrationDetail); if (userRegistrationResponseDto.getStatus().equals(HttpStatus.CREATED)) { model.addAttribute("isRegistrationSuccessful", true); @@ -44,18 +44,4 @@ public String registerUser(Model model, @ModelAttribute UserRegistrationDto user return "redirect:/internsathi/user/registerUser?isRegistrationError=true"; } } - - /*@PostMapping("/registerUser") - public ResponseEntity registerUser(@RequestBody UserRegistrationDto userRegistrationDetail) { - try { - return new ResponseEntity<>(userService.registerUser(userRegistrationDetail), HttpStatus.CREATED); - } catch (Exception e) { - UserRegistrationResponseDto userRegistrationFailedResponse = UserRegistrationResponseDto.builder() - .message("User registration Failed") - .status(HttpStatus.BAD_REQUEST) - .username(userRegistrationDetail.getUsername()) - .build(); - return new ResponseEntity<>(userRegistrationFailedResponse, HttpStatus.BAD_REQUEST); - } - }*/ } diff --git a/InternSathi/src/main/java/internsathi/javaAssignment/controller/UserController.java b/InternSathi/src/main/java/internsathi/javaAssignment/controller/UserController.java index 7593a97..99fc7c4 100644 --- a/InternSathi/src/main/java/internsathi/javaAssignment/controller/UserController.java +++ b/InternSathi/src/main/java/internsathi/javaAssignment/controller/UserController.java @@ -1,5 +1,6 @@ package internsathi.javaAssignment.controller; +import internsathi.javaAssignment.Enum.Role; import internsathi.javaAssignment.dto.LoginDto; import internsathi.javaAssignment.dto.ResetPasswordDto; import internsathi.javaAssignment.security.token.JwtTokenService; @@ -8,10 +9,16 @@ import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + //@RestController @Controller @RequestMapping("/internsathi/user") @@ -56,10 +63,14 @@ public String loginPage(Model model, @RequestParam(defaultValue = "false", value @PostMapping("/login") public String login(Model model, Authentication authentication) { + List authorities = authentication.getAuthorities() + .stream() + .map(GrantedAuthority::getAuthority) + .toList(); + System.out.println("...." + authorities.contains(Role.ADMIN.name())); if (authentication.isAuthenticated()) { return "redirect:/internsathi/user/home"; } - System.out.println(authentication.isAuthenticated()); return "redirect:/internsathi/user/login?error=true"; } diff --git a/InternSathi/src/main/java/internsathi/javaAssignment/mapper/UserMapper.java b/InternSathi/src/main/java/internsathi/javaAssignment/mapper/UserMapper.java index 87b1f35..79e9852 100644 --- a/InternSathi/src/main/java/internsathi/javaAssignment/mapper/UserMapper.java +++ b/InternSathi/src/main/java/internsathi/javaAssignment/mapper/UserMapper.java @@ -38,6 +38,19 @@ default List parseRole(String role) { } default User conversionFromRegistrationDtoToUser(UserRegistrationDto registrationDto) { + return User.builder() + .username(registrationDto.getUsername()) + .name(registrationDto.getName()) + .address(registrationDto.getAddress()) + .dateOfBirth(registrationDto.getDateOfBirth()) + .email(registrationDto.getEmail()) + .phoneNumber(registrationDto.getPhoneNumber()) + .password(registrationDto.getPassword()) + .role(registrationDto.getRole()) + .build(); + } + + default User conversionFromRegistrationDtoToAdminUser(UserRegistrationDto registrationDto) { return User.builder() .username(registrationDto.getUsername()) .name(registrationDto.getName()) diff --git a/InternSathi/src/main/java/internsathi/javaAssignment/service/UserService.java b/InternSathi/src/main/java/internsathi/javaAssignment/service/UserService.java index 1e10123..fa4c1e4 100644 --- a/InternSathi/src/main/java/internsathi/javaAssignment/service/UserService.java +++ b/InternSathi/src/main/java/internsathi/javaAssignment/service/UserService.java @@ -2,6 +2,9 @@ import internsathi.javaAssignment.dto.UserRegistrationDto; import internsathi.javaAssignment.dto.UserRegistrationResponseDto; +import internsathi.javaAssignment.entity.User; + +import java.util.List; public interface UserService { @@ -10,4 +13,6 @@ public interface UserService { boolean doesEmailAndUsernameExits(String username, String email); void updatePassword(String username, String password); + + List getAllUser(); } diff --git a/InternSathi/src/main/java/internsathi/javaAssignment/serviceImplementation/UserServiceImplementation.java b/InternSathi/src/main/java/internsathi/javaAssignment/serviceImplementation/UserServiceImplementation.java index 8cc9ebd..d8329a6 100644 --- a/InternSathi/src/main/java/internsathi/javaAssignment/serviceImplementation/UserServiceImplementation.java +++ b/InternSathi/src/main/java/internsathi/javaAssignment/serviceImplementation/UserServiceImplementation.java @@ -3,6 +3,7 @@ import internsathi.javaAssignment.dto.UserRegistrationDto; import internsathi.javaAssignment.dto.UserRegistrationResponseDto; import internsathi.javaAssignment.entity.EmailMessage; +import internsathi.javaAssignment.entity.User; import internsathi.javaAssignment.mapper.UserMapper; import internsathi.javaAssignment.model.UserSecurity; import internsathi.javaAssignment.repository.UserRepository; @@ -15,6 +16,7 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; +import java.util.List; import java.util.Optional; @Service @@ -70,4 +72,9 @@ public void updatePassword(String username, String password) { userRepo.updateUserPassword(username, password); } + + @Override + public List getAllUser() { + return userRepo.findAll(); + } } diff --git a/InternSathi/src/main/resources/static/css/style2.css b/InternSathi/src/main/resources/static/css/style2.css index b5e2f6b..c6ea434 100644 --- a/InternSathi/src/main/resources/static/css/style2.css +++ b/InternSathi/src/main/resources/static/css/style2.css @@ -176,4 +176,47 @@ footer { .logout-button .navbar-nav .nav-item a { text-decoration: none; color: white; -} \ No newline at end of file +} + +table { + width: 100%; + border-collapse: collapse; + margin-top: 20px; +} + +th, td { + padding: 12px; + text-align: left; + border-bottom: 1px solid #ddd; +} + +th { + background-color: #f2f2f2; +} + +a.delete-user-link { + color: #dc3545; + text-decoration: none; + margin-right: 10px; +} + +a.delete-user-link:hover { + text-decoration: underline; +} + +button.update-button, +button.delete-button { + margin-right: 10px; + padding: 8px 15px; + background-color: #007bff; + border: none; + color: #fff; + border-radius: 5px; + cursor: pointer; + transition: background-color 0.3s ease; +} + +button.update-button:hover, +button.delete-button:hover { + background-color: #0056b3; +} diff --git a/InternSathi/src/main/resources/templates/home.html b/InternSathi/src/main/resources/templates/home.html deleted file mode 100644 index 145c6b5..0000000 --- a/InternSathi/src/main/resources/templates/home.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - InternSathi - Home - - - -
-
- - -
- -
-
-
- -
-

Authentication Successful,


-

-
- -
- -
- - - - diff --git a/InternSathi/src/main/resources/templates/userHome.html b/InternSathi/src/main/resources/templates/userHome.html new file mode 100644 index 0000000..9481920 --- /dev/null +++ b/InternSathi/src/main/resources/templates/userHome.html @@ -0,0 +1,99 @@ + + + + + + InternSathi - Home + + + +
+
+ + +
+ +
+
+
+ +
+

Welcome User,


+

Bearer Token:

+ +
+ + +

Perform Action:

+ + + + + + + + + + + + + + + +
User IDUsernameEmailActions
+ + +
+
+ + +
+ +
+ + + + From d339fe6626b1deabf01395e81fc0730b317f7642 Mon Sep 17 00:00:00 2001 From: Ajay Maharjan Date: Fri, 21 Jul 2023 23:43:40 +0545 Subject: [PATCH 03/18] Delete operation successfully done --- .../AdminRegistrationController.java | 4 +- .../controller/HomeDashboardController.java | 46 ++++++++----- .../javaAssignment/mapper/UserMapper.java | 4 +- .../javaAssignment/service/UserService.java | 3 + .../UserServiceImplementation.java | 5 ++ .../src/main/resources/templates/login.html | 8 +-- .../main/resources/templates/userHome.html | 68 +++++++++---------- 7 files changed, 76 insertions(+), 62 deletions(-) diff --git a/InternSathi/src/main/java/internsathi/javaAssignment/controller/AdminRegistrationController.java b/InternSathi/src/main/java/internsathi/javaAssignment/controller/AdminRegistrationController.java index b230e30..10739b8 100644 --- a/InternSathi/src/main/java/internsathi/javaAssignment/controller/AdminRegistrationController.java +++ b/InternSathi/src/main/java/internsathi/javaAssignment/controller/AdminRegistrationController.java @@ -6,9 +6,7 @@ import org.springframework.http.HttpStatus; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.*; @Controller @RequestMapping("/internsathi/admin/") diff --git a/InternSathi/src/main/java/internsathi/javaAssignment/controller/HomeDashboardController.java b/InternSathi/src/main/java/internsathi/javaAssignment/controller/HomeDashboardController.java index 0394d00..2b05eae 100644 --- a/InternSathi/src/main/java/internsathi/javaAssignment/controller/HomeDashboardController.java +++ b/InternSathi/src/main/java/internsathi/javaAssignment/controller/HomeDashboardController.java @@ -4,14 +4,14 @@ import internsathi.javaAssignment.entity.User; import internsathi.javaAssignment.security.token.JwtTokenService; import internsathi.javaAssignment.service.UserService; +import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.*; import java.security.Principal; import java.util.ArrayList; @@ -31,30 +31,35 @@ public HomeDashboardController(JwtTokenService jwtTokenService, UserService user } @GetMapping("/user/home") - public String userHomePage(Model model, Authentication authentication, Principal principal, HttpServletResponse response) { + public String userHomePage(Model model, Authentication authentication, Principal principal, + HttpServletRequest request, HttpServletResponse response) { if (authentication.isAuthenticated()) { - List authorities = authentication.getAuthorities() .stream() .map(GrantedAuthority::getAuthority) .toList(); - - String loggedInUser = (String) authentication.getPrincipal(); - log.info("logged In: .......{}", loggedInUser); String token; - try { + String loggedInUser = (String) authentication.getPrincipal(); + if (request.getHeader("Authorization") == null) { - token = jwtTokenService.generateToken(loggedInUser); - response.addHeader("Authorization", "Bearer " + token); - model.addAttribute("token", token); - model.addAttribute("principal", principal.getName()); + log.info("logged In: .......{}", loggedInUser); + try { - log.info("token {}", token); - } catch (Exception e) { - token = "1234"; - throw new RuntimeException(e); - } + token = jwtTokenService.generateToken(loggedInUser); + model.addAttribute("token", token); + model.addAttribute("principal", principal.getName()); + response.addHeader("Authorization", token); + log.info("token {}", token); + } catch (Exception e) { + token = "1234"; + throw new RuntimeException(e); + } + } + if (request.getHeader("Authorization") != null) { + token = request.getHeader("Authorization"); + response.addHeader("Authorization", token); + } log.info("is Admin?...." + authorities.contains(Role.ADMIN.name())); if (authorities.contains(Role.ADMIN.name())) { List userList = getAllUser(); @@ -65,6 +70,13 @@ public String userHomePage(Model model, Authentication authentication, Principal return "userHome"; } + @PostMapping("/admin/deleteUserById") + public String deleteUserById(Model model, @RequestParam(value = "userId", defaultValue = "0") Long userId) { + userService.deleteUserById(userId); + return "redirect:/internsathi/user/home"; + + } + private List getAllUser() { return userService.getAllUser(); } diff --git a/InternSathi/src/main/java/internsathi/javaAssignment/mapper/UserMapper.java b/InternSathi/src/main/java/internsathi/javaAssignment/mapper/UserMapper.java index 79e9852..7caad64 100644 --- a/InternSathi/src/main/java/internsathi/javaAssignment/mapper/UserMapper.java +++ b/InternSathi/src/main/java/internsathi/javaAssignment/mapper/UserMapper.java @@ -46,7 +46,7 @@ default User conversionFromRegistrationDtoToUser(UserRegistrationDto registratio .email(registrationDto.getEmail()) .phoneNumber(registrationDto.getPhoneNumber()) .password(registrationDto.getPassword()) - .role(registrationDto.getRole()) + .role(Role.USER.name()) .build(); } @@ -59,7 +59,7 @@ default User conversionFromRegistrationDtoToAdminUser(UserRegistrationDto regist .email(registrationDto.getEmail()) .phoneNumber(registrationDto.getPhoneNumber()) .password(registrationDto.getPassword()) - .role(Role.USER.name()) + .role(Role.ADMIN.name()) .build(); } diff --git a/InternSathi/src/main/java/internsathi/javaAssignment/service/UserService.java b/InternSathi/src/main/java/internsathi/javaAssignment/service/UserService.java index fa4c1e4..476b1bc 100644 --- a/InternSathi/src/main/java/internsathi/javaAssignment/service/UserService.java +++ b/InternSathi/src/main/java/internsathi/javaAssignment/service/UserService.java @@ -15,4 +15,7 @@ public interface UserService { void updatePassword(String username, String password); List getAllUser(); + + void deleteUserById(Long userId); + } diff --git a/InternSathi/src/main/java/internsathi/javaAssignment/serviceImplementation/UserServiceImplementation.java b/InternSathi/src/main/java/internsathi/javaAssignment/serviceImplementation/UserServiceImplementation.java index d8329a6..d8ed5b7 100644 --- a/InternSathi/src/main/java/internsathi/javaAssignment/serviceImplementation/UserServiceImplementation.java +++ b/InternSathi/src/main/java/internsathi/javaAssignment/serviceImplementation/UserServiceImplementation.java @@ -77,4 +77,9 @@ public void updatePassword(String username, String password) { public List getAllUser() { return userRepo.findAll(); } + + @Override + public void deleteUserById(Long userId) { + userRepo.deleteById(userId); + } } diff --git a/InternSathi/src/main/resources/templates/login.html b/InternSathi/src/main/resources/templates/login.html index 50322a6..61a8f4f 100644 --- a/InternSathi/src/main/resources/templates/login.html +++ b/InternSathi/src/main/resources/templates/login.html @@ -12,11 +12,11 @@

InternSathi