Skip to content

Commit da40df1

Browse files
committed
bugfix: changed request parameter to DTO and added validation
1 parent 5d0226c commit da40df1

File tree

6 files changed

+54
-19
lines changed

6 files changed

+54
-19
lines changed

src/main/java/com/chat/yourway/controller/ChangePasswordController.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.chat.yourway.config.openapi.OpenApiExamples;
44
import com.chat.yourway.dto.request.ChangePasswordDto;
5+
import com.chat.yourway.dto.request.RestorePasswordDto;
56
import com.chat.yourway.dto.response.ApiErrorResponseDto;
67
import com.chat.yourway.service.interfaces.ChangePasswordService;
78
import io.swagger.v3.oas.annotations.Operation;
@@ -70,8 +71,8 @@ public void sendRequestToRestorePassword(@RequestParam String email,
7071
@ApiResponse(responseCode = "404", description = EMAIL_TOKEN_NOT_FOUND,
7172
content = @Content(schema = @Schema(implementation = ApiErrorResponseDto.class)))
7273
})
73-
@PatchMapping(path = "/password/restore", produces = APPLICATION_JSON_VALUE)
74-
public void restorePassword(@RequestParam String newPassword, @RequestParam String token) {
75-
changePasswordService.restorePassword(newPassword, token);
74+
@PatchMapping(path = "/password/restore", consumes = APPLICATION_JSON_VALUE)
75+
public void restorePassword(@Valid @RequestBody RestorePasswordDto restorePasswordDto) {
76+
changePasswordService.restorePassword(restorePasswordDto);
7677
}
7778
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.chat.yourway.dto.request;
2+
3+
import com.chat.yourway.annotation.PasswordValidation;
4+
import io.swagger.v3.oas.annotations.media.Schema;
5+
import jakarta.validation.constraints.NotEmpty;
6+
import lombok.AllArgsConstructor;
7+
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
9+
import lombok.Setter;
10+
import lombok.ToString;
11+
12+
@AllArgsConstructor
13+
@NoArgsConstructor
14+
@Setter
15+
@Getter
16+
@ToString
17+
public class RestorePasswordDto {
18+
19+
@Schema(description = "New password", example = "Password-321")
20+
@PasswordValidation
21+
private String newPassword;
22+
23+
@Schema(description = "Email token", example = "245034-cc65-4dce-b374-7419fbfc18e5")
24+
@NotEmpty(message = "Email token cannot be empty")
25+
private String emailToken;
26+
}

src/main/java/com/chat/yourway/service/ChangePasswordServiceImpl.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.chat.yourway.dto.common.EmailMessageInfoDto;
44
import com.chat.yourway.dto.request.ChangePasswordDto;
5+
import com.chat.yourway.dto.request.RestorePasswordDto;
56
import com.chat.yourway.exception.EmailTokenNotFoundException;
67
import com.chat.yourway.model.email.EmailMessageType;
78
import com.chat.yourway.model.email.EmailToken;
@@ -53,7 +54,7 @@ public void sendEmailToRestorePassword(String email, String clientHost) {
5354
var emailMessageInfo = new EmailMessageInfoDto(contact.getNickname(),
5455
contact.getEmail(),
5556
uuidToken,
56-
clientHost,
57+
clientHost,
5758
EmailMessageType.RESTORE_PASSWORD);
5859
var emailMessage = emailMessageFactoryService.generateEmailMessage(emailMessageInfo);
5960

@@ -62,11 +63,11 @@ public void sendEmailToRestorePassword(String email, String clientHost) {
6263

6364
@Override
6465
@Transactional
65-
public void restorePassword(String newPassword, String token) {
66-
var emailToken =
67-
emailTokenRepository.findById(token).orElseThrow(EmailTokenNotFoundException::new);
66+
public void restorePassword(RestorePasswordDto restorePasswordDto) {
67+
var emailToken = emailTokenRepository.findById(restorePasswordDto.getEmailToken())
68+
.orElseThrow(EmailTokenNotFoundException::new);
6869
var contact = emailToken.getContact();
69-
var newEncodedPassword = passwordEncoder.encode(newPassword);
70+
var newEncodedPassword = passwordEncoder.encode(restorePasswordDto.getNewPassword());
7071

7172
contact.setPassword(newEncodedPassword);
7273
emailTokenRepository.delete(emailToken);

src/main/java/com/chat/yourway/service/interfaces/ChangePasswordService.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.chat.yourway.service.interfaces;
22

33
import com.chat.yourway.dto.request.ChangePasswordDto;
4+
import com.chat.yourway.dto.request.RestorePasswordDto;
45
import com.chat.yourway.exception.ContactNotFoundException;
56
import com.chat.yourway.exception.EmailTokenNotFoundException;
67
import com.chat.yourway.exception.PasswordsAreNotEqualException;
@@ -11,11 +12,11 @@ public interface ChangePasswordService {
1112
/**
1213
* Changes the password for the user's account based on the provided request and user details.
1314
*
14-
* @param request The data transfer object (DTO) containing the necessary information for password
15-
* change.
15+
* @param request The data transfer object (DTO) containing the necessary information for
16+
* password change.
1617
* @param userDetails The details of the user account for which the password change is requested.
1718
* @throws PasswordsAreNotEqualException If old password does not matched to current user
18-
* password.
19+
* password.
1920
*/
2021
void changePassword(ChangePasswordDto request, UserDetails userDetails);
2122

@@ -24,7 +25,7 @@ public interface ChangePasswordService {
2425
* process of sending an email to the provided email address, checking if account exists in the
2526
* system, generating email message for sending to user by inputted email.
2627
*
27-
* @param email The email address of the user requesting password restoration.
28+
* @param email The email address of the user requesting password restoration.
2829
* @param clientHost The client host for generating the restoration link.
2930
* @throws ContactNotFoundException If the provided email does not exist in a database.
3031
*/
@@ -36,10 +37,10 @@ public interface ChangePasswordService {
3637
* <p>This method allows a user to restore their password by providing a new password along with
3738
* the restoration token received through the password restoration process.
3839
*
39-
* @param newPassword The new password chosen by the user for restoration.
40-
* @param token The restoration token received by the user for verification from email letter.
40+
* @param restorePasswordDto The data transfer object (DTO) containing the necessary information
41+
* for restore password.
4142
* @throws EmailTokenNotFoundException If the provided token does not exist in a database.
4243
*/
43-
void restorePassword(String newPassword, String token);
44+
void restorePassword(RestorePasswordDto restorePasswordDto);
4445

4546
}

src/test/java/com/chat/yourway/integration/service/impl/ChangePasswordServiceImplTestValidation.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import com.chat.yourway.dto.common.EmailMessageDto;
1717
import com.chat.yourway.dto.common.EmailMessageInfoDto;
1818
import com.chat.yourway.dto.request.ChangePasswordDto;
19+
import com.chat.yourway.dto.request.RestorePasswordDto;
1920
import com.chat.yourway.exception.ContactNotFoundException;
2021
import com.chat.yourway.exception.EmailTokenNotFoundException;
2122
import com.chat.yourway.exception.PasswordsAreNotEqualException;
@@ -202,9 +203,10 @@ public void shouldSetNewPassword_whenUserGaveCorrectToken() {
202203
var oldPassword = contactService.findByEmail(EMAIL).getPassword();
203204
var newPassword = "newPassword";
204205
var uuidToken = "token";
206+
var restorePasswordDto = new RestorePasswordDto(newPassword, uuidToken);
205207

206208
// When
207-
changePasswordService.restorePassword(newPassword, uuidToken);
209+
changePasswordService.restorePassword(restorePasswordDto);
208210

209211
// Then
210212
assertAll(
@@ -231,10 +233,11 @@ public void shouldThrowEmailTokenNotFoundException_whenUserGaveIncorrectToken()
231233
var emailTokenRepositoryMock = mock(EmailTokenRepository.class);
232234
var newPassword = "newPassword";
233235
var uuidToken = "UUID";
236+
var restorePasswordDto = new RestorePasswordDto(newPassword, uuidToken);
234237

235238
// When
236239
assertThrows(EmailTokenNotFoundException.class,
237-
() -> changePasswordService.restorePassword(newPassword, uuidToken));
240+
() -> changePasswordService.restorePassword(restorePasswordDto));
238241

239242
// Then
240243
verify(passwordEncoderMock, never()).encode(newPassword);

src/test/java/com/chat/yourway/unit/service/impl/ChangePasswordServiceImplTestValidation.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.chat.yourway.dto.common.EmailMessageDto;
44
import com.chat.yourway.dto.common.EmailMessageInfoDto;
55
import com.chat.yourway.dto.request.ChangePasswordDto;
6+
import com.chat.yourway.dto.request.RestorePasswordDto;
67
import com.chat.yourway.exception.EmailTokenNotFoundException;
78
import com.chat.yourway.exception.PasswordsAreNotEqualException;
89
import com.chat.yourway.model.Contact;
@@ -178,6 +179,7 @@ public void restorePassword_shouldSetNewPassword_whenUserGaveCorrectToken() {
178179
// Given
179180
var newPassword = "newPassword";
180181
var uuidToken = UUID.randomUUID().toString();
182+
var restorePasswordDto = new RestorePasswordDto(newPassword, uuidToken);
181183
var contact =
182184
Contact.builder()
183185
.id(1)
@@ -198,7 +200,7 @@ public void restorePassword_shouldSetNewPassword_whenUserGaveCorrectToken() {
198200
when(emailTokenRepository.findById(uuidToken)).thenReturn(Optional.of(emailToken));
199201

200202
// When
201-
changePasswordService.restorePassword(newPassword, uuidToken);
203+
changePasswordService.restorePassword(restorePasswordDto);
202204

203205
// Then
204206
verify(emailTokenRepository).findById(uuidToken);
@@ -213,13 +215,14 @@ public void restorePassword_shouldThrowEmailTokenNotFoundException_whenUserGaveI
213215
// Given
214216
var newPassword = "newPassword";
215217
var uuidToken = UUID.randomUUID().toString();
218+
var restorePasswordDto = new RestorePasswordDto(newPassword, uuidToken);
216219

217220
when(emailTokenRepository.findById(uuidToken)).thenReturn(Optional.empty());
218221

219222
// When
220223
assertThrows(
221224
EmailTokenNotFoundException.class,
222-
() -> changePasswordService.restorePassword(newPassword, uuidToken));
225+
() -> changePasswordService.restorePassword(restorePasswordDto));
223226

224227
// Then
225228
verify(emailTokenRepository).findById(uuidToken);

0 commit comments

Comments
 (0)