Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
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;

@RequiredArgsConstructor
@RequestMapping("/admin/users")
@RestController
public class AdminUserController {

private final AdminUserService adminUserService;

@GetMapping
public ResponseEntity<PageResponse<UserSearchResponse>> searchAllUsers(
@Valid @ModelAttribute UserSearchCondition searchCondition,
Pageable pageable
) {
Page<UserSearchResponse> page = adminUserService.searchAllUsers(searchCondition, pageable);
return ResponseEntity.ok(PageResponse.of(page));
}

@GetMapping("/{user-id}")
public ResponseEntity<UserInfoDetailResponse> getUserInfoDetail(
@PathVariable(name = "user-id") long userId
) {
UserInfoDetailResponse response = adminUserService.getUserInfoDetail(userId);
return ResponseEntity.ok(response);
}

@GetMapping("/restricted")
public ResponseEntity<PageResponse<RestrictedUserSearchResponse>> searchRestrictedUsers(
@Valid @ModelAttribute RestrictedUserSearchCondition searchCondition,
Pageable pageable
) {
Page<RestrictedUserSearchResponse> page = adminUserService.searchRestrictedUsers(searchCondition, pageable);
return ResponseEntity.ok(PageResponse.of(page));
}

@GetMapping("/restricted/{user-id}")
public ResponseEntity<RestrictedUserInfoDetailResponse> getRestrictedUserInfoDetail(
@PathVariable(name = "user-id") long userId
) {
RestrictedUserInfoDetailResponse response = adminUserService.getRestrictedUserInfoDetail(userId);
return ResponseEntity.ok(response);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.example.solidconnection.admin.dto;

import java.time.ZonedDateTime;

public record BannedHistoryResponse(
ZonedDateTime createdAt
) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.example.solidconnection.admin.dto;

import com.example.solidconnection.siteuser.domain.UserBanDuration;
import com.fasterxml.jackson.annotation.JsonProperty;

public record BannedInfoResponse(
@JsonProperty("isBanned") boolean isBanned,
UserBanDuration duration
) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.example.solidconnection.admin.dto;

import java.time.ZonedDateTime;

public record MatchedInfoResponse(
String nickname,
ZonedDateTime matchedDate
) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.example.solidconnection.admin.dto;

import java.util.List;

public record MenteeInfoResponse(
UnivApplyInfoResponse univApplyInfo,
List<MatchedInfoResponse> mentorInfos
) {

}
Original file line number Diff line number Diff line change
@@ -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
) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.example.solidconnection.admin.dto;

import java.util.List;

public record MentorInfoResponse(
List<MatchedInfoResponse> menteeInfos,
List<MentorApplicationHistoryInfoResponse> mentorApplicationHistory
) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.example.solidconnection.admin.dto;

import java.time.ZonedDateTime;

import com.example.solidconnection.report.domain.ReportType;

public record ReportedHistoryResponse(
ZonedDateTime reportedDate,
ReportType reportType
) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
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
) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.example.solidconnection.admin.dto;

import java.util.List;

public record RestrictedUserInfoDetailResponse(
List<ReportedHistoryResponse> reportedHistoryResponses,
List<BannedHistoryResponse> bannedHistoryResponses
) {

}
Original file line number Diff line number Diff line change
@@ -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 RestrictedUserSearchCondition(
Role role,
UserStatus userStatus,
String keyword
) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.example.solidconnection.admin.dto;

import com.example.solidconnection.siteuser.domain.Role;
import com.example.solidconnection.siteuser.domain.UserStatus;

public record RestrictedUserSearchResponse(
Long id,
String nickname,
Role role,
UserStatus userStatus,
ReportedInfoResponse reportedInfoResponse,
BannedInfoResponse bannedInfoResponse
) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.example.solidconnection.admin.dto;

public record UnivApplyInfoResponse(
String firstChoiceUnivName,
String secondChoiceUnivName,
String thirdChoiceUnivName
) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.example.solidconnection.admin.dto;

import java.util.List;

public record UserInfoDetailResponse(
MentorInfoResponse mentorInfoResponse, // 멘티일 경우 null
MenteeInfoResponse menteeInfoResponse, // 멘토일 경우 null
List<ReportedHistoryResponse> reportedHistoryResponses
) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.example.solidconnection.admin.dto;

import com.example.solidconnection.siteuser.domain.Role;

public record UserSearchCondition(
Role role,
String keyword
) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.example.solidconnection.admin.dto;

import com.example.solidconnection.siteuser.domain.Role;
import com.example.solidconnection.siteuser.domain.UserStatus;

public record UserSearchResponse(
Long id,
String nickname,
String email,
Role role,
UserStatus userStatus
) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.example.solidconnection.admin.service;

import static com.example.solidconnection.common.exception.ErrorCode.USER_NOT_FOUND;

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;

@Transactional(readOnly = true)
public Page<UserSearchResponse> searchAllUsers(UserSearchCondition searchCondition, Pageable pageable) {
return siteUserRepository.searchAllUsers(searchCondition, pageable);
}

@Transactional(readOnly = true)
public Page<RestrictedUserSearchResponse> searchRestrictedUsers(RestrictedUserSearchCondition searchCondition, Pageable pageable) {
return siteUserRepository.searchRestrictedUsers(searchCondition, pageable);
}

@Transactional(readOnly = true)
public UserInfoDetailResponse getUserInfoDetail(long userId) {
SiteUser siteUser = siteUserRepository.findById(userId)
.orElseThrow(() -> new CustomException(USER_NOT_FOUND));
return siteUserRepository.getUserInfoDetailByUserId(siteUser);
}

@Transactional(readOnly = true)
public RestrictedUserInfoDetailResponse getRestrictedUserInfoDetail(long userId) {
SiteUser siteUser = siteUserRepository.findById(userId)
.orElseThrow(() -> new CustomException(USER_NOT_FOUND));
return siteUserRepository.getRestrictedUserInfoDetail(siteUser.getId());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@
import java.time.LocalDate;
import java.util.List;
import java.util.Optional;

import com.example.solidconnection.siteuser.repository.custom.SiteUserFilterRepository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

public interface SiteUserRepository extends JpaRepository<SiteUser, Long> {
public interface SiteUserRepository extends JpaRepository<SiteUser, Long>, SiteUserFilterRepository {

Optional<SiteUser> findByEmailAndAuthType(String email, AuthType authType);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.example.solidconnection.siteuser.repository.custom;

import com.example.solidconnection.siteuser.domain.SiteUser;
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<UserSearchResponse> searchAllUsers(UserSearchCondition searchCondition, Pageable pageable);

Page<RestrictedUserSearchResponse> searchRestrictedUsers(RestrictedUserSearchCondition searchCondition, Pageable pageable);

UserInfoDetailResponse getUserInfoDetailByUserId(SiteUser user);

RestrictedUserInfoDetailResponse getRestrictedUserInfoDetail(long userId);
}
Loading
Loading