diff --git a/src/main/java/com/gloddy/server/auth/application/AuthService.java b/src/main/java/com/gloddy/server/auth/application/AuthService.java index ef6d2a8d..68793637 100644 --- a/src/main/java/com/gloddy/server/auth/application/AuthService.java +++ b/src/main/java/com/gloddy/server/auth/application/AuthService.java @@ -67,7 +67,7 @@ public AuthResponse.Token reissueToken(String accessToken, String refreshToken) @Transactional public void signOut(Long userId) { - User user = userQueryHandler.findByIdAndStatus(userId, Status.ACTIVE); + User user = userQueryHandler.findByIdFetch(userId); userSignOutPolicy.validate(user); user.withDraw(); } diff --git a/src/main/java/com/gloddy/server/group_member/application/GroupMemberService.java b/src/main/java/com/gloddy/server/group_member/application/GroupMemberService.java index e6118330..51a6c03c 100644 --- a/src/main/java/com/gloddy/server/group_member/application/GroupMemberService.java +++ b/src/main/java/com/gloddy/server/group_member/application/GroupMemberService.java @@ -35,7 +35,7 @@ public class GroupMemberService { private final GroupMemberJpaRepository userGroupJpaRepository; public GroupResponse.GetGroups getExpectedMyGroup(Long userId) { - User findUser = userQueryHandler.findByIdAndStatus(userId, Status.ACTIVE); + User findUser = userQueryHandler.findByIdFetch(userId); List expectedMyGroups = userGroupJpaRepository.findExpectedGroupsByUser(findUser); return expectedMyGroups.stream() .map(GroupResponse.GetGroup::from) @@ -43,7 +43,7 @@ public GroupResponse.GetGroups getExpectedMyGroup(Long userId) { } public PageResponse getParticipatedMyGroup(Long userId, int page, int size) { - User findUser = userQueryHandler.findByIdAndStatus(userId, Status.ACTIVE); + User findUser = userQueryHandler.findByIdFetch(userId); return PageResponse.from( userGroupJpaRepository.findParticipatedGroupsByUser(findUser, PageRequest.of(page, size)) .map(GroupResponse.GetParticipatedGroup::from) diff --git a/src/main/java/com/gloddy/server/user/api/intenal/UserInternalQueryController.java b/src/main/java/com/gloddy/server/user/api/intenal/UserInternalQueryController.java new file mode 100644 index 00000000..7101ca06 --- /dev/null +++ b/src/main/java/com/gloddy/server/user/api/intenal/UserInternalQueryController.java @@ -0,0 +1,26 @@ +package com.gloddy.server.user.api.intenal; + + +import com.gloddy.server.core.response.ApiResponse; +import com.gloddy.server.user.application.internal.UserInternalQueryService; +import com.gloddy.server.user.application.internal.dto.UserPreviewResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/internal/payload") +@RequiredArgsConstructor +public class UserInternalQueryController { + + private final UserInternalQueryService userInternalQueryService; + + @GetMapping("/users/{userId}") + public ResponseEntity getUserPreview(@PathVariable("userId") Long userId) { + UserPreviewResponse response = userInternalQueryService.getUserPreview(userId); + return ApiResponse.ok(response); + } +} diff --git a/src/main/java/com/gloddy/server/user/application/UserUpdateService.java b/src/main/java/com/gloddy/server/user/application/UserUpdateService.java index 1b94f6c1..e041adf4 100644 --- a/src/main/java/com/gloddy/server/user/application/UserUpdateService.java +++ b/src/main/java/com/gloddy/server/user/application/UserUpdateService.java @@ -17,7 +17,7 @@ public class UserUpdateService { @Transactional public UserUpdateResponse update(Long userId, Info request) { - User user = userQueryHandler.findByIdAndStatus(userId, Status.ACTIVE); + User user = userQueryHandler.findByIdFetch(userId); user.updateProfile( request.getImageUrl(), request.getName(), diff --git a/src/main/java/com/gloddy/server/user/application/facade/UserGetFacade.java b/src/main/java/com/gloddy/server/user/application/facade/UserGetFacade.java index a28eaa7b..9d711945 100644 --- a/src/main/java/com/gloddy/server/user/application/facade/UserGetFacade.java +++ b/src/main/java/com/gloddy/server/user/application/facade/UserGetFacade.java @@ -21,7 +21,7 @@ public class UserGetFacade { @Transactional(readOnly = true) public UserResponse.FacadeGet getUserFacade(Long userId) { - User user = userQueryHandler.findByIdAndStatus(userId, Status.ACTIVE); + User user = userQueryHandler.findByIdFetch(userId); Long countParticipatedGroup = groupMemberQueryHandler.countParticipatedGroup(userId); Long reviewCount = mateQueryHandler.countByUserId(userId); diff --git a/src/main/java/com/gloddy/server/user/application/internal/UserInternalQueryService.java b/src/main/java/com/gloddy/server/user/application/internal/UserInternalQueryService.java new file mode 100644 index 00000000..076a89ed --- /dev/null +++ b/src/main/java/com/gloddy/server/user/application/internal/UserInternalQueryService.java @@ -0,0 +1,19 @@ +package com.gloddy.server.user.application.internal; + +import com.gloddy.server.user.application.internal.dto.UserPreviewResponse; +import com.gloddy.server.user.domain.handler.UserQueryHandler; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class UserInternalQueryService { + + private final UserQueryHandler userQueryHandler; + + public UserPreviewResponse getUserPreview(Long userId) { + return userQueryHandler.findUserPreviewById(userId); + } +} diff --git a/src/main/java/com/gloddy/server/user/application/internal/dto/UserPreviewResponse.java b/src/main/java/com/gloddy/server/user/application/internal/dto/UserPreviewResponse.java new file mode 100644 index 00000000..6ffa40ee --- /dev/null +++ b/src/main/java/com/gloddy/server/user/application/internal/dto/UserPreviewResponse.java @@ -0,0 +1,11 @@ +package com.gloddy.server.user.application.internal.dto; + +import com.gloddy.server.user.domain.vo.ReliabilityLevel; +import com.querydsl.core.annotations.QueryProjection; + +public record UserPreviewResponse(Long id, Boolean isCertifiedStudent, String profileImage, String nickName, + String countryName, String countryImage, ReliabilityLevel reliabilityLevel) { + @QueryProjection + public UserPreviewResponse { + } +} diff --git a/src/main/java/com/gloddy/server/user/domain/User.java b/src/main/java/com/gloddy/server/user/domain/User.java index 0f1de80f..cee24580 100644 --- a/src/main/java/com/gloddy/server/user/domain/User.java +++ b/src/main/java/com/gloddy/server/user/domain/User.java @@ -15,6 +15,7 @@ import com.gloddy.server.group.domain.service.GroupFactory; import jakarta.persistence.*; import lombok.*; +import org.hibernate.annotations.Where; import java.time.LocalDate; import java.util.List; @@ -26,6 +27,7 @@ @EqualsAndHashCode(of = {"id"}, callSuper = false) @Getter @Table(name = "users") +@Where(clause = "status = 'ACTIVE'") public class User extends BaseTimeEntity { @Id diff --git a/src/main/java/com/gloddy/server/user/domain/handler/UserQueryHandler.java b/src/main/java/com/gloddy/server/user/domain/handler/UserQueryHandler.java index b51b9a1a..0301061e 100644 --- a/src/main/java/com/gloddy/server/user/domain/handler/UserQueryHandler.java +++ b/src/main/java/com/gloddy/server/user/domain/handler/UserQueryHandler.java @@ -1,8 +1,8 @@ package com.gloddy.server.user.domain.handler; +import com.gloddy.server.user.application.internal.dto.UserPreviewResponse; import com.gloddy.server.user.domain.User; import com.gloddy.server.user.domain.vo.Phone; -import com.gloddy.server.user.domain.vo.kind.Status; import com.gloddy.server.user.domain.dto.PraiseResponse; import java.util.Optional; @@ -10,7 +10,7 @@ public interface UserQueryHandler { User findById(Long id); - User findByIdAndStatus(Long id, Status status); + User findByIdFetch(Long id); Optional findByEmail(String email); boolean existsByNickname(String nickname); @@ -18,4 +18,6 @@ public interface UserQueryHandler { Optional findByPhone(Phone phone); PraiseResponse.GetPraiseForUser findPraiseDtoByUserId(Long userId); + + UserPreviewResponse findUserPreviewById(Long userId); } diff --git a/src/main/java/com/gloddy/server/user/domain/handler/impl/UserQueryHandlerImpl.java b/src/main/java/com/gloddy/server/user/domain/handler/impl/UserQueryHandlerImpl.java index de93afe8..572a23f4 100644 --- a/src/main/java/com/gloddy/server/user/domain/handler/impl/UserQueryHandlerImpl.java +++ b/src/main/java/com/gloddy/server/user/domain/handler/impl/UserQueryHandlerImpl.java @@ -1,8 +1,8 @@ package com.gloddy.server.user.domain.handler.impl; +import com.gloddy.server.user.application.internal.dto.UserPreviewResponse; import com.gloddy.server.user.domain.User; import com.gloddy.server.user.domain.vo.Phone; -import com.gloddy.server.user.domain.vo.kind.Status; import com.gloddy.server.user.domain.dto.PraiseResponse; import com.gloddy.server.user.domain.handler.UserQueryHandler; import com.gloddy.server.user.infra.repository.UserJpaRepository; @@ -26,8 +26,8 @@ public User findById(Long id) { } @Override - public User findByIdAndStatus(Long id, Status status) { - return userJpaRepository.findByIdAndStatusFetch(id, status) + public User findByIdFetch(Long id) { + return userJpaRepository.findByIdFetch(id) .orElseThrow(() -> new UserBusinessException(ErrorCode.USER_NOT_FOUND)); } @@ -50,4 +50,10 @@ public Optional findByPhone(Phone phone) { public PraiseResponse.GetPraiseForUser findPraiseDtoByUserId(Long userId) { return userJpaRepository.findPraiseByUserId(userId); } + + @Override + public UserPreviewResponse findUserPreviewById(Long userId) { + return userJpaRepository.findUserPreviewById(userId) + .orElseThrow(() -> new UserBusinessException(ErrorCode.USER_NOT_FOUND)); + } } diff --git a/src/main/java/com/gloddy/server/user/infra/repository/custom/UserJpaRepositoryCustom.java b/src/main/java/com/gloddy/server/user/infra/repository/custom/UserJpaRepositoryCustom.java index e403d9ab..5509c8ef 100644 --- a/src/main/java/com/gloddy/server/user/infra/repository/custom/UserJpaRepositoryCustom.java +++ b/src/main/java/com/gloddy/server/user/infra/repository/custom/UserJpaRepositoryCustom.java @@ -1,5 +1,6 @@ package com.gloddy.server.user.infra.repository.custom; +import com.gloddy.server.user.application.internal.dto.UserPreviewResponse; import com.gloddy.server.user.domain.User; import com.gloddy.server.user.domain.vo.Phone; import com.gloddy.server.user.domain.vo.kind.Status; @@ -13,7 +14,9 @@ public interface UserJpaRepositoryCustom { Optional findByEmail(String email); - Optional findByIdAndStatusFetch(Long id, Status status); + Optional findByIdFetch(Long id); PraiseResponse.GetPraiseForUser findPraiseByUserId(Long userId); + + Optional findUserPreviewById(Long id); } diff --git a/src/main/java/com/gloddy/server/user/infra/repository/impl/UserJpaRepositoryImpl.java b/src/main/java/com/gloddy/server/user/infra/repository/impl/UserJpaRepositoryImpl.java index 015b054e..d06737f2 100644 --- a/src/main/java/com/gloddy/server/user/infra/repository/impl/UserJpaRepositoryImpl.java +++ b/src/main/java/com/gloddy/server/user/infra/repository/impl/UserJpaRepositoryImpl.java @@ -1,8 +1,9 @@ package com.gloddy.server.user.infra.repository.impl; +import com.gloddy.server.user.application.internal.dto.QUserPreviewResponse; +import com.gloddy.server.user.application.internal.dto.UserPreviewResponse; import com.gloddy.server.user.domain.User; import com.gloddy.server.user.domain.vo.Phone; -import com.gloddy.server.user.domain.vo.kind.Status; import com.gloddy.server.user.domain.dto.PraiseResponse; import com.gloddy.server.user.domain.dto.QPraiseResponse_GetPraiseForUser; import com.gloddy.server.user.infra.repository.custom.UserJpaRepositoryCustom; @@ -25,21 +26,21 @@ public class UserJpaRepositoryImpl implements UserJpaRepositoryCustom { @Override public Optional findByPhone(Phone phone) { return Optional.ofNullable(query.selectFrom(user) - .where(eqPhone(phone), isActive()) + .where(eqPhone(phone)) .fetchOne()); } @Override public Optional findByEmail(String email) { return Optional.ofNullable(query.selectFrom(user) - .where(eqEmail(email), isActive()) + .where(eqEmail(email)) .fetchOne()); } @Override - public Optional findByIdAndStatusFetch(Long id, Status status) { + public Optional findByIdFetch(Long id) { return Optional.ofNullable(query.selectFrom(user) - .where(eqId(id), eqStatus(status)) + .where(eqId(id)) .join(user.praise, praise).fetchJoin() .join(user.reliability, reliability).fetchJoin() .fetchOne()); @@ -59,6 +60,22 @@ public PraiseResponse.GetPraiseForUser findPraiseByUserId(Long userId) { .fetchOne(); } + @Override + public Optional findUserPreviewById(Long id) { + return Optional.ofNullable(query.select(new QUserPreviewResponse( + user.id, + user.school.isCertifiedStudent, + user.profile.imageUrl, + user.profile.nickname, + user.profile.country.name, + user.profile.country.image, + reliability.level + )).from(user) + .innerJoin(user.reliability, reliability) + .where(eqId(id)) + .fetchOne()); + } + private BooleanExpression eqPhone(Phone phone) { return user.phone.eq(phone); } @@ -67,14 +84,6 @@ private BooleanExpression eqEmail(String email) { return user.school.email.eq(email); } - private BooleanExpression isActive() { - return user.status.eq(Status.ACTIVE); - } - - private BooleanExpression eqStatus(Status status) { - return user.status.eq(status); - } - private BooleanExpression eqId(Long id) { return user.id.eq(id); }