Skip to content

Commit 28594a7

Browse files
committed
feat: 어드민 유저 관리 기능
- Report, UserBan 컬럼 수정
1 parent b17a36b commit 28594a7

File tree

13 files changed

+75
-48
lines changed

13 files changed

+75
-48
lines changed

src/main/java/com/example/solidconnection/admin/service/AdminUserBanService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ private void validateNotAlreadyBanned(long userId, ZonedDateTime now) {
5252
}
5353

5454
private void validateReportExists(long userId) {
55-
if (!reportRepository.existsReportByUserId(userId)) {
55+
if (!reportRepository.existsByReportedId(userId)) {
5656
throw new CustomException(ErrorCode.REPORT_NOT_FOUND);
5757
}
5858
}
@@ -64,7 +64,7 @@ private void updateReportedContentIsDeleted(long userId, boolean isDeleted) {
6464

6565
private void createUserBan(long userId, UserBanRequest request, ZonedDateTime now) {
6666
ZonedDateTime expiredAt = now.plusDays(request.duration().getDays());
67-
UserBan userBan = new UserBan(userId, expiredAt);
67+
UserBan userBan = new UserBan(userId, request.duration(), expiredAt);
6868
userBanRepository.save(userBan);
6969
}
7070

src/main/java/com/example/solidconnection/report/domain/Report.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ public class Report extends BaseEntity {
3333
@Column(name = "reporter_id")
3434
private long reporterId;
3535

36+
@Column(name = "reported_id")
37+
private long reportedId;
38+
3639
@Column(name = "report_type")
3740
@Enumerated(value = EnumType.STRING)
3841
private ReportType reportType;
@@ -44,9 +47,10 @@ public class Report extends BaseEntity {
4447
@Column(name = "target_id")
4548
private long targetId;
4649

47-
public Report(long reporterId, ReportType reportType, TargetType targetType, long targetId) {
50+
public Report(long reporterId, long reportedId, ReportType reportType, TargetType targetType, long targetId) {
4851
this.reportType = reportType;
4952
this.reporterId = reporterId;
53+
this.reportedId = reportedId;
5054
this.targetType = targetType;
5155
this.targetId = targetId;
5256
}

src/main/java/com/example/solidconnection/report/repository/ReportRepository.java

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,5 @@ public interface ReportRepository extends JpaRepository<Report, Long> {
1010

1111
boolean existsByReporterIdAndTargetTypeAndTargetId(long reporterId, TargetType targetType, long targetId);
1212

13-
@Query("""
14-
SELECT CASE WHEN COUNT(r) > 0 THEN true ELSE false END
15-
FROM Report r
16-
WHERE (r.targetType = 'POST' AND EXISTS (
17-
SELECT 1 FROM Post p WHERE p.id = r.targetId AND p.siteUserId = :userId
18-
))
19-
OR (r.targetType = 'CHAT' AND EXISTS (
20-
SELECT 1 FROM ChatMessage cm
21-
JOIN ChatParticipant cp ON cp.id = cm.senderId
22-
WHERE cm.id = r.targetId AND cp.siteUserId = :userId
23-
))
24-
""")
25-
boolean existsReportByUserId(@Param("userId") long userId);
13+
boolean existsByReportedId(long reportedId);
2614
}

src/main/java/com/example/solidconnection/report/service/ReportService.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,19 +31,24 @@ public class ReportService {
3131

3232
@Transactional
3333
public void createReport(long reporterId, ReportRequest request) {
34-
validateReporterExists(reporterId);
34+
long reportedId = findReportedId(request.targetType(), request.targetId());
35+
validateReporterAndReportedExists(reporterId, reportedId);
3536
validateTargetExists(request.targetType(), request.targetId());
3637
validateFirstReportByUser(reporterId, request.targetType(), request.targetId());
37-
updateReportedUserStatus(request.targetType(), request.targetId());
38+
updateUserStatusToReported(reportedId);
3839

39-
Report report = new Report(reporterId, request.reportType(), request.targetType(), request.targetId());
40+
Report report = new Report(reporterId, reportedId, request.reportType(), request.targetType(), request.targetId());
4041
reportRepository.save(report);
4142
}
4243

43-
private void validateReporterExists(long reporterId) {
44+
private void validateReporterAndReportedExists(long reporterId, long reportedId) {
4445
if (!siteUserRepository.existsById(reporterId)) {
4546
throw new CustomException(ErrorCode.USER_NOT_FOUND);
4647
}
48+
49+
if (!siteUserRepository.existsById(reportedId)) {
50+
throw new CustomException(ErrorCode.USER_NOT_FOUND);
51+
}
4752
}
4853

4954
private void validateTargetExists(TargetType targetType, long targetId) {
@@ -63,12 +68,7 @@ private void validateFirstReportByUser(long reporterId, TargetType targetType, l
6368
}
6469
}
6570

66-
private void updateReportedUserStatus(TargetType targetType, long targetId) {
67-
long targetUserId = findTargetUserId(targetType, targetId);
68-
updateUserStatusToReported(targetUserId);
69-
}
70-
71-
private long findTargetUserId(TargetType targetType, long targetId) {
71+
private long findReportedId(TargetType targetType, long targetId) {
7272
return switch (targetType) {
7373
case POST -> findPostAuthorId(targetId);
7474
case CHAT -> findChatMessageSenderId(targetId);

src/main/java/com/example/solidconnection/siteuser/domain/UserBan.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ public class UserBan extends BaseEntity {
2323
@Column(name = "banned_user_id", nullable = false)
2424
private Long bannedUserId;
2525

26+
@Column(name = "duration", nullable = false)
27+
@Enumerated(EnumType.STRING)
28+
private UserBanDuration duration;
29+
2630
@Column(name = "expired_at", nullable = false)
2731
private ZonedDateTime expiredAt;
2832

@@ -35,8 +39,9 @@ public class UserBan extends BaseEntity {
3539
@Column(name = "unbanned_at")
3640
private ZonedDateTime unbannedAt;
3741

38-
public UserBan(Long bannedUserId, ZonedDateTime expiredAt) {
42+
public UserBan(Long bannedUserId, UserBanDuration duration, ZonedDateTime expiredAt) {
3943
this.bannedUserId = bannedUserId;
44+
this.duration = duration;
4045
this.expiredAt = expiredAt;
4146
}
4247

src/main/resources/db/migration/V40__create_user_ban_table.sql

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ CREATE TABLE user_ban
22
(
33
id BIGINT NOT NULL AUTO_INCREMENT,
44
banned_user_id BIGINT NOT NULL,
5+
duration VARCHAR(30) NOT NULL,
56
expired_at DATETIME(6) NOT NULL,
67
is_unbanned TINYINT(1) NOT NULL DEFAULT 0,
78
unbanned_by BIGINT NULL,
@@ -14,4 +15,7 @@ CREATE TABLE user_ban
1415
);
1516

1617
ALTER TABLE site_user
17-
ADD COLUMN user_status VARCHAR(50) NOT NULL DEFAULT 'ACTIVE';
18+
ADD COLUMN user_status VARCHAR(10) NOT NULL DEFAULT 'ACTIVE';
19+
20+
ALTER TABLE report
21+
ADD COLUMN reported_id BIGINT;

src/test/java/com/example/solidconnection/admin/service/AdminUserBanServiceTest.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ class AdminUserBanServiceTest {
6868
@BeforeEach
6969
void setUp() {
7070
admin = siteUserFixture.관리자();
71-
reportedUser = siteUserFixture.사용자(1, "신고당한유저");
71+
reportedUser = siteUserFixture.신고된_사용자("신고된사용자");
7272
reporter = siteUserFixture.사용자(2, "신고자");
7373
reportedPost = postFixture.게시글(
7474
"신고될 게시글",
@@ -87,7 +87,7 @@ class 사용자_차단 {
8787
@Test
8888
void 사용자를_차단한다() {
8989
// given
90-
reportFixture.신고(reporter.getId(), TargetType.POST, reportedPost.getId());
90+
reportFixture.신고(reporter.getId(), reportedUser.getId(), TargetType.POST, reportedPost.getId());
9191
UserBanRequest request = new UserBanRequest(UserBanDuration.SEVEN_DAYS);
9292

9393
// when
@@ -101,7 +101,7 @@ class 사용자_차단 {
101101
@Test
102102
void 이미_차단된_사용자는_다시_차단할_수_없다() {
103103
// given
104-
reportFixture.신고(reporter.getId(), TargetType.POST, reportedPost.getId());
104+
reportFixture.신고(reporter.getId(), reportedUser.getId(), TargetType.POST, reportedPost.getId());
105105
UserBanRequest request = new UserBanRequest(UserBanDuration.SEVEN_DAYS);
106106
adminUserBanService.banUser(reportedUser.getId(), request);
107107

@@ -129,7 +129,7 @@ class 사용자_차단_해제 {
129129
@Test
130130
void 차단된_사용자를_수동으로_해제한다() {
131131
// given
132-
reportFixture.신고(reporter.getId(), TargetType.POST, reportedPost.getId());
132+
reportFixture.신고(reporter.getId(), reportedUser.getId(), TargetType.POST, reportedPost.getId());
133133
UserBanRequest request = new UserBanRequest(UserBanDuration.SEVEN_DAYS);
134134
adminUserBanService.banUser(reportedUser.getId(), request);
135135

@@ -144,7 +144,7 @@ class 사용자_차단_해제 {
144144
@Test
145145
void 차단_해제_정보가_올바르게_저장된다() {
146146
// given
147-
reportFixture.신고(reporter.getId(), TargetType.POST, reportedPost.getId());
147+
reportFixture.신고(reporter.getId(), reportedUser.getId(), TargetType.POST, reportedPost.getId());
148148
UserBanRequest request = new UserBanRequest(UserBanDuration.SEVEN_DAYS);
149149
adminUserBanService.banUser(reportedUser.getId(), request);
150150
ZonedDateTime beforeUnban = ZonedDateTime.now();
@@ -229,7 +229,7 @@ class 만료된_차단_자동_해제 {
229229
boardFixture.자유게시판(),
230230
reportedUser
231231
);
232-
reportFixture.신고(reporter.getId(), TargetType.POST, reportedPost.getId());
232+
reportFixture.신고(reporter.getId(), reportedUser.getId(), TargetType.POST, reportedPost.getId());
233233
adminUserBanService.banUser(reportedUser.getId(), new UserBanRequest(UserBanDuration.SEVEN_DAYS));
234234

235235
// when
@@ -261,4 +261,4 @@ class 만료된_차단_자동_해제 {
261261
}
262262
}
263263
}
264-
}
264+
}

src/test/java/com/example/solidconnection/report/fixture/ReportFixture.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@ public class ReportFixture {
1111

1212
private final ReportFixtureBuilder reportFixtureBuilder;
1313

14-
public Report 신고(long reporterId, TargetType targetType, long targetId) {
14+
public Report 신고(long reporterId, long reportedId, TargetType targetType, long targetId) {
1515
return reportFixtureBuilder.report()
1616
.reporterId(reporterId)
17+
.reportedId(reportedId)
1718
.targetType(targetType)
1819
.targetId(targetId)
1920
.create();

src/test/java/com/example/solidconnection/report/fixture/ReportFixtureBuilder.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public class ReportFixtureBuilder {
1414
private final ReportRepository reportRepository;
1515

1616
private long reporterId;
17+
private long reportedId;
1718
private TargetType targetType;
1819
private long targetId;
1920
private ReportType reportType = ReportType.ADVERTISEMENT;
@@ -27,6 +28,11 @@ public ReportFixtureBuilder reporterId(long reporterId) {
2728
return this;
2829
}
2930

31+
public ReportFixtureBuilder reportedId(long reportedId) {
32+
this.reportedId = reportedId;
33+
return this;
34+
}
35+
3036
public ReportFixtureBuilder targetType(TargetType targetType) {
3137
this.targetType = targetType;
3238
return this;
@@ -45,6 +51,7 @@ public ReportFixtureBuilder reasonType(ReportType reportType) {
4551
public Report create() {
4652
Report report = new Report(
4753
reporterId,
54+
reportedId,
4855
reportType,
4956
targetType,
5057
targetId

src/test/java/com/example/solidconnection/report/service/ReportServiceTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,14 @@ class ReportServiceTest {
6161
private ChatMessageFixture chatMessageFixture;
6262

6363
private SiteUser siteUser;
64+
private SiteUser reportedUser;
6465
private Post post;
6566
private ChatMessage chatMessage;
6667

6768
@BeforeEach
6869
void setUp() {
6970
siteUser = siteUserFixture.사용자();
71+
reportedUser = siteUserFixture.신고된_사용자("신고된사용자");
7072
Board board = boardFixture.자유게시판();
7173
post = postFixture.게시글(board, siteUser);
7274
ChatRoom chatRoom = chatRoomFixture.채팅방(false);
@@ -106,7 +108,7 @@ class 포스트_신고 {
106108
@Test
107109
void 이미_신고한_경우_예외가_발생한다() {
108110
// given
109-
reportFixture.신고(siteUser.getId(), TargetType.POST, post.getId());
111+
reportFixture.신고(siteUser.getId(), reportedUser.getId(), TargetType.POST, post.getId());
110112
ReportRequest request = new ReportRequest(ReportType.INSULT, TargetType.POST, post.getId());
111113

112114
// when & then
@@ -148,7 +150,7 @@ class 채팅_신고 {
148150
@Test
149151
void 이미_신고한_경우_예외가_발생한다() {
150152
// given
151-
reportFixture.신고(siteUser.getId(), TargetType.CHAT, chatMessage.getId());
153+
reportFixture.신고(siteUser.getId(), reportedUser.getId(), TargetType.CHAT, chatMessage.getId());
152154
ReportRequest request = new ReportRequest(ReportType.INSULT, TargetType.CHAT, chatMessage.getId());
153155

154156
// when & then

0 commit comments

Comments
 (0)