Skip to content

Commit

Permalink
Merge pull request #54 from GlobeDaBoarder/dev
Browse files Browse the repository at this point in the history
Dev -> master: name and surname update
  • Loading branch information
GlobeDaBoarder authored Nov 23, 2023
2 parents aeca5ba + ec1d329 commit e897f9d
Show file tree
Hide file tree
Showing 18 changed files with 167 additions and 14 deletions.
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1e2aa971ec97b1bd78a451195d7fa53e0fe3ca4cbd2ac1c9cec78da943702e00
41ced36deafe737a87868e6f537bb404c4732836183115d245fac14a8efd14fe
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@
<importMapping>UpdatePasswordDto=ua.rivnegray.boardgames_shop.DTO.request.update.UpdatePasswordDto</importMapping>
<importMapping>UpdatePhoneDto=ua.rivnegray.boardgames_shop.DTO.request.update.UpdatePhoneDto</importMapping>
<importMapping>UpdateRolesDto=ua.rivnegray.boardgames_shop.DTO.request.update.UpdateRolesDto</importMapping>
<importMapping>UpdateUsernameDto=ua.rivnegray.boardgames_shop.DTO.request.update.UpdateUsernameDto</importMapping>
<importMapping>UpdateNameAndSurnameDto=ua.rivnegray.boardgames_shop.DTO.request.update.UpdateNameAndSurnameDto</importMapping>
<importMapping>AddressDto=ua.rivnegray.boardgames_shop.DTO.response.AddressDto</importMapping>
<importMapping>UserPublicDto=ua.rivnegray.boardgames_shop.DTO.response.UserPublicDto</importMapping>
<importMapping>UserRoleDto=ua.rivnegray.boardgames_shop.DTO.response.UserRoleDto</importMapping>
Expand Down
35 changes: 35 additions & 0 deletions src/main/java/generated/user/api/UsersApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import ua.rivnegray.boardgames_shop.DTO.request.AddAndUpdateAddressDto;
import ua.rivnegray.boardgames_shop.DTO.request.create.CreateAnyUserDto;
import ua.rivnegray.boardgames_shop.DTO.request.update.UpdateEmailDto;
import ua.rivnegray.boardgames_shop.DTO.request.update.UpdateNameAndSurnameDto;
import ua.rivnegray.boardgames_shop.DTO.request.update.UpdatePasswordDto;
import ua.rivnegray.boardgames_shop.DTO.request.update.UpdatePhoneDto;
import ua.rivnegray.boardgames_shop.DTO.response.AddressDto;
Expand Down Expand Up @@ -417,6 +418,7 @@ default ResponseEntity<Void> removeAddress(

/**
* PATCH /users/me/address/{addressId} : Update my address
* Fields of the request body that are not specified will be ignored. So you can update only the fields you need.
*
* @param addressId (required)
* @param addAndUpdateAddressDto (required)
Expand All @@ -425,6 +427,7 @@ default ResponseEntity<Void> removeAddress(
@Operation(
operationId = "updateMyAddress",
summary = "Update my address",
description = "Fields of the request body that are not specified will be ignored. So you can update only the fields you need.",
responses = {
@ApiResponse(responseCode = "200", description = "address updated", content = {
@Content(mediaType = "application/json", schema = @Schema(implementation = UserPublicDto.class))
Expand Down Expand Up @@ -481,6 +484,38 @@ default ResponseEntity<UserPublicDto> updateMyEmail(
}


/**
* PATCH /users/me/nameAndSurname : Update my name and surname
*
* @param updateNameAndSurnameDto (required)
* @return name and surname updated (status code 200)
*/
@Operation(
operationId = "updateMyNameAndSurname",
summary = "Update my name and surname",
responses = {
@ApiResponse(responseCode = "200", description = "name and surname updated", content = {
@Content(mediaType = "application/json", schema = @Schema(implementation = UserPublicDto.class))
})
},
security = {
@SecurityRequirement(name = "bearerAuth")
}
)
@PreAuthorize("hasAuthority('SCOPE_user:updateMe')")
@RequestMapping(
method = RequestMethod.PATCH,
value = "/users/me/nameAndSurname",
produces = { "application/json" },
consumes = { "application/json" }
)
default ResponseEntity<UserPublicDto> updateMyNameAndSurname(
@Parameter(name = "UpdateNameAndSurnameDto", description = "", required = true) @Valid @RequestBody UpdateNameAndSurnameDto updateNameAndSurnameDto
) {
return getDelegate().updateMyNameAndSurname(updateNameAndSurnameDto);
}


/**
* PATCH /users/me/password : Update my user&#39;s password
*
Expand Down
23 changes: 23 additions & 0 deletions src/main/java/generated/user/api/UsersApiDelegate.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import ua.rivnegray.boardgames_shop.DTO.request.AddAndUpdateAddressDto;
import ua.rivnegray.boardgames_shop.DTO.request.create.CreateAnyUserDto;
import ua.rivnegray.boardgames_shop.DTO.request.update.UpdateEmailDto;
import ua.rivnegray.boardgames_shop.DTO.request.update.UpdateNameAndSurnameDto;
import ua.rivnegray.boardgames_shop.DTO.request.update.UpdatePasswordDto;
import ua.rivnegray.boardgames_shop.DTO.request.update.UpdatePhoneDto;
import ua.rivnegray.boardgames_shop.DTO.response.AddressDto;
Expand Down Expand Up @@ -256,6 +257,7 @@ default ResponseEntity<Void> removeAddress(Long addressId) {

/**
* PATCH /users/me/address/{addressId} : Update my address
* Fields of the request body that are not specified will be ignored. So you can update only the fields you need.
*
* @param addressId (required)
* @param addAndUpdateAddressDto (required)
Expand Down Expand Up @@ -298,6 +300,27 @@ default ResponseEntity<UserPublicDto> updateMyEmail(UpdateEmailDto updateEmailDt

}

/**
* PATCH /users/me/nameAndSurname : Update my name and surname
*
* @param updateNameAndSurnameDto (required)
* @return name and surname updated (status code 200)
* @see UsersApi#updateMyNameAndSurname
*/
default ResponseEntity<UserPublicDto> updateMyNameAndSurname(UpdateNameAndSurnameDto updateNameAndSurnameDto) {
getRequest().ifPresent(request -> {
for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) {
if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) {
String exampleString = "{ \"firstName\" : \"firstName\", \"lastName\" : \"lastName\", \"addresses\" : [ { \"country\" : \"country\", \"city\" : \"city\", \"street\" : \"street\", \"postalCode\" : \"postalCode\", \"houseNumber\" : \"houseNumber\", \"id\" : 6 }, { \"country\" : \"country\", \"city\" : \"city\", \"street\" : \"street\", \"postalCode\" : \"postalCode\", \"houseNumber\" : \"houseNumber\", \"id\" : 6 } ], \"phone\" : \"phone\", \"roles\" : [ { \"permissions\" : [ null, null ], \"roleName\" : \"roleName\", \"id\" : 0 }, { \"permissions\" : [ null, null ], \"roleName\" : \"roleName\", \"id\" : 0 } ], \"email\" : \"email\", \"username\" : \"username\" }";
ApiUtil.setExampleResponse(request, "application/json", exampleString);
break;
}
}
});
return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);

}

/**
* PATCH /users/me/password : Update my user&#39;s password
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

public record LoginRequestDto(
@NotBlank(message = "email is required")
@Email(regexp = ValidationConstants.emailRegex)
@Email(regexp = ValidationConstants.EMAIL)
@Schema(example = "[email protected]")
String email,

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
* DTO for {@link ua.rivnegray.boardgames_shop.model.User
*/
public record RegisterCustomerRequestDto(
@Email(regexp = ValidationConstants.emailRegex)
@Email(regexp = ValidationConstants.EMAIL)
@NotBlank
String email,
@NotBlank
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* DTO for {@link ua.rivnegray.boardgames_shop.model.User }
*/
public record CreateAnyUserDto(
@Email(regexp = ValidationConstants.emailRegex)
@Email(regexp = ValidationConstants.EMAIL)
@NotNull
String email,
@Password
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@
/**
* DTO for {@link ua.rivnegray.boardgames_shop.model.User}
*/
public record UpdateEmailDto(@Email(regexp = ValidationConstants.emailRegex) String email) implements Serializable {
public record UpdateEmailDto(@Email(regexp = ValidationConstants.EMAIL) String email) implements Serializable {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package ua.rivnegray.boardgames_shop.DTO.request.update;

import ua.rivnegray.boardgames_shop.utils.validation.annotation.NameAndSurname;

public record UpdateNameAndSurnameDto(
@NameAndSurname
String nameAndSurname) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import ua.rivnegray.boardgames_shop.DTO.request.AddAndUpdateAddressDto;
import ua.rivnegray.boardgames_shop.DTO.request.create.CreateAnyUserDto;
import ua.rivnegray.boardgames_shop.DTO.request.update.UpdateEmailDto;
import ua.rivnegray.boardgames_shop.DTO.request.update.UpdateNameAndSurnameDto;
import ua.rivnegray.boardgames_shop.DTO.request.update.UpdatePasswordDto;
import ua.rivnegray.boardgames_shop.DTO.request.update.UpdatePhoneDto;
import ua.rivnegray.boardgames_shop.DTO.response.AddressDto;
Expand Down Expand Up @@ -132,4 +133,9 @@ public ResponseEntity<List<UserPublicDto>> getUsersByRole(String role) {
public ResponseEntity<List<UserRoleDto>> getAllUserRoles() {
return ResponseEntity.ok(this.userService.getAllUserRoles());
}

@Override
public ResponseEntity<UserPublicDto> updateMyNameAndSurname(UpdateNameAndSurnameDto updateNameAndSurnameDto) {
return ResponseEntity.ok(this.userService.updateMyNameAndSurname(updateNameAndSurnameDto));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import ua.rivnegray.boardgames_shop.DTO.request.AddAndUpdateAddressDto;
import ua.rivnegray.boardgames_shop.DTO.request.create.CreateAnyUserDto;
import ua.rivnegray.boardgames_shop.DTO.request.update.UpdateEmailDto;
import ua.rivnegray.boardgames_shop.DTO.request.update.UpdateNameAndSurnameDto;
import ua.rivnegray.boardgames_shop.DTO.request.update.UpdatePasswordDto;
import ua.rivnegray.boardgames_shop.DTO.request.update.UpdatePhoneDto;
import ua.rivnegray.boardgames_shop.DTO.response.AddressDto;
Expand Down Expand Up @@ -62,4 +63,6 @@ public interface UserService {

@Transactional(readOnly = true)
UserPublicDto getMyUserInfo();

UserPublicDto updateMyNameAndSurname(UpdateNameAndSurnameDto updateNameAndSurnameDto);
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import ua.rivnegray.boardgames_shop.DTO.request.AddAndUpdateAddressDto;
import ua.rivnegray.boardgames_shop.DTO.request.create.CreateAnyUserDto;
import ua.rivnegray.boardgames_shop.DTO.request.update.UpdateEmailDto;
import ua.rivnegray.boardgames_shop.DTO.request.update.UpdateNameAndSurnameDto;
import ua.rivnegray.boardgames_shop.DTO.request.update.UpdatePasswordDto;
import ua.rivnegray.boardgames_shop.DTO.request.update.UpdatePhoneDto;
import ua.rivnegray.boardgames_shop.DTO.response.AddressDto;
Expand Down Expand Up @@ -193,5 +194,13 @@ public List<AddressDto> getAllMyAddresses() {

}

@Override
public UserPublicDto updateMyNameAndSurname(UpdateNameAndSurnameDto updateNameAndSurnameDto) {
User userToUpdate = this.getCurrentUser();

userToUpdate.setFirstName(updateNameAndSurnameDto.nameAndSurname().trim().split(" ")[0]);
userToUpdate.setLastName(updateNameAndSurnameDto.nameAndSurname().trim().split(" ")[1]);

return this.userMapper.toUserPublicDto(this.userRepository.save(userToUpdate));
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package ua.rivnegray.boardgames_shop.utils.validation;

public final class ValidationConstants {
public static final String emailRegex = "(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])";
public static final String phoneRegex = "^(\\+\\d{1,3}( )?)?((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$"
public static final String EMAIL = "(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])";
public static final String PHONE = "^(\\+\\d{1,3}( )?)?((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$"
+ "|^(\\+\\d{1,3}( )?)?(\\d{3}[ ]?){2}\\d{3}$"
+ "|^(\\+\\d{1,3}( )?)?(\\d{3}[ ]?)(\\d{2}[ ]?){2}\\d{2}$";
public static final String passwordRegex = "^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$";
public static final String PASSWORD = "^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$";

public static final String NAME_AND_SURNAME = "^[A-Za-zА-Яа-я]+\\s[A-Za-zА-Яа-я]+$";

private ValidationConstants() {
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package ua.rivnegray.boardgames_shop.utils.validation.annotation;

import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import ua.rivnegray.boardgames_shop.utils.validation.validator.NameAndSurnameValidator;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Constraint(validatedBy = NameAndSurnameValidator.class)
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NameAndSurname {
String message() default "Invalid name and surname format!";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package ua.rivnegray.boardgames_shop.utils.validation.validator;

import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import ua.rivnegray.boardgames_shop.utils.validation.ValidationConstants;
import ua.rivnegray.boardgames_shop.utils.validation.annotation.NameAndSurname;

import java.util.regex.Pattern;

public class NameAndSurnameValidator implements ConstraintValidator<NameAndSurname, String> {
private Pattern pattern;
@Override
public void initialize(NameAndSurname constraintAnnotation) {
pattern = Pattern.compile(ValidationConstants.NAME_AND_SURNAME);
}
@Override
public boolean isValid(String nameAndSurname, ConstraintValidatorContext constraintValidatorContext) {
if (nameAndSurname == null)
return false;
return pattern.matcher(nameAndSurname).matches();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public class PasswordValidator implements ConstraintValidator<Password, String>
private Pattern pattern;
@Override
public void initialize(Password constraintAnnotation) {
pattern = Pattern.compile(ValidationConstants.passwordRegex);
pattern = Pattern.compile(ValidationConstants.PASSWORD);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public class PhoneValidator implements ConstraintValidator<PhoneNumber, String>
private Pattern pattern;
@Override
public void initialize(PhoneNumber constraintAnnotation) {
pattern = Pattern.compile(ValidationConstants.phoneRegex);
pattern = Pattern.compile(ValidationConstants.PHONE);
}

@Override
Expand Down
30 changes: 27 additions & 3 deletions src/main/resources/user.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,24 @@ paths:
application/json:
schema:
$ref: '#/components/schemas/UserPublicDto'
/users/me/nameAndSurname:
patch:
summary: Update my name and surname
operationId: updateMyNameAndSurname
x-access-permission: user:updateMe
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateNameAndSurnameDto'
responses:
'200':
description: name and surname updated
content:
application/json:
schema:
$ref: '#/components/schemas/UserPublicDto'
/users/me/address:
post:
summary: Add an address to me
Expand Down Expand Up @@ -242,6 +260,7 @@ paths:
$ref: '#/components/schemas/AddressDto'
patch:
summary: Update my address
description: Fields of the request body that are not specified will be ignored. So you can update only the fields you need.
operationId: updateMyAddress
x-access-permission: user:updateMe
parameters:
Expand Down Expand Up @@ -322,11 +341,11 @@ components:
properties:
phone:
type: string
UpdateUsernameDto:
UpdateNicknameDto:
type: object
x-java-type: ua.rivnegray.boardgames_shop.DTO.request.update.UpdateUsernameDto
x-java-type: ua.rivnegray.boardgames_shop.DTO.request.update.UpdateNickNameDto
properties:
username:
NickName:
type: string
AddAndUpdateAddressDto:
type: object
Expand Down Expand Up @@ -403,6 +422,11 @@ components:
- admin:read
- admin:write

UpdateNameAndSurnameDto:
properties:
emptyValue:
type: boolean

securitySchemes:
bearerAuth:
type: http
Expand Down

0 comments on commit e897f9d

Please sign in to comment.