From f7042256fbceb90427767293f62f568a1028f0fc Mon Sep 17 00:00:00 2001 From: Anakhe Ajayi Date: Thu, 24 Nov 2022 14:23:30 +0100 Subject: [PATCH] Feature: Change member password --- .../controller/ChangePasswordController.java | 27 ++++++++ .../model/dto/password/ChangePasswordDto.java | 13 ++++ .../InvalidOldPasswordException.java | 12 ++++ .../repository/jpa/PasswordJpaRepository.java | 14 +++++ .../service/ChangePasswordService.java | 11 ++++ .../impl/ChangePasswordServiceImpl.java | 62 +++++++++++++++++++ 6 files changed, 139 insertions(+) create mode 100644 Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/controller/ChangePasswordController.java create mode 100644 Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/model/dto/password/ChangePasswordDto.java create mode 100644 Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/model/exception/InvalidOldPasswordException.java create mode 100644 Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/repository/jpa/PasswordJpaRepository.java create mode 100644 Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/service/ChangePasswordService.java create mode 100644 Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/service/impl/ChangePasswordServiceImpl.java diff --git a/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/controller/ChangePasswordController.java b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/controller/ChangePasswordController.java new file mode 100644 index 00000000..59e8d001 --- /dev/null +++ b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/controller/ChangePasswordController.java @@ -0,0 +1,27 @@ +package com.hydraulic.applyforme.controller; + +import com.hydraulic.applyforme.model.domain.Member; +import com.hydraulic.applyforme.model.dto.password.ChangePasswordDto; +import com.hydraulic.applyforme.service.ChangePasswordService; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping( + value = "password", + produces = { MediaType.APPLICATION_JSON_VALUE } +) +public class ChangePasswordController { + + private ChangePasswordService service; + + public ChangePasswordController(ChangePasswordService passwordService) { + this.service = passwordService; + } + + @PostMapping("/change-password/{id}") + public Member changePassword(@Validated @RequestBody ChangePasswordDto password, @PathVariable(name = "id") Long id){ + return service.changePassword(id, password); + } +} diff --git a/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/model/dto/password/ChangePasswordDto.java b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/model/dto/password/ChangePasswordDto.java new file mode 100644 index 00000000..dacb80b3 --- /dev/null +++ b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/model/dto/password/ChangePasswordDto.java @@ -0,0 +1,13 @@ +package com.hydraulic.applyforme.model.dto.password; + +import com.hydraulic.applyforme.model.domain.Member; +import lombok.Data; + +@Data +public class ChangePasswordDto { + + private String password; + private String oldPassword; + private String newPassword; + private String reNewPassword; +} diff --git a/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/model/exception/InvalidOldPasswordException.java b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/model/exception/InvalidOldPasswordException.java new file mode 100644 index 00000000..d442cbc9 --- /dev/null +++ b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/model/exception/InvalidOldPasswordException.java @@ -0,0 +1,12 @@ +package com.hydraulic.applyforme.model.exception; + +public class InvalidOldPasswordException extends ApplyForMeException{ + + private static final long serialVersionUID = 1L; + public static final String ENTITY_NAME = "Password"; + + @Override + public String getMessage() { + return String.format("%s entry does not match old password.", ENTITY_NAME); + } +} diff --git a/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/repository/jpa/PasswordJpaRepository.java b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/repository/jpa/PasswordJpaRepository.java new file mode 100644 index 00000000..c2aa28b4 --- /dev/null +++ b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/repository/jpa/PasswordJpaRepository.java @@ -0,0 +1,14 @@ +package com.hydraulic.applyforme.repository.jpa; + +import com.hydraulic.applyforme.model.domain.Member; +import com.hydraulic.applyforme.model.dto.password.ChangePasswordDto; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface PasswordJpaRepository extends JpaRepository { + + Optional findById(ChangePasswordDto id); + + Member findById(Long id); +} diff --git a/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/service/ChangePasswordService.java b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/service/ChangePasswordService.java new file mode 100644 index 00000000..a5553749 --- /dev/null +++ b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/service/ChangePasswordService.java @@ -0,0 +1,11 @@ +package com.hydraulic.applyforme.service; + +import com.hydraulic.applyforme.model.domain.Member; +import com.hydraulic.applyforme.model.dto.password.ChangePasswordDto; + +public interface ChangePasswordService { + + Member changePassword(Long Id, ChangePasswordDto password); + + boolean checkIfValidOldPassword(Member member, String password); +} diff --git a/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/service/impl/ChangePasswordServiceImpl.java b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/service/impl/ChangePasswordServiceImpl.java new file mode 100644 index 00000000..c5575a45 --- /dev/null +++ b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/service/impl/ChangePasswordServiceImpl.java @@ -0,0 +1,62 @@ +package com.hydraulic.applyforme.service.impl; + +import com.hydraulic.applyforme.model.domain.Member; +import com.hydraulic.applyforme.model.dto.password.ChangePasswordDto; +import com.hydraulic.applyforme.model.exception.InvalidOldPasswordException; +import com.hydraulic.applyforme.repository.jpa.PasswordJpaRepository; +import com.hydraulic.applyforme.service.ChangePasswordService; +import lombok.extern.slf4j.Slf4j; +import org.modelmapper.ModelMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +import javax.transaction.Transactional; + +import static java.util.regex.Pattern.matches; + +@Slf4j +@Service +public class ChangePasswordServiceImpl implements ChangePasswordService { + + @Autowired + private ModelMapper modelMapper; + + @Autowired + private PasswordEncoder passwordEncoder; + + private final PasswordJpaRepository jpaRepository; + + public ChangePasswordServiceImpl(PasswordJpaRepository jpaRepository) { + this.jpaRepository = jpaRepository; + } + + @Override + @Transactional + public boolean checkIfValidOldPassword(Member member, String oldPassword) { + return matches(oldPassword, member.getPassword()); + } + + @Override + @Transactional + public Member changePassword(Long id, ChangePasswordDto password) { + final Member member = jpaRepository.findById(id); + + Member mapper = new Member(); + mapper = modelMapper.map(id, Member.class); + + if (checkIfValidOldPassword(member, member.getPassword())){ + if (password.getNewPassword().equals(password.getReNewPassword())) { + member.setPassword(password.getNewPassword()); + jpaRepository.save(member); + } + }else{ + throw new InvalidOldPasswordException(); + } + + return member; + + } + + +}