From 1b27ba5e93ce130514806826f36e3cf10c3f50ea Mon Sep 17 00:00:00 2001 From: Taeuk Um <42173347+umtuk@users.noreply.github.com> Date: Tue, 18 Jul 2023 14:07:27 +0900 Subject: [PATCH] #1 - Fix: Update User Profile --- .../info/profile/impl/data/UserProfile.java | 3 +- .../profile/impl/data/UserProfileAccess.java | 3 +- .../UserProfileAccessRepository.java | 2 +- .../persistence/UserProfileRepository.java | 2 +- .../service/UserProfileAccessService.java | 4 +- .../impl/service/UserProfileService.java | 6 +- .../impl/DefaultUserProfileAccessService.java | 13 +---- .../controller/UserProfileRestController.java | 56 +++++++++++++------ .../service/UserProfileEndpointService.java | 5 +- .../DefaultUserProfileEndpointService.java | 12 +++- 10 files changed, 65 insertions(+), 41 deletions(-) diff --git a/src/main/java/org/routemaster/api/auth/domain/user/info/profile/impl/data/UserProfile.java b/src/main/java/org/routemaster/api/auth/domain/user/info/profile/impl/data/UserProfile.java index 4f89bbe..7e36522 100644 --- a/src/main/java/org/routemaster/api/auth/domain/user/info/profile/impl/data/UserProfile.java +++ b/src/main/java/org/routemaster/api/auth/domain/user/info/profile/impl/data/UserProfile.java @@ -14,12 +14,11 @@ import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; -@Document(collation = "user_profile") +@Document(collection = "user_profile") @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor(access = AccessLevel.PROTECTED) @Builder @Getter -@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) public class UserProfile { @Id diff --git a/src/main/java/org/routemaster/api/auth/domain/user/info/profile/impl/data/UserProfileAccess.java b/src/main/java/org/routemaster/api/auth/domain/user/info/profile/impl/data/UserProfileAccess.java index d6e561d..c685e32 100644 --- a/src/main/java/org/routemaster/api/auth/domain/user/info/profile/impl/data/UserProfileAccess.java +++ b/src/main/java/org/routemaster/api/auth/domain/user/info/profile/impl/data/UserProfileAccess.java @@ -13,12 +13,11 @@ import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; -@Document(collation = "user_profile_access") +@Document(collection = "user_profile_access") @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor(access = AccessLevel.PROTECTED) @Builder @Getter -@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) public class UserProfileAccess { @Id diff --git a/src/main/java/org/routemaster/api/auth/domain/user/info/profile/impl/persistence/UserProfileAccessRepository.java b/src/main/java/org/routemaster/api/auth/domain/user/info/profile/impl/persistence/UserProfileAccessRepository.java index 3dfd308..709b855 100644 --- a/src/main/java/org/routemaster/api/auth/domain/user/info/profile/impl/persistence/UserProfileAccessRepository.java +++ b/src/main/java/org/routemaster/api/auth/domain/user/info/profile/impl/persistence/UserProfileAccessRepository.java @@ -9,7 +9,7 @@ @Repository public interface UserProfileAccessRepository extends MongoRepository { - List findAllByBaseUserId(Iterable baseUserIds); + List findAllByBaseUserIdIn(List baseUserIds); Optional findByBaseUserId(String baseUserId); Boolean existsByBaseUserId(String baseUserId); } diff --git a/src/main/java/org/routemaster/api/auth/domain/user/info/profile/impl/persistence/UserProfileRepository.java b/src/main/java/org/routemaster/api/auth/domain/user/info/profile/impl/persistence/UserProfileRepository.java index 5b9b1bf..006dae1 100644 --- a/src/main/java/org/routemaster/api/auth/domain/user/info/profile/impl/persistence/UserProfileRepository.java +++ b/src/main/java/org/routemaster/api/auth/domain/user/info/profile/impl/persistence/UserProfileRepository.java @@ -9,7 +9,7 @@ @Repository public interface UserProfileRepository extends MongoRepository { - List findAllByBaseUserId(Iterable baseUserIds); + List findAllByBaseUserIdIn(List baseUserIds); Optional findByBaseUserId(String baseUserId); Boolean existsByBaseUserId(String baseUserId); void deleteByBaseUserId(String baseUserId); diff --git a/src/main/java/org/routemaster/api/auth/domain/user/info/profile/impl/service/UserProfileAccessService.java b/src/main/java/org/routemaster/api/auth/domain/user/info/profile/impl/service/UserProfileAccessService.java index 88a5409..a791a97 100644 --- a/src/main/java/org/routemaster/api/auth/domain/user/info/profile/impl/service/UserProfileAccessService.java +++ b/src/main/java/org/routemaster/api/auth/domain/user/info/profile/impl/service/UserProfileAccessService.java @@ -6,8 +6,8 @@ public interface UserProfileAccessService { - List list(Iterable ids); - List listByBaseUserId(Iterable baseUserIds); + List list(List ids); + List listByBaseUserId(List baseUserIds); UserProfileAccess details(String id); UserProfileAccess detailsByBaseUserId(String baseUserId); UserProfileAccess save(UserProfileAccess userProfileAccess); diff --git a/src/main/java/org/routemaster/api/auth/domain/user/info/profile/impl/service/UserProfileService.java b/src/main/java/org/routemaster/api/auth/domain/user/info/profile/impl/service/UserProfileService.java index a2d5f9a..134a054 100644 --- a/src/main/java/org/routemaster/api/auth/domain/user/info/profile/impl/service/UserProfileService.java +++ b/src/main/java/org/routemaster/api/auth/domain/user/info/profile/impl/service/UserProfileService.java @@ -5,11 +5,11 @@ public interface UserProfileService { - List list(Iterable ids); - List listByBaseUserId(Iterable baseUserIds); + List list(List ids); + List listByBaseUserId(List baseUserIds); UserProfile details(String id); UserProfile detailsByBaseUserId(String baseUserId); UserProfile save(UserProfile userProfile); void delete(String id); - void deleteByBaseUserId(String id); + void deleteByBaseUserId(String baseUserId); } diff --git a/src/main/java/org/routemaster/api/auth/domain/user/info/profile/impl/service/impl/DefaultUserProfileAccessService.java b/src/main/java/org/routemaster/api/auth/domain/user/info/profile/impl/service/impl/DefaultUserProfileAccessService.java index 436702e..86d8af6 100644 --- a/src/main/java/org/routemaster/api/auth/domain/user/info/profile/impl/service/impl/DefaultUserProfileAccessService.java +++ b/src/main/java/org/routemaster/api/auth/domain/user/info/profile/impl/service/impl/DefaultUserProfileAccessService.java @@ -22,13 +22,13 @@ public class DefaultUserProfileAccessService implements UserProfileAccessService private final ROEFactory roeFactory; @Override - public List list(Iterable id) { + public List list(List id) { return userProfileAccessRepository.findAllById(id); } @Override - public List listByBaseUserId(Iterable baseUserIds) { - return userProfileAccessRepository.findAllByBaseUserId(baseUserIds); + public List listByBaseUserId(List baseUserIds) { + return userProfileAccessRepository.findAllByBaseUserIdIn(baseUserIds); } @Override @@ -70,13 +70,6 @@ public void delete(String id) { @Override public void deleteByBaseUserId(String baseUserId) { - if (!userProfileAccessRepository.existsByBaseUserId(baseUserId)) { - throw roeFactory.get( - InfoErrorCode.ROE_111, - UserProfileErrorDescription.USER_PROFILE_ACCESS_NOT_FOUND, - HttpStatus.NOT_FOUND - ); - } userProfileAccessRepository.deleteById(baseUserId); } } diff --git a/src/main/java/org/routemaster/api/auth/endpoint/user/info/profile/impl/controller/UserProfileRestController.java b/src/main/java/org/routemaster/api/auth/endpoint/user/info/profile/impl/controller/UserProfileRestController.java index 072e337..8fad4b3 100644 --- a/src/main/java/org/routemaster/api/auth/endpoint/user/info/profile/impl/controller/UserProfileRestController.java +++ b/src/main/java/org/routemaster/api/auth/endpoint/user/info/profile/impl/controller/UserProfileRestController.java @@ -1,14 +1,21 @@ package org.routemaster.api.auth.endpoint.user.info.profile.impl.controller; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; import java.util.List; +import java.util.TimeZone; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.routemaster.api.auth.domain.user.jwt.impl.data.UserJwtPayload; import org.routemaster.api.auth.domain.user.jwt.impl.utils.filter.UserJwtAuthenticationFilter; import org.routemaster.api.auth.endpoint.user.info.profile.impl.service.UserProfileEndpointService; import org.routemaster.api.auth.endpoint.user.info.profile.impl.vo.request.UserProfileSaveRequest; +import org.routemaster.api.auth.endpoint.user.info.profile.impl.vo.request.UserProfileTotalSaveRequest; +import org.routemaster.api.auth.endpoint.user.info.profile.impl.vo.response.UserNicknameListResponse; +import org.routemaster.api.auth.endpoint.user.info.profile.impl.vo.response.UserNicknameResponse; +import org.routemaster.api.auth.endpoint.user.info.profile.impl.vo.response.UserProfileDeleteResponse; import org.routemaster.api.auth.endpoint.user.info.profile.impl.vo.response.UserProfileDetailsResponse; import org.routemaster.api.auth.endpoint.user.info.profile.impl.vo.response.UserProfileListResponse; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.DeleteMapping; @@ -17,6 +24,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestAttribute; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -30,50 +38,66 @@ public class UserProfileRestController { private final UserProfileEndpointService userProfileEndpointService; @GetMapping("/me") + @SecurityRequirement(name = "Bearer Authentication") @PreAuthorize("hasRole('ROLE_USER')") public ResponseEntity details( @RequestAttribute(UserJwtAuthenticationFilter.USER_PAYLOAD) UserJwtPayload payload) { - return null; + UserProfileDetailsResponse response = userProfileEndpointService.details(payload); + return new ResponseEntity<>(response, HttpStatus.OK); } @GetMapping("/{baseUserId}") + @SecurityRequirement(name = "Bearer Authentication") @PreAuthorize("hasRole('ROLE_USER')") - public ResponseEntity details(@PathVariable Long baseUserId, + public ResponseEntity details(@PathVariable String baseUserId, @RequestAttribute(UserJwtAuthenticationFilter.USER_PAYLOAD) UserJwtPayload payload) { - return null; + UserProfileDetailsResponse response = userProfileEndpointService.details(baseUserId, payload); + return new ResponseEntity<>(response, HttpStatus.OK); } @GetMapping("/list") + @SecurityRequirement(name = "Bearer Authentication") @PreAuthorize("hasRole('ROLE_USER')") - public ResponseEntity list(@RequestParam List baseUserIds, + public ResponseEntity list(@RequestParam List baseUserIds, @RequestAttribute(UserJwtAuthenticationFilter.USER_PAYLOAD) UserJwtPayload payload) { - return null; + UserProfileListResponse response = userProfileEndpointService.list(baseUserIds, payload); + return new ResponseEntity<>(response, HttpStatus.OK); } @GetMapping("/nickname/list") + @SecurityRequirement(name = "Bearer Authentication") @PreAuthorize("hasRole('ROLE_USER')") - public ResponseEntity nicknames(@RequestParam List baseUserIds, + public ResponseEntity nicknames(@RequestParam List baseUserIds, @RequestAttribute(UserJwtAuthenticationFilter.USER_PAYLOAD) UserJwtPayload payload) { - return null; + UserNicknameListResponse response = userProfileEndpointService.nicknames(baseUserIds, payload); + return new ResponseEntity<>(response, HttpStatus.OK); } @GetMapping("/nickname/{baseUserId}") + @SecurityRequirement(name = "Bearer Authentication") @PreAuthorize("hasRole('ROLE_USER')") - public ResponseEntity nickname(@PathVariable Long baseUserId, + public ResponseEntity nickname(@PathVariable String baseUserId, @RequestAttribute(UserJwtAuthenticationFilter.USER_PAYLOAD) UserJwtPayload payload) { - return null; + UserNicknameResponse response = userProfileEndpointService.nickname(baseUserId, payload); + return new ResponseEntity<>(response, HttpStatus.OK); } @PostMapping + @SecurityRequirement(name = "Bearer Authentication") @PreAuthorize("hasRole('ROLE_USER')") public ResponseEntity save( @RequestAttribute(UserJwtAuthenticationFilter.USER_PAYLOAD) UserJwtPayload payload, - @RequestBody UserProfileSaveRequest request) { - return null; + @RequestBody UserProfileTotalSaveRequest request) { + UserProfileDetailsResponse response = userProfileEndpointService.save(payload, request); + return new ResponseEntity<>(response, HttpStatus.OK); } - @DeleteMapping() - @PreAuthorize("hasRole('ROLE_USER')") - public ResponseEntity delete() { - return null; - } +// @DeleteMapping +// @SecurityRequirement(name = "Bearer Authentication") +// @PreAuthorize("hasRole('ROLE_USER')") +// public ResponseEntity delete( +// @RequestAttribute(UserJwtAuthenticationFilter.USER_PAYLOAD) UserJwtPayload payload +// ) { +// UserProfileDeleteResponse response = userProfileEndpointService.delete(payload); +// return new ResponseEntity<>(null, HttpStatus.OK); +// } } diff --git a/src/main/java/org/routemaster/api/auth/endpoint/user/info/profile/impl/service/UserProfileEndpointService.java b/src/main/java/org/routemaster/api/auth/endpoint/user/info/profile/impl/service/UserProfileEndpointService.java index 70da572..9505cb8 100644 --- a/src/main/java/org/routemaster/api/auth/endpoint/user/info/profile/impl/service/UserProfileEndpointService.java +++ b/src/main/java/org/routemaster/api/auth/endpoint/user/info/profile/impl/service/UserProfileEndpointService.java @@ -1,5 +1,6 @@ package org.routemaster.api.auth.endpoint.user.info.profile.impl.service; +import java.util.List; import org.routemaster.api.auth.domain.user.jwt.impl.data.UserJwtPayload; import org.routemaster.api.auth.endpoint.user.info.profile.impl.vo.request.UserProfileTotalSaveRequest; import org.routemaster.api.auth.endpoint.user.info.profile.impl.vo.response.UserNicknameListResponse; @@ -12,8 +13,8 @@ public interface UserProfileEndpointService { UserProfileDetailsResponse details(UserJwtPayload payload); UserProfileDetailsResponse details(String baseUserId, UserJwtPayload payload); - UserProfileListResponse list(Iterable baseUserIds, UserJwtPayload payload); - UserNicknameListResponse nicknames(Iterable baseUserIds, UserJwtPayload payload); + UserProfileListResponse list(List baseUserIds, UserJwtPayload payload); + UserNicknameListResponse nicknames(List baseUserIds, UserJwtPayload payload); UserNicknameResponse nickname(String baseUserId, UserJwtPayload payload); UserProfileDetailsResponse save(UserJwtPayload payload, UserProfileTotalSaveRequest request); UserProfileDeleteResponse delete(UserJwtPayload payload); diff --git a/src/main/java/org/routemaster/api/auth/endpoint/user/info/profile/impl/service/impl/DefaultUserProfileEndpointService.java b/src/main/java/org/routemaster/api/auth/endpoint/user/info/profile/impl/service/impl/DefaultUserProfileEndpointService.java index 26107fe..fb8ea59 100644 --- a/src/main/java/org/routemaster/api/auth/endpoint/user/info/profile/impl/service/impl/DefaultUserProfileEndpointService.java +++ b/src/main/java/org/routemaster/api/auth/endpoint/user/info/profile/impl/service/impl/DefaultUserProfileEndpointService.java @@ -12,6 +12,7 @@ import org.routemaster.api.auth.domain.user.info.profile.impl.service.UserProfileAccessService; import org.routemaster.api.auth.domain.user.info.profile.impl.service.UserProfileService; import org.routemaster.api.auth.domain.user.jwt.impl.data.UserJwtPayload; +import org.routemaster.api.auth.domain.user.jwt.impl.data.UserJwtUnit; import org.routemaster.api.auth.endpoint.user.info.profile.impl.service.UserProfileEndpointService; import org.routemaster.api.auth.endpoint.user.info.profile.impl.util.mapper.UserProfileAccessMapper; import org.routemaster.api.auth.endpoint.user.info.profile.impl.util.mapper.UserProfileMapper; @@ -22,6 +23,7 @@ import org.routemaster.api.auth.endpoint.user.info.profile.impl.vo.response.UserProfileDetailsResponse; import org.routemaster.api.auth.endpoint.user.info.profile.impl.vo.response.UserProfileListResponse; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Slf4j @Service @@ -55,7 +57,7 @@ public UserProfileDetailsResponse details(String baseUserId, UserJwtPayload payl } @Override - public UserProfileListResponse list(Iterable baseUserIds, UserJwtPayload payload) { + public UserProfileListResponse list(List baseUserIds, UserJwtPayload payload) { List userProfiles = securedUserProfileService.listByBaseUserId(baseUserIds); return UserProfileListResponse.builder() .profiles(userProfiles) @@ -63,7 +65,7 @@ public UserProfileListResponse list(Iterable baseUserIds, UserJwtPayload } @Override - public UserNicknameListResponse nicknames(Iterable baseUserIds, UserJwtPayload payload) { + public UserNicknameListResponse nicknames(List baseUserIds, UserJwtPayload payload) { List userProfiles = securedUserProfileService.listByBaseUserId(baseUserIds); List nicknames = new ArrayList<>(); for (UserProfile userProfile : userProfiles) { @@ -89,6 +91,7 @@ public UserNicknameResponse nickname(String baseUserId, UserJwtPayload payload) } @Override + @Transactional public UserProfileDetailsResponse save(UserJwtPayload payload, UserProfileTotalSaveRequest request) { String baseUserId = payload.getBaseUserId(); @@ -123,10 +126,15 @@ public UserProfileDetailsResponse save(UserJwtPayload payload, } @Override + @Transactional public UserProfileDeleteResponse delete(UserJwtPayload payload) { userProfileService.deleteByBaseUserId(payload.getBaseUserId()); userProfileAccessService.deleteByBaseUserId(payload.getBaseUserId()); return UserProfileDeleteResponse.builder() .build(); } + + private void validate(UserJwtPayload payload) { + + } }