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
+
+
+
+
+
+
+
+
\ 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
-
+
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
+
+
+
+
+
+
+
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 ID |
+ Username |
+ Email |
+ Actions |
+
+
+
+
+ |
+ |
+ |
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
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