diff --git a/core/core-api/src/main/java/org/ject/recreation/core/api/controller/AdminController.java b/core/core-api/src/main/java/org/ject/recreation/core/api/controller/AdminController.java index 4c52750..f3eac99 100644 --- a/core/core-api/src/main/java/org/ject/recreation/core/api/controller/AdminController.java +++ b/core/core-api/src/main/java/org/ject/recreation/core/api/controller/AdminController.java @@ -3,6 +3,7 @@ import lombok.extern.slf4j.Slf4j; import org.ject.recreation.core.api.controller.request.BlockUserRequestDto; import org.ject.recreation.core.api.controller.request.GameDeleteRequestDto; +import org.ject.recreation.core.api.controller.response.GameListResponseDto; import org.ject.recreation.core.api.controller.response.GetAllUserResponseDto; import org.ject.recreation.core.api.controller.response.ReportGameDetailResponseDto; import org.ject.recreation.core.api.controller.response.ReportGameResponseDto; @@ -28,6 +29,7 @@ public ApiResponse> getReportGames( return ApiResponse.success(adminService.getReportedGames(page)); } + // report 상세 내역 조회 @GetMapping("games/{reportId}") public ApiResponse getReportGame( @PathVariable Long reportId @@ -40,8 +42,16 @@ public ApiResponse deleteReportGame(@RequestBody GameDeleteRequestDto game return ApiResponse.success(adminService.deleteReportedDetailGames(gameDeleteRequestDto)); } + + @GetMapping("games/admin") + public ApiResponse> getAdminGames( + @RequestParam(defaultValue = "0") int page + ) { + return ApiResponse.success(adminService.getAdminGames(page)); + } + @GetMapping("/users") - public ApiResponse> getUsers( + public ApiResponse> getUsers( @RequestParam(defaultValue = "0") int page ) { return ApiResponse.success(adminService.getAllUsers(page)); @@ -53,7 +63,7 @@ public ApiResponse blockUser(@RequestBody BlockUserRequestDto blockUserReq } @PostMapping("/users/unblock") - public ApiResponse unBlockUser(@RequestBody BlockUserRequestDto blockUserRequestDto){ + public ApiResponse unBlockUser(@RequestBody BlockUserRequestDto blockUserRequestDto) { return ApiResponse.success(adminService.unBlockUser(blockUserRequestDto)); } } diff --git a/core/core-api/src/main/java/org/ject/recreation/core/api/controller/response/ReportGameDetailResponseDto.java b/core/core-api/src/main/java/org/ject/recreation/core/api/controller/response/ReportGameDetailResponseDto.java index e51592c..40f898a 100644 --- a/core/core-api/src/main/java/org/ject/recreation/core/api/controller/response/ReportGameDetailResponseDto.java +++ b/core/core-api/src/main/java/org/ject/recreation/core/api/controller/response/ReportGameDetailResponseDto.java @@ -17,17 +17,21 @@ public class ReportGameDetailResponseDto { private String gameTitle; private String makerNickname; private String makerEmail; + private boolean isMakerBlock; + private ReportStatus status; private int questionCount; private long version; - private List qustions; + private List questions; private String reporterEmail; private String reporterNickname; + private boolean isReporterBlock; private GameReportReason reasonCode; public static ReportGameDetailResponseDto from(ReportEntity reportEntity) { GameEntity game = reportEntity.getGame(); UserEntity gameCreator = game.getGameCreator(); UserEntity reporter = reportEntity.getReporter(); + List questions = game.getQuestions(); ReportReason reason = reportEntity.getReason(); @@ -43,15 +47,21 @@ public static ReportGameDetailResponseDto from(ReportEntity reportEntity) { question.getVersion())) .toList(); + boolean isMakerBlock = gameCreator.getBlockReason() != null; + boolean isReporterBlock = reporter != null && reporter.getBlockReason() != null; + return ReportGameDetailResponseDto.builder() .gameTitle(game.getGameTitle()) .makerNickname(gameCreator.getNickname()) .makerEmail(gameCreator.getEmail()) + .isMakerBlock(isMakerBlock) + .status(reportEntity.getStatus()) .questionCount(game.getQuestionCount()) .version(game.getVersion()) - .qustions(list) + .questions(list) .reporterEmail(reporter != null ? reporter.getEmail() : null) .reporterNickname(reporter != null ? reporter.getNickname() : null) + .isReporterBlock(isReporterBlock) .reasonCode(gameReportReason) .build(); } diff --git a/core/core-api/src/main/java/org/ject/recreation/core/api/controller/session/SessionUserInfoDto.java b/core/core-api/src/main/java/org/ject/recreation/core/api/controller/session/SessionUserInfoDto.java index abe202f..2b6d79c 100644 --- a/core/core-api/src/main/java/org/ject/recreation/core/api/controller/session/SessionUserInfoDto.java +++ b/core/core-api/src/main/java/org/ject/recreation/core/api/controller/session/SessionUserInfoDto.java @@ -4,6 +4,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.AllArgsConstructor; +import org.ject.recreation.storage.db.core.UserRole; @Getter @NoArgsConstructor @@ -13,4 +14,5 @@ public class SessionUserInfoDto { private String email; private String nickname; private String profileImageUrl; + private UserRole role; } \ No newline at end of file diff --git a/core/core-api/src/main/java/org/ject/recreation/core/domain/SocialLoginService.java b/core/core-api/src/main/java/org/ject/recreation/core/domain/SocialLoginService.java index 088d0b2..4b9f19d 100644 --- a/core/core-api/src/main/java/org/ject/recreation/core/domain/SocialLoginService.java +++ b/core/core-api/src/main/java/org/ject/recreation/core/domain/SocialLoginService.java @@ -105,7 +105,7 @@ private SocialLoginResponseDto createResponse(UserEntity userEntity) { .email(userEntity.getEmail()) .nickname(userEntity.getNickname()) .profileImageUrl(imagePrefix + userEntity.getProfileImageUrl()) - .role(UserRole.USER) + .role(userEntity.getRole()) .build(); } } \ No newline at end of file diff --git a/core/core-api/src/main/java/org/ject/recreation/core/domain/admin/AdminService.java b/core/core-api/src/main/java/org/ject/recreation/core/domain/admin/AdminService.java index ef94cee..47dcb2e 100644 --- a/core/core-api/src/main/java/org/ject/recreation/core/domain/admin/AdminService.java +++ b/core/core-api/src/main/java/org/ject/recreation/core/domain/admin/AdminService.java @@ -3,6 +3,7 @@ import lombok.RequiredArgsConstructor; import org.ject.recreation.core.api.controller.request.BlockUserRequestDto; import org.ject.recreation.core.api.controller.request.GameDeleteRequestDto; +import org.ject.recreation.core.api.controller.response.GameListResponseDto; import org.ject.recreation.core.api.controller.response.GetAllUserResponseDto; import org.ject.recreation.core.api.controller.response.ReportGameDetailResponseDto; import org.ject.recreation.core.api.controller.response.ReportGameResponseDto; @@ -10,6 +11,7 @@ import org.ject.recreation.core.support.error.ErrorType; import org.ject.recreation.core.support.response.PageResponseDto; import org.ject.recreation.storage.db.core.*; +import org.springframework.context.support.BeanDefinitionDsl; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -27,9 +29,11 @@ public class AdminService { private final ReportRepository reportRepository; private final UserRepository userRepository; + private final GameRepository gameRepository; public PageResponseDto getReportedGames(int page) { Pageable pageable = PageRequest.of(page, 7); +// BeanDefinitionDsl.Role // return reportRepository.findAllForAdmin(pageable) // .map(ReportGameResponseDto::from); Page result = @@ -55,18 +59,41 @@ public Void deleteReportedDetailGames(GameDeleteRequestDto gameDeleteRequestDto) return null; } - public PageResponseDto getAllUsers(int page) { + public PageResponseDto getAllUsers(int page) { Pageable pageable = PageRequest.of(page, 7); - Page result = userRepository.findAll(pageable) - .map(userEntity -> { - // UserEntity를 UserInfoDto로 변환 - GetAllUserResponseDto.UserInfoDto userInfoDto = GetAllUserResponseDto.UserInfoDto.from(userEntity); - // 단일 UserInfoDto를 포함하는 리스트를 생성하여 GetAllUserResponseDto로 감쌈 - return new GetAllUserResponseDto(List.of(userInfoDto)); - }); +// Page result = userRepository.findAll(pageable) +// .map(userEntity -> { +// // UserEntity를 UserInfoDto로 변환 +// GetAllUserResponseDto.UserInfoDto userInfoDto = GetAllUserResponseDto.UserInfoDto.from(userEntity); +// // 단일 UserInfoDto를 포함하는 리스트를 생성하여 GetAllUserResponseDto로 감쌈 +// return new GetAllUserResponseDto(List.of(userInfoDto)); +// }); +// return PageResponseDto.of(result); + Page result = + userRepository.findAll(pageable) + .map(GetAllUserResponseDto.UserInfoDto::from); + return PageResponseDto.of(result); } + public PageResponseDto getAdminGames(int page) { + Pageable pageable = PageRequest.of(page, 7); +// return reportRepository.findAllForAdmin(pageable) +// .map(ReportGameResponseDto::from); + Page allByAdmin = gameRepository.findAllByAdmin(pageable); + Page list = allByAdmin.map(game -> + GameListResponseDto.GameDto.builder() + .gameId(game.getGameId()) + .gameThumbnailUrl(game.getGameThumbnailUrl()) + .gameTitle(game.getGameTitle()) + .questionCount(game.getQuestionCount()) + .playCount(game.getPlayCount()) + .updatedAt(game.getUpdatedAt()) + .build() + ); + return PageResponseDto.of(list); + } + public Void blockUser(BlockUserRequestDto blockUserRequestDto) { List emailList = blockUserRequestDto.getBanList().stream() .map(BlockUserRequestDto.UserBanItem::getEmail) diff --git a/core/core-api/src/main/java/org/ject/recreation/core/domain/game/Game.java b/core/core-api/src/main/java/org/ject/recreation/core/domain/game/Game.java index 98e74ee..52d49d7 100644 --- a/core/core-api/src/main/java/org/ject/recreation/core/domain/game/Game.java +++ b/core/core-api/src/main/java/org/ject/recreation/core/domain/game/Game.java @@ -1,6 +1,7 @@ package org.ject.recreation.core.domain.game; import org.ject.recreation.storage.db.core.GameEntity; +import org.ject.recreation.storage.db.core.UserRole; import java.time.LocalDateTime; import java.util.UUID; @@ -21,10 +22,15 @@ public record Game( LocalDateTime deletedAt ) { public static Game from(GameEntity game) { + String nickname = + game.getGameCreator().getRole() == UserRole.ADMIN + ? "게임마스터" + : game.getGameCreator().getNickname(); + return new Game( game.getGameId(), game.getGameCreator().getEmail(), - game.getGameCreator().getNickname(), + nickname, game.getGameTitle(), game.getGameThumbnailUrl(), game.isShared(), diff --git a/storage/db-core/src/main/java/org/ject/recreation/storage/db/core/GameRepository.java b/storage/db-core/src/main/java/org/ject/recreation/storage/db/core/GameRepository.java index 62afd74..40c18dd 100644 --- a/storage/db-core/src/main/java/org/ject/recreation/storage/db/core/GameRepository.java +++ b/storage/db-core/src/main/java/org/ject/recreation/storage/db/core/GameRepository.java @@ -1,5 +1,6 @@ package org.ject.recreation.storage.db.core; +import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -50,4 +51,8 @@ List findGamesWithEmailAndCursor( // 기본 게임들을 조회하는 메서드 List findAllByGameCreatorEmailAndIsDeletedFalse(String gameCreatorEmail); + + @Query(value = "SELECT g FROM GameEntity g JOIN g.gameCreator u WHERE u.role = 'ADMIN'", + countQuery = "SELECT count(g) FROM GameEntity g JOIN g.gameCreator u WHERE u.role = 'ADMIN'") + Page findAllByAdmin( Pageable pageable); }