From 59d407fb0dc7e9da4e847d10ec3e24981dd7b89d Mon Sep 17 00:00:00 2001 From: JAEHEE25 Date: Sun, 7 Dec 2025 21:43:16 +0900 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20=EC=96=B4=EB=93=9C=EB=AF=BC=20?= =?UTF-8?q?=EC=9C=A0=EC=A0=80=20=EA=B4=80=EB=A6=AC=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 차단 기능 rebase 및 충돌 해결 --- .../admin/controller/AdminUserController.java | 68 ++++ .../admin/dto/BannedHistoryResponse.java | 8 + .../admin/dto/BannedInfoResponse.java | 9 + .../admin/dto/BlockedInfoResponse.java | 7 + .../admin/dto/MatchedInfoResponse.java | 9 + .../admin/dto/MenteeInfoResponse.java | 9 + .../admin/dto/MentorInfoResponse.java | 9 + .../admin/dto/ReportedHistoryResponse.java | 11 + .../admin/dto/ReportedInfoResponse.java | 13 + .../dto/RestrictedUserInfoDetailResponse.java | 9 + .../dto/RestrictedUserSearchCondition.java | 11 + .../dto/RestrictedUserSearchResponse.java | 13 + .../admin/dto/UnivApplyInfoResponse.java | 8 + .../admin/dto/UserInfoDetailResponse.java | 10 + .../admin/dto/UserSearchCondition.java | 9 + .../admin/dto/UserSearchResponse.java | 12 + .../admin/service/AdminUserService.java | 53 +++ .../custom/SiteUserFilterRepository.java | 19 + .../custom/SiteUserFilterRepositoryImpl.java | 362 ++++++++++++++++++ 19 files changed, 649 insertions(+) create mode 100644 src/main/java/com/example/solidconnection/admin/controller/AdminUserController.java create mode 100644 src/main/java/com/example/solidconnection/admin/dto/BannedHistoryResponse.java create mode 100644 src/main/java/com/example/solidconnection/admin/dto/BannedInfoResponse.java create mode 100644 src/main/java/com/example/solidconnection/admin/dto/BlockedInfoResponse.java create mode 100644 src/main/java/com/example/solidconnection/admin/dto/MatchedInfoResponse.java create mode 100644 src/main/java/com/example/solidconnection/admin/dto/MenteeInfoResponse.java create mode 100644 src/main/java/com/example/solidconnection/admin/dto/MentorInfoResponse.java create mode 100644 src/main/java/com/example/solidconnection/admin/dto/ReportedHistoryResponse.java create mode 100644 src/main/java/com/example/solidconnection/admin/dto/ReportedInfoResponse.java create mode 100644 src/main/java/com/example/solidconnection/admin/dto/RestrictedUserInfoDetailResponse.java create mode 100644 src/main/java/com/example/solidconnection/admin/dto/RestrictedUserSearchCondition.java create mode 100644 src/main/java/com/example/solidconnection/admin/dto/RestrictedUserSearchResponse.java create mode 100644 src/main/java/com/example/solidconnection/admin/dto/UnivApplyInfoResponse.java create mode 100644 src/main/java/com/example/solidconnection/admin/dto/UserInfoDetailResponse.java create mode 100644 src/main/java/com/example/solidconnection/admin/dto/UserSearchCondition.java create mode 100644 src/main/java/com/example/solidconnection/admin/dto/UserSearchResponse.java create mode 100644 src/main/java/com/example/solidconnection/admin/service/AdminUserService.java create mode 100644 src/main/java/com/example/solidconnection/siteuser/repository/custom/SiteUserFilterRepository.java create mode 100644 src/main/java/com/example/solidconnection/siteuser/repository/custom/SiteUserFilterRepositoryImpl.java diff --git a/src/main/java/com/example/solidconnection/admin/controller/AdminUserController.java b/src/main/java/com/example/solidconnection/admin/controller/AdminUserController.java new file mode 100644 index 000000000..7e7689c4f --- /dev/null +++ b/src/main/java/com/example/solidconnection/admin/controller/AdminUserController.java @@ -0,0 +1,68 @@ +package com.example.solidconnection.admin.controller; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.example.solidconnection.admin.dto.RestrictedUserInfoDetailResponse; +import com.example.solidconnection.admin.dto.RestrictedUserSearchCondition; +import com.example.solidconnection.admin.dto.RestrictedUserSearchResponse; +import com.example.solidconnection.admin.dto.UserInfoDetailResponse; +import com.example.solidconnection.admin.dto.UserSearchCondition; +import com.example.solidconnection.admin.dto.UserSearchResponse; +import com.example.solidconnection.admin.service.AdminUserService; +import com.example.solidconnection.common.response.PageResponse; + +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RequiredArgsConstructor +@RequestMapping("/admin/users") +@RestController +@Slf4j +public class AdminUserController { + + private final AdminUserService adminUserService; + + @GetMapping + public ResponseEntity> searchAllUsers( + @Valid @ModelAttribute UserSearchCondition searchCondition, + Pageable pageable + ) { + Page page = adminUserService.searchAllUsers(searchCondition, pageable); + return ResponseEntity.ok(PageResponse.of(page)); + } + + @GetMapping("/{userId}") + public ResponseEntity getUserInfoDetail( + @PathVariable long userId + ) { + UserInfoDetailResponse response = adminUserService.getUserInfoDetail(userId); + return ResponseEntity.ok(response); + + } + + @GetMapping("/restricted") + public ResponseEntity> searchRestrictedUsers( + @Valid @ModelAttribute RestrictedUserSearchCondition searchCondition, + Pageable pageable + ) { + Page page = adminUserService.searchRestrictedUsers(searchCondition, pageable); + return ResponseEntity.ok(PageResponse.of(page)); + } + + @GetMapping("/restricted/{userId}") + public ResponseEntity getRestrictedUserInfoDetail( + @PathVariable long userId + ) { + RestrictedUserInfoDetailResponse response = adminUserService.getRestrictedUserInfoDetail(userId); + return ResponseEntity.ok(response); + + } +} diff --git a/src/main/java/com/example/solidconnection/admin/dto/BannedHistoryResponse.java b/src/main/java/com/example/solidconnection/admin/dto/BannedHistoryResponse.java new file mode 100644 index 000000000..b5ca6645e --- /dev/null +++ b/src/main/java/com/example/solidconnection/admin/dto/BannedHistoryResponse.java @@ -0,0 +1,8 @@ +package com.example.solidconnection.admin.dto; + +import java.time.ZonedDateTime; + +public record BannedHistoryResponse( + ZonedDateTime createdAt +) { +} diff --git a/src/main/java/com/example/solidconnection/admin/dto/BannedInfoResponse.java b/src/main/java/com/example/solidconnection/admin/dto/BannedInfoResponse.java new file mode 100644 index 000000000..134ca3ffd --- /dev/null +++ b/src/main/java/com/example/solidconnection/admin/dto/BannedInfoResponse.java @@ -0,0 +1,9 @@ +package com.example.solidconnection.admin.dto; + +import com.example.solidconnection.siteuser.domain.UserBanDuration; + +public record BannedInfoResponse( + boolean isBanned, + UserBanDuration duration +) { +} diff --git a/src/main/java/com/example/solidconnection/admin/dto/BlockedInfoResponse.java b/src/main/java/com/example/solidconnection/admin/dto/BlockedInfoResponse.java new file mode 100644 index 000000000..1b05ca349 --- /dev/null +++ b/src/main/java/com/example/solidconnection/admin/dto/BlockedInfoResponse.java @@ -0,0 +1,7 @@ +package com.example.solidconnection.admin.dto; + +public record BlockedInfoResponse( + boolean isBlocked + //todo 차단 처리 내역 추가 +) { +} diff --git a/src/main/java/com/example/solidconnection/admin/dto/MatchedInfoResponse.java b/src/main/java/com/example/solidconnection/admin/dto/MatchedInfoResponse.java new file mode 100644 index 000000000..7696b1201 --- /dev/null +++ b/src/main/java/com/example/solidconnection/admin/dto/MatchedInfoResponse.java @@ -0,0 +1,9 @@ +package com.example.solidconnection.admin.dto; + +import java.time.ZonedDateTime; + +public record MatchedInfoResponse( + String nickname, + ZonedDateTime matchedDate +) { +} diff --git a/src/main/java/com/example/solidconnection/admin/dto/MenteeInfoResponse.java b/src/main/java/com/example/solidconnection/admin/dto/MenteeInfoResponse.java new file mode 100644 index 000000000..e48ea897b --- /dev/null +++ b/src/main/java/com/example/solidconnection/admin/dto/MenteeInfoResponse.java @@ -0,0 +1,9 @@ +package com.example.solidconnection.admin.dto; + +import java.util.List; + +public record MenteeInfoResponse( + UnivApplyInfoResponse univApplyInfos, + List mentorInfos +) { +} diff --git a/src/main/java/com/example/solidconnection/admin/dto/MentorInfoResponse.java b/src/main/java/com/example/solidconnection/admin/dto/MentorInfoResponse.java new file mode 100644 index 000000000..e7f740086 --- /dev/null +++ b/src/main/java/com/example/solidconnection/admin/dto/MentorInfoResponse.java @@ -0,0 +1,9 @@ +package com.example.solidconnection.admin.dto; + +import java.util.List; + +public record MentorInfoResponse( + List menteeInfos, + List mentorApplicationHistory +) { +} diff --git a/src/main/java/com/example/solidconnection/admin/dto/ReportedHistoryResponse.java b/src/main/java/com/example/solidconnection/admin/dto/ReportedHistoryResponse.java new file mode 100644 index 000000000..a45ae5e27 --- /dev/null +++ b/src/main/java/com/example/solidconnection/admin/dto/ReportedHistoryResponse.java @@ -0,0 +1,11 @@ +package com.example.solidconnection.admin.dto; + +import java.time.ZonedDateTime; + +import com.example.solidconnection.report.domain.ReportType; + +public record ReportedHistoryResponse( + ZonedDateTime reportedDate, + ReportType reportType +) { +} diff --git a/src/main/java/com/example/solidconnection/admin/dto/ReportedInfoResponse.java b/src/main/java/com/example/solidconnection/admin/dto/ReportedInfoResponse.java new file mode 100644 index 000000000..00a2748f5 --- /dev/null +++ b/src/main/java/com/example/solidconnection/admin/dto/ReportedInfoResponse.java @@ -0,0 +1,13 @@ +package com.example.solidconnection.admin.dto; + +import java.time.ZonedDateTime; + +import com.example.solidconnection.report.domain.ReportType; +import com.example.solidconnection.report.domain.TargetType; + +public record ReportedInfoResponse( + ZonedDateTime reportedDate, + TargetType targetType, + ReportType reportType +) { +} diff --git a/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserInfoDetailResponse.java b/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserInfoDetailResponse.java new file mode 100644 index 000000000..b025adf7f --- /dev/null +++ b/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserInfoDetailResponse.java @@ -0,0 +1,9 @@ +package com.example.solidconnection.admin.dto; + +import java.util.List; + +public record RestrictedUserInfoDetailResponse( + List reportedHistoryResponses, // ACTIVE 유저일 경우 빈 리스트 + List bannedHistoryResponses // ACTIVE, REPORTED 유저일 경우 빈 리스트 +) { +} diff --git a/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserSearchCondition.java b/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserSearchCondition.java new file mode 100644 index 000000000..23f356cd1 --- /dev/null +++ b/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserSearchCondition.java @@ -0,0 +1,11 @@ +package com.example.solidconnection.admin.dto; + +import com.example.solidconnection.siteuser.domain.Role; +import com.example.solidconnection.siteuser.domain.UserStatus; + +public record RestrictedUserSearchCondition( + Role role, + UserStatus userStatus, + String keyword +) { +} diff --git a/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserSearchResponse.java b/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserSearchResponse.java new file mode 100644 index 000000000..7994f48ca --- /dev/null +++ b/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserSearchResponse.java @@ -0,0 +1,13 @@ +package com.example.solidconnection.admin.dto; + +import com.example.solidconnection.siteuser.domain.Role; +import com.example.solidconnection.siteuser.domain.UserStatus; + +public record RestrictedUserSearchResponse( + String nickname, + Role role, + UserStatus userStatus, + ReportedInfoResponse reportedInfoResponse, + BannedInfoResponse bannedInfoResponse +) { +} diff --git a/src/main/java/com/example/solidconnection/admin/dto/UnivApplyInfoResponse.java b/src/main/java/com/example/solidconnection/admin/dto/UnivApplyInfoResponse.java new file mode 100644 index 000000000..b4c0d3d6b --- /dev/null +++ b/src/main/java/com/example/solidconnection/admin/dto/UnivApplyInfoResponse.java @@ -0,0 +1,8 @@ +package com.example.solidconnection.admin.dto; + +public record UnivApplyInfoResponse( + String firstChoiceUnivName, + String secondChoiceUnivName, + String thirdChoiceUnivName +) { +} diff --git a/src/main/java/com/example/solidconnection/admin/dto/UserInfoDetailResponse.java b/src/main/java/com/example/solidconnection/admin/dto/UserInfoDetailResponse.java new file mode 100644 index 000000000..b6b833319 --- /dev/null +++ b/src/main/java/com/example/solidconnection/admin/dto/UserInfoDetailResponse.java @@ -0,0 +1,10 @@ +package com.example.solidconnection.admin.dto; + +import java.util.List; + +public record UserInfoDetailResponse( + MentorInfoResponse mentorInfoResponse, // 멘티일 경우 null + MenteeInfoResponse menteeInfoResponse, // 멘토일 경우 null + List reportedHistoryResponses // ACTIVE 유저일 경우 빈 리스트 +) { +} diff --git a/src/main/java/com/example/solidconnection/admin/dto/UserSearchCondition.java b/src/main/java/com/example/solidconnection/admin/dto/UserSearchCondition.java new file mode 100644 index 000000000..66778f4d5 --- /dev/null +++ b/src/main/java/com/example/solidconnection/admin/dto/UserSearchCondition.java @@ -0,0 +1,9 @@ +package com.example.solidconnection.admin.dto; + +import com.example.solidconnection.siteuser.domain.Role; + +public record UserSearchCondition( + Role role, + String keyword +) { +} diff --git a/src/main/java/com/example/solidconnection/admin/dto/UserSearchResponse.java b/src/main/java/com/example/solidconnection/admin/dto/UserSearchResponse.java new file mode 100644 index 000000000..0674e1a18 --- /dev/null +++ b/src/main/java/com/example/solidconnection/admin/dto/UserSearchResponse.java @@ -0,0 +1,12 @@ +package com.example.solidconnection.admin.dto; + +import com.example.solidconnection.siteuser.domain.Role; +import com.example.solidconnection.siteuser.domain.UserStatus; + +public record UserSearchResponse( + String nickname, + String email, + Role role, + UserStatus userStatus +) { +} diff --git a/src/main/java/com/example/solidconnection/admin/service/AdminUserService.java b/src/main/java/com/example/solidconnection/admin/service/AdminUserService.java new file mode 100644 index 000000000..b0ada4109 --- /dev/null +++ b/src/main/java/com/example/solidconnection/admin/service/AdminUserService.java @@ -0,0 +1,53 @@ +package com.example.solidconnection.admin.service; + +import static com.example.solidconnection.common.exception.ErrorCode.*; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.example.solidconnection.admin.dto.RestrictedUserInfoDetailResponse; +import com.example.solidconnection.admin.dto.RestrictedUserSearchCondition; +import com.example.solidconnection.admin.dto.RestrictedUserSearchResponse; +import com.example.solidconnection.admin.dto.UserInfoDetailResponse; +import com.example.solidconnection.admin.dto.UserSearchCondition; +import com.example.solidconnection.admin.dto.UserSearchResponse; +import com.example.solidconnection.common.exception.CustomException; +import com.example.solidconnection.siteuser.domain.SiteUser; +import com.example.solidconnection.siteuser.repository.SiteUserRepository; +import com.example.solidconnection.siteuser.repository.custom.SiteUserFilterRepository; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Service +public class AdminUserService { + + private final SiteUserRepository siteUserRepository; + private final SiteUserFilterRepository siteUserFilterRepository; + + @Transactional(readOnly = true) + public Page searchAllUsers(UserSearchCondition searchCondition, Pageable pageable) { + return siteUserFilterRepository.searchAllUsers(searchCondition, pageable); + } + + @Transactional(readOnly = true) + public Page searchRestrictedUsers(RestrictedUserSearchCondition searchCondition, Pageable pageable) { //TODO 수정 + return siteUserFilterRepository.searchRestrictedUsers(searchCondition, pageable); + } + + @Transactional(readOnly = true) + public UserInfoDetailResponse getUserInfoDetail(long userId) { + SiteUser siteUser = siteUserRepository.findById(userId) + .orElseThrow(() -> new CustomException(USER_NOT_FOUND)); + return siteUserFilterRepository.getUserInfoDetailByUserId(siteUser.getId()); + } + + @Transactional(readOnly = true) + public RestrictedUserInfoDetailResponse getRestrictedUserInfoDetail(long userId) { + SiteUser siteUser = siteUserRepository.findById(userId) + .orElseThrow(() -> new CustomException(USER_NOT_FOUND)); + return siteUserFilterRepository.getRestrictedUserInfoDetail(siteUser.getId()); + } +} diff --git a/src/main/java/com/example/solidconnection/siteuser/repository/custom/SiteUserFilterRepository.java b/src/main/java/com/example/solidconnection/siteuser/repository/custom/SiteUserFilterRepository.java new file mode 100644 index 000000000..d36dab775 --- /dev/null +++ b/src/main/java/com/example/solidconnection/siteuser/repository/custom/SiteUserFilterRepository.java @@ -0,0 +1,19 @@ +package com.example.solidconnection.siteuser.repository.custom; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +import com.example.solidconnection.admin.dto.RestrictedUserInfoDetailResponse; +import com.example.solidconnection.admin.dto.RestrictedUserSearchCondition; +import com.example.solidconnection.admin.dto.RestrictedUserSearchResponse; +import com.example.solidconnection.admin.dto.UserInfoDetailResponse; +import com.example.solidconnection.admin.dto.UserSearchCondition; +import com.example.solidconnection.admin.dto.UserSearchResponse; + +public interface SiteUserFilterRepository { + + Page searchAllUsers(UserSearchCondition searchCondition, Pageable pageable); + Page searchRestrictedUsers(RestrictedUserSearchCondition searchCondition, Pageable pageable); + UserInfoDetailResponse getUserInfoDetailByUserId(long userId); + RestrictedUserInfoDetailResponse getRestrictedUserInfoDetail(long userId); +} diff --git a/src/main/java/com/example/solidconnection/siteuser/repository/custom/SiteUserFilterRepositoryImpl.java b/src/main/java/com/example/solidconnection/siteuser/repository/custom/SiteUserFilterRepositoryImpl.java new file mode 100644 index 000000000..018b89389 --- /dev/null +++ b/src/main/java/com/example/solidconnection/siteuser/repository/custom/SiteUserFilterRepositoryImpl.java @@ -0,0 +1,362 @@ +package com.example.solidconnection.siteuser.repository.custom; + +import static com.example.solidconnection.application.domain.QApplication.application; +import static com.example.solidconnection.mentor.domain.QMentor.mentor; +import static com.example.solidconnection.mentor.domain.QMentorApplication.mentorApplication; +import static com.example.solidconnection.mentor.domain.QMentoring.mentoring; +import static com.example.solidconnection.report.domain.QReport.report; +import static com.example.solidconnection.siteuser.domain.QSiteUser.siteUser; +import static com.example.solidconnection.siteuser.domain.QUserBan.userBan; +import static com.example.solidconnection.university.domain.QUnivApplyInfo.univApplyInfo; +import static org.springframework.util.StringUtils.hasText; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.example.solidconnection.admin.dto.RestrictedUserInfoDetailResponse; +import com.example.solidconnection.university.domain.QUnivApplyInfo; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Repository; + +import com.example.solidconnection.admin.dto.BannedHistoryResponse; +import com.example.solidconnection.admin.dto.BannedInfoResponse; +import com.example.solidconnection.admin.dto.MatchedInfoResponse; +import com.example.solidconnection.admin.dto.MenteeInfoResponse; +import com.example.solidconnection.admin.dto.MentorApplicationHistoryResponse; +import com.example.solidconnection.admin.dto.MentorInfoResponse; +import com.example.solidconnection.admin.dto.ReportedHistoryResponse; +import com.example.solidconnection.admin.dto.ReportedInfoResponse; +import com.example.solidconnection.admin.dto.RestrictedUserSearchCondition; +import com.example.solidconnection.admin.dto.RestrictedUserSearchResponse; +import com.example.solidconnection.admin.dto.UnivApplyInfoResponse; +import com.example.solidconnection.admin.dto.UserInfoDetailResponse; +import com.example.solidconnection.admin.dto.UserSearchCondition; +import com.example.solidconnection.admin.dto.UserSearchResponse; +import com.example.solidconnection.siteuser.domain.Role; +import com.example.solidconnection.siteuser.domain.SiteUser; +import com.example.solidconnection.siteuser.domain.UserStatus; +import com.querydsl.core.types.ConstructorExpression; +import com.querydsl.core.types.Projections; +import com.querydsl.core.types.dsl.BooleanExpression; +import com.querydsl.jpa.JPAExpressions; +import com.querydsl.jpa.impl.JPAQuery; +import com.querydsl.jpa.impl.JPAQueryFactory; + +import jakarta.persistence.EntityManager; + +@Repository +public class SiteUserFilterRepositoryImpl implements SiteUserFilterRepository { + + private static final ConstructorExpression USER_SEARCH_RESPONSE_PROJECTION = + Projections.constructor( + UserSearchResponse.class, + siteUser.nickname, + siteUser.email, + siteUser.role, + siteUser.userStatus + ); + + private static final ConstructorExpression REPORTED_INFO_RESPONSE_PROJECTION = + Projections.constructor( + ReportedInfoResponse.class, + report.createdAt, + report.targetType, + report.reportType + ); + + private static final ConstructorExpression BANNED_INFO_RESPONSE_PROJECTION = + Projections.constructor( + BannedInfoResponse.class, + siteUser.userStatus.eq(UserStatus.BANNED), + userBan.duration + ); + + private static final ConstructorExpression RESTRICTED_USER_SEARCH_RESPONSE_PROJECTION = + Projections.constructor( + RestrictedUserSearchResponse.class, + siteUser.nickname, + siteUser.role, + siteUser.userStatus, + REPORTED_INFO_RESPONSE_PROJECTION, + BANNED_INFO_RESPONSE_PROJECTION + ); + + private static final ConstructorExpression REPORTED_HISTORY_RESPONSE_PROJECTION = + Projections.constructor( + ReportedHistoryResponse.class, + report.createdAt, + report.reportType + ); + + private static final ConstructorExpression MATCHED_INFO_RESPONSE_PROJECTION = + Projections.constructor( + MatchedInfoResponse.class, + siteUser.nickname, + mentoring.confirmedAt + ); + + private static final ConstructorExpression MENTOR_APPLICATION_HISTORY_RESPONSE_PROJECTION = + Projections.constructor( + MentorApplicationHistoryResponse.class, + mentorApplication.mentorApplicationStatus, + mentorApplication.rejectedReason, + mentorApplication.createdAt + ); + + private static final ConstructorExpression BANNED_HISTORY_RESPONSE_PROJECTION = + Projections.constructor( + BannedHistoryResponse.class, + userBan.createdAt + ); + + private static final QUnivApplyInfo firstChoiceUnivApplyInfo = new QUnivApplyInfo("firstChoiceUnivApplyInfo"); + private static final QUnivApplyInfo secondChoiceUnivApplyInfo = new QUnivApplyInfo("secondChoiceUnivApplyInfo"); + private static final QUnivApplyInfo thirdChoiceUnivApplyInfo = new QUnivApplyInfo("thirdChoiceUnivApplyInfo"); + + private static final ConstructorExpression UNIV_APPLY_INFO_RESPONSE_PROJECTION = + Projections.constructor( + UnivApplyInfoResponse.class, + firstChoiceUnivApplyInfo.koreanName, + secondChoiceUnivApplyInfo.koreanName, + thirdChoiceUnivApplyInfo.koreanName + ); + + private final JPAQueryFactory queryFactory; + + @Autowired + public SiteUserFilterRepositoryImpl(EntityManager em) { + this.queryFactory = new JPAQueryFactory(em); + } + + @Override + public Page searchAllUsers(UserSearchCondition condition, Pageable pageable) { + List content = queryFactory + .select(USER_SEARCH_RESPONSE_PROJECTION) + .from(siteUser) + .where( + roleEq(condition.role()), + keywordContains(condition.keyword()) + ) + .orderBy(siteUser.createdAt.desc()) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .fetch(); + + Long totalCount = createUserCountQuery(condition).fetchOne(); + return new PageImpl<>(content, pageable, totalCount != null ? totalCount : 0L); + } + + private JPAQuery createUserCountQuery(UserSearchCondition condition) { + return queryFactory + .select(siteUser.count()) + .from(siteUser) + .where( + roleEq(condition.role()), + keywordContains(condition.keyword()) + ); + } + + @Override + public Page searchRestrictedUsers( + RestrictedUserSearchCondition condition, + Pageable pageable + ) { + List content = queryFactory + .select(RESTRICTED_USER_SEARCH_RESPONSE_PROJECTION) + .from(siteUser) + + // 최신 신고 내역 조회 + .leftJoin(report).on( + report.reportedId.eq(siteUser.id) + .and( + report.id.eq( + JPAExpressions + .select(report.id.max()) + .from(report) + .where(report.reportedId.eq(siteUser.id)) + ) + ) + ) + + // 최신 차단 내역 조회 + .leftJoin(userBan).on( + userBan.bannedUserId.eq(siteUser.id) + .and( + userBan.id.eq( + JPAExpressions + .select(userBan.id.max()) + .from(userBan) + .where(userBan.bannedUserId.eq(siteUser.id)) + ) + ) + ) + + .where( + roleEq(condition.role()), + isRestrictedUser(), + userStatusEq(condition.userStatus()), + keywordContains(condition.keyword()) + ) + .orderBy(siteUser.createdAt.desc()) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .fetch(); + + Long totalCount = createRestrictedUserCountQuery(condition).fetchOne(); + + return new PageImpl<>(content, pageable, totalCount != null ? totalCount : 0L); + } + + + private JPAQuery createRestrictedUserCountQuery(RestrictedUserSearchCondition condition) { + return queryFactory + .select(siteUser.count()) + .from(siteUser) + .where( + roleEq(condition.role()), + isRestrictedUser(), + userStatusEq(condition.userStatus()), + keywordContains(condition.keyword()) + ); + } + + private BooleanExpression isRestrictedUser() { + return siteUser.userStatus.in( + UserStatus.REPORTED, + UserStatus.BANNED + ); + } + + private BooleanExpression roleEq(Role role) { + return role != null ? siteUser.role.eq(role) : null; + } + + private BooleanExpression userStatusEq(UserStatus userStatus) { + return userStatus != null ? siteUser.userStatus.eq(userStatus) : null; + } + + private BooleanExpression keywordContains(String keyword) { + if (!hasText(keyword)) { + return null; + } + return siteUser.nickname.containsIgnoreCase(keyword); + } + + @Override + public UserInfoDetailResponse getUserInfoDetailByUserId(long userId) { + SiteUser user = queryFactory + .selectFrom(siteUser) + .where(siteUser.id.eq(userId)) + .fetchOne(); + + // 신고 내역 + List reportedHistoryResponses = new ArrayList<>(); + if (user.getUserStatus() != UserStatus.ACTIVE) { + reportedHistoryResponses = fetchReportedHistories(userId); + } + + if (user.getRole() == Role.MENTOR) { + // 멘토 상세 내역 + MentorInfoResponse mentorInfoResponse = fetchMentorInfo(userId); + return new UserInfoDetailResponse(mentorInfoResponse, null, reportedHistoryResponses); + } else { + // 멘티 상세 내역 + MenteeInfoResponse menteeInfoResponse = fetchMenteeInfo(userId); + return new UserInfoDetailResponse(null, menteeInfoResponse, reportedHistoryResponses); + } + } + + @Override + public RestrictedUserInfoDetailResponse getRestrictedUserInfoDetail(long userId) { + List reportedHistoryResponses = fetchReportedHistories(userId); + List bannedHistoryResponses = fetchBannedHistories(userId); + + return new RestrictedUserInfoDetailResponse(reportedHistoryResponses, bannedHistoryResponses); + } + + private List fetchReportedHistories(long userId) { + return queryFactory + .select(REPORTED_HISTORY_RESPONSE_PROJECTION) + .from(report) + .where(report.reportedId.eq(userId)) + .orderBy(report.createdAt.desc()) + .fetch(); + } + + private List fetchBannedHistories(long userId) { + return queryFactory + .select(BANNED_HISTORY_RESPONSE_PROJECTION) + .from(userBan) + .where(userBan.bannedUserId.eq(userId)) + .orderBy(userBan.createdAt.desc()) + .fetch(); + } + + private MentorInfoResponse fetchMentorInfo(long userId) { + Long mentorId = queryFactory + .select(mentor.id) + .from(mentor) + .where(mentor.siteUserId.eq(userId)) + .fetchOne(); + + List menteeInfos = new ArrayList<>(); + if (mentorId != null) { + menteeInfos = queryFactory + .select(MATCHED_INFO_RESPONSE_PROJECTION) + .from(mentoring) + .join(siteUser).on(siteUser.id.eq(mentoring.menteeId)) + .where(mentoring.mentorId.eq(mentorId)) + .orderBy(mentoring.confirmedAt.desc()) + .fetch(); + } + + List mentorApplicationHistory = queryFactory + .select(MENTOR_APPLICATION_HISTORY_RESPONSE_PROJECTION) + .from(mentorApplication) + .where(mentorApplication.siteUserId.eq(userId)) + .orderBy(mentorApplication.createdAt.desc()) + .fetch(); + + return new MentorInfoResponse(menteeInfos, mentorApplicationHistory); + } + + private MenteeInfoResponse fetchMenteeInfo(long userId) { + UnivApplyInfoResponse univApplyInfoResponse = fetchUnivApplyInfo(userId); + List mentorInfos = queryFactory + .select(MATCHED_INFO_RESPONSE_PROJECTION) + .from(mentoring) + .join(mentor).on(mentor.id.eq(mentoring.mentorId)) + .join(siteUser).on(siteUser.id.eq(mentor.siteUserId)) + .where(mentoring.menteeId.eq(userId)) + .orderBy(mentoring.confirmedAt.desc()) + .fetch(); + + return new MenteeInfoResponse(univApplyInfoResponse, mentorInfos); + } + + private UnivApplyInfoResponse fetchUnivApplyInfo(long userId) { + UnivApplyInfoResponse result = queryFactory + .select(UNIV_APPLY_INFO_RESPONSE_PROJECTION) + .from(application) + .leftJoin(firstChoiceUnivApplyInfo).on(firstChoiceUnivApplyInfo.id.eq(application.firstChoiceUnivApplyInfoId)) + .leftJoin(secondChoiceUnivApplyInfo).on(secondChoiceUnivApplyInfo.id.eq(application.secondChoiceUnivApplyInfoId)) + .leftJoin(thirdChoiceUnivApplyInfo).on(thirdChoiceUnivApplyInfo.id.eq(application.thirdChoiceUnivApplyInfoId)) + .where(application.siteUserId.eq(userId)) + .orderBy(application.createdAt.desc()) + .fetchFirst(); + + if (result == null) { + return new UnivApplyInfoResponse(null, null, null); + } + + return result; + } + + +} From 2338073f7faac63e3dd6df3d71ddd5a434042036 Mon Sep 17 00:00:00 2001 From: JAEHEE25 Date: Sun, 4 Jan 2026 22:52:48 +0900 Subject: [PATCH 2/4] =?UTF-8?q?test:=20=EC=96=B4=EB=93=9C=EB=AF=BC=20?= =?UTF-8?q?=EC=9C=A0=EC=A0=80=20=EA=B4=80=EB=A6=AC=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/dto/BlockedInfoResponse.java | 7 - .../admin/service/AdminUserService.java | 2 +- .../admin/service/AdminUserServiceTest.java | 447 ++++++++++++++++++ .../siteuser/fixture/SiteUserFixture.java | 12 + 4 files changed, 460 insertions(+), 8 deletions(-) delete mode 100644 src/main/java/com/example/solidconnection/admin/dto/BlockedInfoResponse.java create mode 100644 src/test/java/com/example/solidconnection/admin/service/AdminUserServiceTest.java diff --git a/src/main/java/com/example/solidconnection/admin/dto/BlockedInfoResponse.java b/src/main/java/com/example/solidconnection/admin/dto/BlockedInfoResponse.java deleted file mode 100644 index 1b05ca349..000000000 --- a/src/main/java/com/example/solidconnection/admin/dto/BlockedInfoResponse.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.example.solidconnection.admin.dto; - -public record BlockedInfoResponse( - boolean isBlocked - //todo 차단 처리 내역 추가 -) { -} diff --git a/src/main/java/com/example/solidconnection/admin/service/AdminUserService.java b/src/main/java/com/example/solidconnection/admin/service/AdminUserService.java index b0ada4109..8cada5326 100644 --- a/src/main/java/com/example/solidconnection/admin/service/AdminUserService.java +++ b/src/main/java/com/example/solidconnection/admin/service/AdminUserService.java @@ -33,7 +33,7 @@ public Page searchAllUsers(UserSearchCondition searchConditi } @Transactional(readOnly = true) - public Page searchRestrictedUsers(RestrictedUserSearchCondition searchCondition, Pageable pageable) { //TODO 수정 + public Page searchRestrictedUsers(RestrictedUserSearchCondition searchCondition, Pageable pageable) { return siteUserFilterRepository.searchRestrictedUsers(searchCondition, pageable); } diff --git a/src/test/java/com/example/solidconnection/admin/service/AdminUserServiceTest.java b/src/test/java/com/example/solidconnection/admin/service/AdminUserServiceTest.java new file mode 100644 index 000000000..5a18df246 --- /dev/null +++ b/src/test/java/com/example/solidconnection/admin/service/AdminUserServiceTest.java @@ -0,0 +1,447 @@ +package com.example.solidconnection.admin.service; + +import static com.example.solidconnection.common.exception.ErrorCode.USER_NOT_FOUND; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatCode; +import static org.junit.jupiter.api.Assertions.assertAll; + +import com.example.solidconnection.admin.dto.RestrictedUserInfoDetailResponse; +import com.example.solidconnection.admin.dto.RestrictedUserSearchCondition; +import com.example.solidconnection.admin.dto.RestrictedUserSearchResponse; +import com.example.solidconnection.admin.dto.UserInfoDetailResponse; +import com.example.solidconnection.admin.dto.UserSearchCondition; +import com.example.solidconnection.admin.dto.UserSearchResponse; +import com.example.solidconnection.application.domain.Gpa; +import com.example.solidconnection.application.domain.LanguageTest; +import com.example.solidconnection.application.fixture.ApplicationFixture; +import com.example.solidconnection.university.domain.LanguageTestType; +import com.example.solidconnection.common.exception.CustomException; +import com.example.solidconnection.community.board.fixture.BoardFixture; +import com.example.solidconnection.community.post.domain.Post; +import com.example.solidconnection.community.post.domain.PostCategory; +import com.example.solidconnection.community.post.fixture.PostFixture; +import com.example.solidconnection.mentor.domain.Mentor; +import com.example.solidconnection.mentor.domain.UniversitySelectType; +import com.example.solidconnection.mentor.fixture.MentorApplicationFixture; +import com.example.solidconnection.mentor.fixture.MentorFixture; +import com.example.solidconnection.mentor.fixture.MentoringFixture; +import com.example.solidconnection.report.domain.TargetType; +import com.example.solidconnection.report.fixture.ReportFixture; +import com.example.solidconnection.siteuser.domain.Role; +import com.example.solidconnection.siteuser.domain.SiteUser; +import com.example.solidconnection.siteuser.domain.UserStatus; +import com.example.solidconnection.siteuser.fixture.SiteUserFixture; +import com.example.solidconnection.siteuser.fixture.UserBanFixture; +import com.example.solidconnection.support.TestContainerSpringBootTest; +import com.example.solidconnection.term.fixture.TermFixture; +import com.example.solidconnection.university.domain.UnivApplyInfo; +import com.example.solidconnection.university.domain.University; +import com.example.solidconnection.university.fixture.UnivApplyInfoFixture; +import com.example.solidconnection.university.fixture.UniversityFixture; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; + +@TestContainerSpringBootTest +@DisplayName("어드민 유저 관리 서비스 테스트") +public class AdminUserServiceTest { + + @Autowired + private AdminUserService adminUserService; + + @Autowired + private SiteUserFixture siteUserFixture; + + @Autowired + private ReportFixture reportFixture; + + @Autowired + private UserBanFixture userBanFixture; + + @Autowired + private PostFixture postFixture; + + @Autowired + private BoardFixture boardFixture; + + @Autowired + private MentorFixture mentorFixture; + + @Autowired + private MentorApplicationFixture mentorApplicationFixture; + + @Autowired + private MentoringFixture mentoringFixture; + + @Autowired + private UniversityFixture universityFixture; + + @Autowired + private UnivApplyInfoFixture univApplyInfoFixture; + + @Autowired + private ApplicationFixture applicationFixture; + + @Autowired + private TermFixture termFixture; + + @Nested + @DisplayName("전체 유저 검색") + class 전체_유저_검색 { + + @Test + void 전체_유저를_조회한다() { + // given + siteUserFixture.사용자(1, "유저1"); + siteUserFixture.사용자(2, "유저2"); + siteUserFixture.사용자(3, "유저3"); + + UserSearchCondition condition = new UserSearchCondition(null, null); + Pageable pageable = PageRequest.of(0, 10); + + // when + Page result = adminUserService.searchAllUsers(condition, pageable); + + // then + assertThat(result.getContent()).hasSize(3); + } + + @Test + void role로_필터링하여_조회한다() { + // given + siteUserFixture.사용자(1, "멘티1"); + siteUserFixture.사용자(2, "멘티2"); + siteUserFixture.멘토(1, "멘토1"); + + UserSearchCondition condition = new UserSearchCondition(Role.MENTEE, null); + Pageable pageable = PageRequest.of(0, 10); + + // when + Page result = adminUserService.searchAllUsers(condition, pageable); + + // then + assertAll( + () -> assertThat(result.getContent()).hasSize(2), + () -> assertThat(result.getContent()) + .allMatch(user -> user.role() == Role.MENTEE) + ); + } + + @Test + void 닉네임으로_검색한다() { + // given + siteUserFixture.사용자(1, "피카츄1"); + siteUserFixture.사용자(2, "꼬부기"); + siteUserFixture.사용자(3, "피카츄2"); + + UserSearchCondition condition = new UserSearchCondition(null, "피카"); + Pageable pageable = PageRequest.of(0, 10); + + // when + Page result = adminUserService.searchAllUsers(condition, pageable); + + // then + assertAll( + () -> assertThat(result.getContent()).hasSize(2), + () -> assertThat(result.getContent()) + .allMatch(user -> user.nickname().contains("피카")) + ); + } + + @Test + void 페이징이_정상_작동한다() { + // given + for (int i = 1; i <= 15; i++) { + siteUserFixture.사용자(i, "유저" + i); + } + + UserSearchCondition condition = new UserSearchCondition(null, null); + Pageable pageable = PageRequest.of(0, 10); + + // when + Page result = adminUserService.searchAllUsers(condition, pageable); + + // then + assertAll( + () -> assertThat(result.getContent()).hasSize(10), + () -> assertThat(result.getTotalElements()).isEqualTo(15), + () -> assertThat(result.getTotalPages()).isEqualTo(2) + ); + } + } + + @Nested + @DisplayName("유저 상세 정보 조회") + class 유저_상세_정보_조회 { + + @Test + void 멘티_유저_상세_정보를_조회한다() { + // given + SiteUser mentee = siteUserFixture.사용자(1, "멘티유저"); + long termId = termFixture.현재_학기("2025-1").getId(); + + UnivApplyInfo firstChoice = univApplyInfoFixture.괌대학_A_지원_정보(termId); + UnivApplyInfo secondChoice = univApplyInfoFixture.네바다주립대학_라스베이거스_지원_정보(termId); + + applicationFixture.지원서( + mentee, + "지원닉네임", + termId, + new Gpa(4.0, 4.5, "http://gpa-report.com/test.pdf"), + new LanguageTest(LanguageTestType.TOEIC, "900", "http://language-test.com/test.pdf"), + firstChoice.getId(), + secondChoice.getId(), + null + ); + + // when + UserInfoDetailResponse result = adminUserService.getUserInfoDetail(mentee.getId()); + + // then + assertAll( + () -> assertThat(result.mentorInfoResponse()).isNull(), + () -> assertThat(result.menteeInfoResponse()).isNotNull(), + () -> assertThat(result.menteeInfoResponse().univApplyInfos()).isNotNull() + ); + } + + @Test + void 멘토_유저_상세_정보를_조회한다() { + // given + SiteUser mentorUser = siteUserFixture.멘토(1, "멘토유저"); + University university = universityFixture.괌_대학(); + + Mentor mentor = mentorFixture.멘토(mentorUser.getId(), university.getId()); + mentorApplicationFixture.승인된_멘토신청( + mentorUser.getId(), + UniversitySelectType.CATALOG, + university.getId() + ); + + SiteUser mentee = siteUserFixture.사용자(1, "멘티유저"); + mentoringFixture.승인된_멘토링(mentor.getId(), mentee.getId()); + + // when + UserInfoDetailResponse result = adminUserService.getUserInfoDetail(mentorUser.getId()); + + // then + assertAll( + () -> assertThat(result.mentorInfoResponse()).isNotNull(), + () -> assertThat(result.menteeInfoResponse()).isNull(), + () -> assertThat(result.mentorInfoResponse().menteeInfos()).hasSize(1), + () -> assertThat(result.mentorInfoResponse().mentorApplicationHistory()).hasSize(1) + ); + } + + @Test + void 신고된_유저는_신고_내역이_포함된다() { + // given + SiteUser reportedUser = siteUserFixture.신고된_사용자("신고된유저"); + SiteUser reporter = siteUserFixture.사용자(1, "신고자"); + + Post post = postFixture.게시글( + "신고된 게시글", + "내용", + false, + PostCategory.자유, + boardFixture.자유게시판(), + reportedUser + ); + + reportFixture.신고(reporter.getId(), reportedUser.getId(), TargetType.POST, post.getId()); + + // when + UserInfoDetailResponse result = adminUserService.getUserInfoDetail(reportedUser.getId()); + + // then + assertThat(result.reportedHistoryResponses()).hasSize(1); + } + + @Test + void 존재하지_않는_유저_조회_시_예외_응답을_반환한다() { + // given + long notExistUserId = 999999L; + + // when & then + assertThatCode(() -> adminUserService.getUserInfoDetail(notExistUserId)) + .isInstanceOf(CustomException.class) + .hasMessage(USER_NOT_FOUND.getMessage()); + } + } + + @Nested + @DisplayName("신고/차단된 유저 검색") + class 신고_차단된_유저_검색 { + + @Test + void 신고_차단된_유저만_조회한다() { + // given + siteUserFixture.사용자(1, "일반유저"); + siteUserFixture.신고된_사용자("신고된유저"); + siteUserFixture.차단된_사용자("차단된유저"); + + RestrictedUserSearchCondition condition = new RestrictedUserSearchCondition(null, null, null); + Pageable pageable = PageRequest.of(0, 10); + + // when + Page result = adminUserService.searchRestrictedUsers(condition, pageable); + + // then + assertAll( + () -> assertThat(result.getContent()).hasSize(2), + () -> assertThat(result.getContent()) + .allMatch(user -> + user.userStatus() == UserStatus.REPORTED || + user.userStatus() == UserStatus.BANNED + ) + ); + } + + @Test + void role로_필터링하여_조회한다() { + // given + siteUserFixture.신고된_사용자("신고된멘티"); + siteUserFixture.신고된_사용자_멘토(1, "신고된멘토"); + + RestrictedUserSearchCondition condition = new RestrictedUserSearchCondition(Role.MENTOR, null, null); + Pageable pageable = PageRequest.of(0, 10); + + // when + Page result = adminUserService.searchRestrictedUsers(condition, pageable); + + // then + assertAll( + () -> assertThat(result.getContent()).hasSize(1), + () -> assertThat(result.getContent().get(0).role()).isEqualTo(Role.MENTOR) + ); + } + + @Test + void userStatus로_필터링하여_조회한다() { + // given + siteUserFixture.신고된_사용자("신고된유저"); + siteUserFixture.차단된_사용자("차단된유저"); + + RestrictedUserSearchCondition condition = new RestrictedUserSearchCondition(null, UserStatus.BANNED, null); + Pageable pageable = PageRequest.of(0, 10); + + // when + Page result = adminUserService.searchRestrictedUsers(condition, pageable); + + // then + assertAll( + () -> assertThat(result.getContent()).hasSize(1), + () -> assertThat(result.getContent().get(0).userStatus()).isEqualTo(UserStatus.BANNED) + ); + } + + @Test + void 닉네임으로_검색한다() { + // given + siteUserFixture.신고된_사용자("피카츄"); + siteUserFixture.차단된_사용자("꼬부기"); + + RestrictedUserSearchCondition condition = new RestrictedUserSearchCondition(null, null, "피카"); + Pageable pageable = PageRequest.of(0, 10); + + // when + Page result = adminUserService.searchRestrictedUsers(condition, pageable); + + // then + assertAll( + () -> assertThat(result.getContent()).hasSize(1), + () -> assertThat(result.getContent().get(0).nickname()).contains("피카") + ); + } + } + + @Nested + @DisplayName("신고/차단된 유저 상세 정보 조회") + class 신고_차단된_유저_상세_정보_조회 { + + @Test + void 신고_내역을_조회한다() { + // given + SiteUser reportedUser = siteUserFixture.신고된_사용자("신고된유저"); + SiteUser reporter1 = siteUserFixture.사용자(1, "신고자1"); + SiteUser reporter2 = siteUserFixture.사용자(2, "신고자2"); + + Post post = postFixture.게시글( + "게시글", + "내용", + false, + PostCategory.자유, + boardFixture.자유게시판(), + reportedUser + ); + + reportFixture.신고(reporter1.getId(), reportedUser.getId(), TargetType.POST, post.getId()); + reportFixture.신고(reporter2.getId(), reportedUser.getId(), TargetType.POST, post.getId()); + + // when + RestrictedUserInfoDetailResponse result = adminUserService.getRestrictedUserInfoDetail(reportedUser.getId()); + + // then + assertThat(result.reportedHistoryResponses()).hasSize(2); + } + + @Test + void 차단_내역을_조회한다() { + // given + SiteUser bannedUser = siteUserFixture.차단된_사용자("차단된유저"); + SiteUser admin = siteUserFixture.관리자(); + + userBanFixture.수동_차단_해제(bannedUser.getId(), admin.getId()); + + // when + RestrictedUserInfoDetailResponse result = adminUserService.getRestrictedUserInfoDetail(bannedUser.getId()); + + // then + assertThat(result.bannedHistoryResponses()).hasSize(1); + } + + @Test + void 신고_차단_내역을_함께_조회한다() { + // given + SiteUser user = siteUserFixture.차단된_사용자("차단된유저"); + SiteUser reporter = siteUserFixture.사용자(1, "신고자"); + SiteUser admin = siteUserFixture.관리자(); + + Post post = postFixture.게시글( + "게시글", + "내용", + false, + PostCategory.자유, + boardFixture.자유게시판(), + user + ); + + reportFixture.신고(reporter.getId(), user.getId(), TargetType.POST, post.getId()); + userBanFixture.수동_차단_해제(user.getId(), admin.getId()); + + // when + RestrictedUserInfoDetailResponse result = adminUserService.getRestrictedUserInfoDetail(user.getId()); + + // then + assertAll( + () -> assertThat(result.reportedHistoryResponses()).hasSize(1), + () -> assertThat(result.bannedHistoryResponses()).hasSize(1) + ); + } + + @Test + void 존재하지_않는_유저_조회_시_예외_응답을_반환한다() { + // given + long notExistUserId = 999999L; + + // when & then + assertThatCode(() -> adminUserService.getRestrictedUserInfoDetail(notExistUserId)) + .isInstanceOf(CustomException.class) + .hasMessage(USER_NOT_FOUND.getMessage()); + } + } +} diff --git a/src/test/java/com/example/solidconnection/siteuser/fixture/SiteUserFixture.java b/src/test/java/com/example/solidconnection/siteuser/fixture/SiteUserFixture.java index cdf48a024..05262b6a2 100644 --- a/src/test/java/com/example/solidconnection/siteuser/fixture/SiteUserFixture.java +++ b/src/test/java/com/example/solidconnection/siteuser/fixture/SiteUserFixture.java @@ -97,6 +97,18 @@ public class SiteUserFixture { .create(); } + public SiteUser 신고된_사용자_멘토(int index, String nickname) { + return siteUserFixtureBuilder.siteUser() + .email("reported" + index + "@example.com") + .authType(AuthType.EMAIL) + .nickname(nickname) + .profileImageUrl("profileImageUrl") + .role(Role.MENTOR) + .password("reported123") + .userStatus(UserStatus.REPORTED) + .create(); + } + public SiteUser 차단된_사용자(String nickname) { return siteUserFixtureBuilder.siteUser() .email("banned@example.com") From aa1795f42bb812a218c92ebf46de2c0a31025d97 Mon Sep 17 00:00:00 2001 From: JAEHEE25 Date: Mon, 2 Feb 2026 18:19:38 +0900 Subject: [PATCH 3/4] =?UTF-8?q?feat:=20=EC=96=B4=EB=93=9C=EB=AF=BC=20?= =?UTF-8?q?=EC=9C=A0=EC=A0=80=20=EA=B4=80=EB=A6=AC=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/controller/AdminUserController.java | 10 +++---- .../MentorApplicationHistoryInfoResponse.java | 12 +++++++++ .../admin/dto/MentorInfoResponse.java | 2 +- .../admin/service/AdminUserService.java | 2 +- .../custom/SiteUserFilterRepository.java | 3 +++ .../custom/SiteUserFilterRepositoryImpl.java | 27 ++++++------------- .../admin/service/AdminUserServiceTest.java | 6 ++--- 7 files changed, 31 insertions(+), 31 deletions(-) create mode 100644 src/main/java/com/example/solidconnection/admin/dto/MentorApplicationHistoryInfoResponse.java diff --git a/src/main/java/com/example/solidconnection/admin/controller/AdminUserController.java b/src/main/java/com/example/solidconnection/admin/controller/AdminUserController.java index 7e7689c4f..930f05493 100644 --- a/src/main/java/com/example/solidconnection/admin/controller/AdminUserController.java +++ b/src/main/java/com/example/solidconnection/admin/controller/AdminUserController.java @@ -20,12 +20,10 @@ import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; @RequiredArgsConstructor @RequestMapping("/admin/users") @RestController -@Slf4j public class AdminUserController { private final AdminUserService adminUserService; @@ -39,9 +37,9 @@ public ResponseEntity> searchAllUsers( return ResponseEntity.ok(PageResponse.of(page)); } - @GetMapping("/{userId}") + @GetMapping("/{user-id}") public ResponseEntity getUserInfoDetail( - @PathVariable long userId + @PathVariable(name = "user-id") long userId ) { UserInfoDetailResponse response = adminUserService.getUserInfoDetail(userId); return ResponseEntity.ok(response); @@ -57,9 +55,9 @@ public ResponseEntity> searchRestrict return ResponseEntity.ok(PageResponse.of(page)); } - @GetMapping("/restricted/{userId}") + @GetMapping("/restricted/{user-id}") public ResponseEntity getRestrictedUserInfoDetail( - @PathVariable long userId + @PathVariable(name = "user-id") long userId ) { RestrictedUserInfoDetailResponse response = adminUserService.getRestrictedUserInfoDetail(userId); return ResponseEntity.ok(response); diff --git a/src/main/java/com/example/solidconnection/admin/dto/MentorApplicationHistoryInfoResponse.java b/src/main/java/com/example/solidconnection/admin/dto/MentorApplicationHistoryInfoResponse.java new file mode 100644 index 000000000..f026299f0 --- /dev/null +++ b/src/main/java/com/example/solidconnection/admin/dto/MentorApplicationHistoryInfoResponse.java @@ -0,0 +1,12 @@ +package com.example.solidconnection.admin.dto; + +import com.example.solidconnection.mentor.domain.MentorApplicationStatus; +import java.time.ZonedDateTime; + +public record MentorApplicationHistoryInfoResponse( + MentorApplicationStatus mentorApplicationStatus, + String rejectedReason, + ZonedDateTime createdAt +) { + +} diff --git a/src/main/java/com/example/solidconnection/admin/dto/MentorInfoResponse.java b/src/main/java/com/example/solidconnection/admin/dto/MentorInfoResponse.java index e7f740086..2e4db415a 100644 --- a/src/main/java/com/example/solidconnection/admin/dto/MentorInfoResponse.java +++ b/src/main/java/com/example/solidconnection/admin/dto/MentorInfoResponse.java @@ -4,6 +4,6 @@ public record MentorInfoResponse( List menteeInfos, - List mentorApplicationHistory + List mentorApplicationHistory ) { } diff --git a/src/main/java/com/example/solidconnection/admin/service/AdminUserService.java b/src/main/java/com/example/solidconnection/admin/service/AdminUserService.java index 8cada5326..2289a58d1 100644 --- a/src/main/java/com/example/solidconnection/admin/service/AdminUserService.java +++ b/src/main/java/com/example/solidconnection/admin/service/AdminUserService.java @@ -1,6 +1,6 @@ package com.example.solidconnection.admin.service; -import static com.example.solidconnection.common.exception.ErrorCode.*; +import static com.example.solidconnection.common.exception.ErrorCode.USER_NOT_FOUND; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; diff --git a/src/main/java/com/example/solidconnection/siteuser/repository/custom/SiteUserFilterRepository.java b/src/main/java/com/example/solidconnection/siteuser/repository/custom/SiteUserFilterRepository.java index d36dab775..f78cfe6fe 100644 --- a/src/main/java/com/example/solidconnection/siteuser/repository/custom/SiteUserFilterRepository.java +++ b/src/main/java/com/example/solidconnection/siteuser/repository/custom/SiteUserFilterRepository.java @@ -13,7 +13,10 @@ public interface SiteUserFilterRepository { Page searchAllUsers(UserSearchCondition searchCondition, Pageable pageable); + Page searchRestrictedUsers(RestrictedUserSearchCondition searchCondition, Pageable pageable); + UserInfoDetailResponse getUserInfoDetailByUserId(long userId); + RestrictedUserInfoDetailResponse getRestrictedUserInfoDetail(long userId); } diff --git a/src/main/java/com/example/solidconnection/siteuser/repository/custom/SiteUserFilterRepositoryImpl.java b/src/main/java/com/example/solidconnection/siteuser/repository/custom/SiteUserFilterRepositoryImpl.java index 018b89389..8b9db7c1e 100644 --- a/src/main/java/com/example/solidconnection/siteuser/repository/custom/SiteUserFilterRepositoryImpl.java +++ b/src/main/java/com/example/solidconnection/siteuser/repository/custom/SiteUserFilterRepositoryImpl.java @@ -7,28 +7,24 @@ import static com.example.solidconnection.report.domain.QReport.report; import static com.example.solidconnection.siteuser.domain.QSiteUser.siteUser; import static com.example.solidconnection.siteuser.domain.QUserBan.userBan; -import static com.example.solidconnection.university.domain.QUnivApplyInfo.univApplyInfo; +import static java.time.ZoneOffset.UTC; import static org.springframework.util.StringUtils.hasText; +import com.example.solidconnection.admin.dto.MentorApplicationHistoryInfoResponse; +import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - import org.springframework.beans.factory.annotation.Autowired; - import com.example.solidconnection.admin.dto.RestrictedUserInfoDetailResponse; import com.example.solidconnection.university.domain.QUnivApplyInfo; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Repository; - import com.example.solidconnection.admin.dto.BannedHistoryResponse; import com.example.solidconnection.admin.dto.BannedInfoResponse; import com.example.solidconnection.admin.dto.MatchedInfoResponse; import com.example.solidconnection.admin.dto.MenteeInfoResponse; -import com.example.solidconnection.admin.dto.MentorApplicationHistoryResponse; import com.example.solidconnection.admin.dto.MentorInfoResponse; import com.example.solidconnection.admin.dto.ReportedHistoryResponse; import com.example.solidconnection.admin.dto.ReportedInfoResponse; @@ -47,7 +43,6 @@ import com.querydsl.jpa.JPAExpressions; import com.querydsl.jpa.impl.JPAQuery; import com.querydsl.jpa.impl.JPAQueryFactory; - import jakarta.persistence.EntityManager; @Repository @@ -101,9 +96,9 @@ public class SiteUserFilterRepositoryImpl implements SiteUserFilterRepository { mentoring.confirmedAt ); - private static final ConstructorExpression MENTOR_APPLICATION_HISTORY_RESPONSE_PROJECTION = + private static final ConstructorExpression MENTOR_APPLICATION_HISTORY_RESPONSE_PROJECTION = Projections.constructor( - MentorApplicationHistoryResponse.class, + MentorApplicationHistoryInfoResponse.class, mentorApplication.mentorApplicationStatus, mentorApplication.rejectedReason, mentorApplication.createdAt @@ -187,14 +182,8 @@ public Page searchRestrictedUsers( // 최신 차단 내역 조회 .leftJoin(userBan).on( userBan.bannedUserId.eq(siteUser.id) - .and( - userBan.id.eq( - JPAExpressions - .select(userBan.id.max()) - .from(userBan) - .where(userBan.bannedUserId.eq(siteUser.id)) - ) - ) + .and(userBan.isExpired.eq(false)) + .and(userBan.expiredAt.after(ZonedDateTime.now(UTC))) ) .where( @@ -316,7 +305,7 @@ private MentorInfoResponse fetchMentorInfo(long userId) { .fetch(); } - List mentorApplicationHistory = queryFactory + List mentorApplicationHistory = queryFactory .select(MENTOR_APPLICATION_HISTORY_RESPONSE_PROJECTION) .from(mentorApplication) .where(mentorApplication.siteUserId.eq(userId)) diff --git a/src/test/java/com/example/solidconnection/admin/service/AdminUserServiceTest.java b/src/test/java/com/example/solidconnection/admin/service/AdminUserServiceTest.java index 5a18df246..2085a4262 100644 --- a/src/test/java/com/example/solidconnection/admin/service/AdminUserServiceTest.java +++ b/src/test/java/com/example/solidconnection/admin/service/AdminUserServiceTest.java @@ -262,7 +262,7 @@ class 유저_상세_정보_조회 { } @Test - void 존재하지_않는_유저_조회_시_예외_응답을_반환한다() { + void 존재하지_않는_유저_조회_시_예외가_발생한다() { // given long notExistUserId = 999999L; @@ -274,7 +274,6 @@ class 유저_상세_정보_조회 { } @Nested - @DisplayName("신고/차단된 유저 검색") class 신고_차단된_유저_검색 { @Test @@ -360,7 +359,6 @@ class 신고_차단된_유저_검색 { } @Nested - @DisplayName("신고/차단된 유저 상세 정보 조회") class 신고_차단된_유저_상세_정보_조회 { @Test @@ -434,7 +432,7 @@ class 신고_차단된_유저_상세_정보_조회 { } @Test - void 존재하지_않는_유저_조회_시_예외_응답을_반환한다() { + void 존재하지_않는_유저_조회_시_예외가_발생한다() { // given long notExistUserId = 999999L; From 6b9ec4321be7709014f640ab1711173cbd9c89c3 Mon Sep 17 00:00:00 2001 From: JAEHEE25 Date: Thu, 12 Feb 2026 15:20:02 +0900 Subject: [PATCH 4/4] =?UTF-8?q?feat:=20=EC=96=B4=EB=93=9C=EB=AF=BC=20?= =?UTF-8?q?=EC=9C=A0=EC=A0=80=20=EA=B4=80=EB=A6=AC=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - University -> HostUniversity 변경 --- .../admin/controller/AdminUserController.java | 4 ---- .../solidconnection/admin/dto/BannedHistoryResponse.java | 1 + .../solidconnection/admin/dto/BannedInfoResponse.java | 1 + .../solidconnection/admin/dto/MatchedInfoResponse.java | 1 + .../solidconnection/admin/dto/MenteeInfoResponse.java | 1 + .../solidconnection/admin/dto/MentorInfoResponse.java | 1 + .../solidconnection/admin/dto/ReportedHistoryResponse.java | 1 + .../solidconnection/admin/dto/ReportedInfoResponse.java | 1 + .../admin/dto/RestrictedUserInfoDetailResponse.java | 5 +++-- .../admin/dto/RestrictedUserSearchCondition.java | 1 + .../admin/dto/RestrictedUserSearchResponse.java | 1 + .../solidconnection/admin/dto/UnivApplyInfoResponse.java | 1 + .../solidconnection/admin/dto/UserInfoDetailResponse.java | 3 ++- .../solidconnection/admin/dto/UserSearchCondition.java | 1 + .../solidconnection/admin/dto/UserSearchResponse.java | 1 + .../solidconnection/admin/service/AdminUserService.java | 2 -- .../siteuser/repository/custom/SiteUserFilterRepository.java | 1 - .../solidconnection/admin/service/AdminUserServiceTest.java | 4 ++-- 18 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/example/solidconnection/admin/controller/AdminUserController.java b/src/main/java/com/example/solidconnection/admin/controller/AdminUserController.java index 930f05493..841ef901e 100644 --- a/src/main/java/com/example/solidconnection/admin/controller/AdminUserController.java +++ b/src/main/java/com/example/solidconnection/admin/controller/AdminUserController.java @@ -8,7 +8,6 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; - import com.example.solidconnection.admin.dto.RestrictedUserInfoDetailResponse; import com.example.solidconnection.admin.dto.RestrictedUserSearchCondition; import com.example.solidconnection.admin.dto.RestrictedUserSearchResponse; @@ -17,7 +16,6 @@ import com.example.solidconnection.admin.dto.UserSearchResponse; import com.example.solidconnection.admin.service.AdminUserService; import com.example.solidconnection.common.response.PageResponse; - import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -43,7 +41,6 @@ public ResponseEntity getUserInfoDetail( ) { UserInfoDetailResponse response = adminUserService.getUserInfoDetail(userId); return ResponseEntity.ok(response); - } @GetMapping("/restricted") @@ -61,6 +58,5 @@ public ResponseEntity getRestrictedUserInfoDet ) { RestrictedUserInfoDetailResponse response = adminUserService.getRestrictedUserInfoDetail(userId); return ResponseEntity.ok(response); - } } diff --git a/src/main/java/com/example/solidconnection/admin/dto/BannedHistoryResponse.java b/src/main/java/com/example/solidconnection/admin/dto/BannedHistoryResponse.java index b5ca6645e..de3ab7a53 100644 --- a/src/main/java/com/example/solidconnection/admin/dto/BannedHistoryResponse.java +++ b/src/main/java/com/example/solidconnection/admin/dto/BannedHistoryResponse.java @@ -5,4 +5,5 @@ public record BannedHistoryResponse( ZonedDateTime createdAt ) { + } diff --git a/src/main/java/com/example/solidconnection/admin/dto/BannedInfoResponse.java b/src/main/java/com/example/solidconnection/admin/dto/BannedInfoResponse.java index 134ca3ffd..1228fff73 100644 --- a/src/main/java/com/example/solidconnection/admin/dto/BannedInfoResponse.java +++ b/src/main/java/com/example/solidconnection/admin/dto/BannedInfoResponse.java @@ -6,4 +6,5 @@ public record BannedInfoResponse( boolean isBanned, UserBanDuration duration ) { + } diff --git a/src/main/java/com/example/solidconnection/admin/dto/MatchedInfoResponse.java b/src/main/java/com/example/solidconnection/admin/dto/MatchedInfoResponse.java index 7696b1201..d3b5c6f68 100644 --- a/src/main/java/com/example/solidconnection/admin/dto/MatchedInfoResponse.java +++ b/src/main/java/com/example/solidconnection/admin/dto/MatchedInfoResponse.java @@ -6,4 +6,5 @@ public record MatchedInfoResponse( String nickname, ZonedDateTime matchedDate ) { + } diff --git a/src/main/java/com/example/solidconnection/admin/dto/MenteeInfoResponse.java b/src/main/java/com/example/solidconnection/admin/dto/MenteeInfoResponse.java index e48ea897b..6db2b61ae 100644 --- a/src/main/java/com/example/solidconnection/admin/dto/MenteeInfoResponse.java +++ b/src/main/java/com/example/solidconnection/admin/dto/MenteeInfoResponse.java @@ -6,4 +6,5 @@ public record MenteeInfoResponse( UnivApplyInfoResponse univApplyInfos, List mentorInfos ) { + } diff --git a/src/main/java/com/example/solidconnection/admin/dto/MentorInfoResponse.java b/src/main/java/com/example/solidconnection/admin/dto/MentorInfoResponse.java index 2e4db415a..bd3dad8d5 100644 --- a/src/main/java/com/example/solidconnection/admin/dto/MentorInfoResponse.java +++ b/src/main/java/com/example/solidconnection/admin/dto/MentorInfoResponse.java @@ -6,4 +6,5 @@ public record MentorInfoResponse( List menteeInfos, List mentorApplicationHistory ) { + } diff --git a/src/main/java/com/example/solidconnection/admin/dto/ReportedHistoryResponse.java b/src/main/java/com/example/solidconnection/admin/dto/ReportedHistoryResponse.java index a45ae5e27..d7fbaa94c 100644 --- a/src/main/java/com/example/solidconnection/admin/dto/ReportedHistoryResponse.java +++ b/src/main/java/com/example/solidconnection/admin/dto/ReportedHistoryResponse.java @@ -8,4 +8,5 @@ public record ReportedHistoryResponse( ZonedDateTime reportedDate, ReportType reportType ) { + } diff --git a/src/main/java/com/example/solidconnection/admin/dto/ReportedInfoResponse.java b/src/main/java/com/example/solidconnection/admin/dto/ReportedInfoResponse.java index 00a2748f5..95d7f20a3 100644 --- a/src/main/java/com/example/solidconnection/admin/dto/ReportedInfoResponse.java +++ b/src/main/java/com/example/solidconnection/admin/dto/ReportedInfoResponse.java @@ -10,4 +10,5 @@ public record ReportedInfoResponse( TargetType targetType, ReportType reportType ) { + } diff --git a/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserInfoDetailResponse.java b/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserInfoDetailResponse.java index b025adf7f..1c9cc40bb 100644 --- a/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserInfoDetailResponse.java +++ b/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserInfoDetailResponse.java @@ -3,7 +3,8 @@ import java.util.List; public record RestrictedUserInfoDetailResponse( - List reportedHistoryResponses, // ACTIVE 유저일 경우 빈 리스트 - List bannedHistoryResponses // ACTIVE, REPORTED 유저일 경우 빈 리스트 + List reportedHistoryResponses, + List bannedHistoryResponses ) { + } diff --git a/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserSearchCondition.java b/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserSearchCondition.java index 23f356cd1..2f9db3309 100644 --- a/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserSearchCondition.java +++ b/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserSearchCondition.java @@ -8,4 +8,5 @@ public record RestrictedUserSearchCondition( UserStatus userStatus, String keyword ) { + } diff --git a/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserSearchResponse.java b/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserSearchResponse.java index 7994f48ca..ee0cfd773 100644 --- a/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserSearchResponse.java +++ b/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserSearchResponse.java @@ -10,4 +10,5 @@ public record RestrictedUserSearchResponse( ReportedInfoResponse reportedInfoResponse, BannedInfoResponse bannedInfoResponse ) { + } diff --git a/src/main/java/com/example/solidconnection/admin/dto/UnivApplyInfoResponse.java b/src/main/java/com/example/solidconnection/admin/dto/UnivApplyInfoResponse.java index b4c0d3d6b..225991d64 100644 --- a/src/main/java/com/example/solidconnection/admin/dto/UnivApplyInfoResponse.java +++ b/src/main/java/com/example/solidconnection/admin/dto/UnivApplyInfoResponse.java @@ -5,4 +5,5 @@ public record UnivApplyInfoResponse( String secondChoiceUnivName, String thirdChoiceUnivName ) { + } diff --git a/src/main/java/com/example/solidconnection/admin/dto/UserInfoDetailResponse.java b/src/main/java/com/example/solidconnection/admin/dto/UserInfoDetailResponse.java index b6b833319..9c2dd637d 100644 --- a/src/main/java/com/example/solidconnection/admin/dto/UserInfoDetailResponse.java +++ b/src/main/java/com/example/solidconnection/admin/dto/UserInfoDetailResponse.java @@ -5,6 +5,7 @@ public record UserInfoDetailResponse( MentorInfoResponse mentorInfoResponse, // 멘티일 경우 null MenteeInfoResponse menteeInfoResponse, // 멘토일 경우 null - List reportedHistoryResponses // ACTIVE 유저일 경우 빈 리스트 + List reportedHistoryResponses ) { + } diff --git a/src/main/java/com/example/solidconnection/admin/dto/UserSearchCondition.java b/src/main/java/com/example/solidconnection/admin/dto/UserSearchCondition.java index 66778f4d5..9d6bc1bd8 100644 --- a/src/main/java/com/example/solidconnection/admin/dto/UserSearchCondition.java +++ b/src/main/java/com/example/solidconnection/admin/dto/UserSearchCondition.java @@ -6,4 +6,5 @@ public record UserSearchCondition( Role role, String keyword ) { + } diff --git a/src/main/java/com/example/solidconnection/admin/dto/UserSearchResponse.java b/src/main/java/com/example/solidconnection/admin/dto/UserSearchResponse.java index 0674e1a18..f2352d186 100644 --- a/src/main/java/com/example/solidconnection/admin/dto/UserSearchResponse.java +++ b/src/main/java/com/example/solidconnection/admin/dto/UserSearchResponse.java @@ -9,4 +9,5 @@ public record UserSearchResponse( Role role, UserStatus userStatus ) { + } diff --git a/src/main/java/com/example/solidconnection/admin/service/AdminUserService.java b/src/main/java/com/example/solidconnection/admin/service/AdminUserService.java index 2289a58d1..e7ef7b538 100644 --- a/src/main/java/com/example/solidconnection/admin/service/AdminUserService.java +++ b/src/main/java/com/example/solidconnection/admin/service/AdminUserService.java @@ -6,7 +6,6 @@ import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; - import com.example.solidconnection.admin.dto.RestrictedUserInfoDetailResponse; import com.example.solidconnection.admin.dto.RestrictedUserSearchCondition; import com.example.solidconnection.admin.dto.RestrictedUserSearchResponse; @@ -17,7 +16,6 @@ import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.repository.SiteUserRepository; import com.example.solidconnection.siteuser.repository.custom.SiteUserFilterRepository; - import lombok.RequiredArgsConstructor; @RequiredArgsConstructor diff --git a/src/main/java/com/example/solidconnection/siteuser/repository/custom/SiteUserFilterRepository.java b/src/main/java/com/example/solidconnection/siteuser/repository/custom/SiteUserFilterRepository.java index f78cfe6fe..1edc2539f 100644 --- a/src/main/java/com/example/solidconnection/siteuser/repository/custom/SiteUserFilterRepository.java +++ b/src/main/java/com/example/solidconnection/siteuser/repository/custom/SiteUserFilterRepository.java @@ -2,7 +2,6 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; - import com.example.solidconnection.admin.dto.RestrictedUserInfoDetailResponse; import com.example.solidconnection.admin.dto.RestrictedUserSearchCondition; import com.example.solidconnection.admin.dto.RestrictedUserSearchResponse; diff --git a/src/test/java/com/example/solidconnection/admin/service/AdminUserServiceTest.java b/src/test/java/com/example/solidconnection/admin/service/AdminUserServiceTest.java index 2085a4262..ec73c3468 100644 --- a/src/test/java/com/example/solidconnection/admin/service/AdminUserServiceTest.java +++ b/src/test/java/com/example/solidconnection/admin/service/AdminUserServiceTest.java @@ -35,7 +35,7 @@ import com.example.solidconnection.support.TestContainerSpringBootTest; import com.example.solidconnection.term.fixture.TermFixture; import com.example.solidconnection.university.domain.UnivApplyInfo; -import com.example.solidconnection.university.domain.University; +import com.example.solidconnection.university.domain.HostUniversity; import com.example.solidconnection.university.fixture.UnivApplyInfoFixture; import com.example.solidconnection.university.fixture.UniversityFixture; import org.junit.jupiter.api.DisplayName; @@ -213,7 +213,7 @@ class 유저_상세_정보_조회 { void 멘토_유저_상세_정보를_조회한다() { // given SiteUser mentorUser = siteUserFixture.멘토(1, "멘토유저"); - University university = universityFixture.괌_대학(); + HostUniversity university = universityFixture.괌_대학(); Mentor mentor = mentorFixture.멘토(mentorUser.getId(), university.getId()); mentorApplicationFixture.승인된_멘토신청(