Skip to content

Commit 1daf543

Browse files
committed
feat(group): report group with report type and reason
1 parent be1899c commit 1daf543

6 files changed

Lines changed: 51 additions & 26 deletions

File tree

src/main/kotlin/com/duckbox/controller/GroupController.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.duckbox.dto.OverallDetailDto
44
import com.duckbox.dto.group.GroupDetailDto
55
import com.duckbox.dto.group.GroupRegisterDto
66
import com.duckbox.dto.group.GroupUpdateDto
7+
import com.duckbox.dto.group.ReportRequestDto
78
import com.duckbox.security.JWTTokenProvider
89
import com.duckbox.service.GroupService
910
import org.springframework.http.ResponseEntity
@@ -72,9 +73,9 @@ class GroupController (
7273
}
7374

7475
@PostMapping("/api/v1/group/status")
75-
fun reportGroup(@RequestHeader httpHeaders: Map<String, String>, @RequestBody groupId: String): ResponseEntity<Unit> {
76+
fun reportGroup(@RequestHeader httpHeaders: Map<String, String>, @RequestBody reportRequestDto: ReportRequestDto): ResponseEntity<Unit> {
7677
val userEmail: String = jwtTokenProvider.getUserPK(jwtTokenProvider.getTokenFromHeader(httpHeaders)!!)
77-
groupService.reportGroup(userEmail, groupId)
78+
groupService.reportGroup(userEmail, reportRequestDto)
7879
return ResponseEntity.noContent().build()
7980
}
8081

src/main/kotlin/com/duckbox/domain/group/GroupEntity.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class GroupEntity (
1515
var description: String,
1616
var profile: ObjectId? = null, // image
1717
var header: ObjectId? = null, // image
18-
var reported: MutableList<String>, // did list who reported this group (limit: 5)
18+
var reported: MutableMap<String, Report>, // did who reported this group (limit: 5)
1919
) {
2020
fun toGroupDetailDto(_profile: ByteArray?, _header: ByteArray?): GroupDetailDto {
2121
return GroupDetailDto(
@@ -32,3 +32,8 @@ enum class GroupStatus {
3232
DELETED, // [삭제된]
3333
REPORTED, // [신고된]
3434
}
35+
36+
data class Report (
37+
val reportType: Int,
38+
val reason: String,
39+
)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.duckbox.dto.group
2+
3+
data class ReportRequestDto (
4+
val groupId: String, // ObjectId
5+
val reportType: Int,
6+
val reason: String,
7+
)

src/main/kotlin/com/duckbox/service/GroupService.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.duckbox.service
33
import com.duckbox.domain.group.GroupEntity
44
import com.duckbox.domain.group.GroupRepository
55
import com.duckbox.domain.group.GroupStatus
6+
import com.duckbox.domain.group.Report
67
import com.duckbox.domain.survey.SurveyRepository
78
import com.duckbox.domain.user.UserBox
89
import com.duckbox.domain.user.UserBoxRepository
@@ -11,6 +12,7 @@ import com.duckbox.domain.vote.VoteRepository
1112
import com.duckbox.dto.OverallDetailDto
1213
import com.duckbox.dto.group.GroupDetailDto
1314
import com.duckbox.dto.group.GroupRegisterDto
15+
import com.duckbox.dto.group.ReportRequestDto
1416
import com.duckbox.dto.group.GroupUpdateDto
1517
import com.duckbox.dto.notification.NotificationMessage
1618
import com.duckbox.errors.exception.ConflictException
@@ -151,7 +153,7 @@ class GroupService (
151153
description = registerDto.description,
152154
profile = profileImageId,
153155
header = headerImageId,
154-
reported = mutableListOf()
156+
reported = mutableMapOf()
155157
)
156158
).id
157159

@@ -273,8 +275,8 @@ class GroupService (
273275
userBoxRepository.save(userBox)
274276
}
275277

276-
fun reportGroup(userEmail: String, groupId: String) {
277-
val groupObjectId = ObjectId(groupId)
278+
fun reportGroup(userEmail: String, reportRequestDto: ReportRequestDto) {
279+
val groupObjectId = ObjectId(reportRequestDto.groupId)
278280

279281
// check group is valid
280282
lateinit var groupEntity: GroupEntity
@@ -283,14 +285,14 @@ class GroupService (
283285
}.onSuccess {
284286
groupEntity = it
285287
}.onFailure {
286-
throw NotFoundException("Invalid GroupId: [${groupId}]")
288+
throw NotFoundException("Invalid GroupId: [${reportRequestDto.groupId}]")
287289
}
288290

289291
val userDid: String = userRepository.findByEmail(userEmail).did
290-
if (groupEntity.reported.find { it == userDid } != null) {
292+
if (groupEntity.reported.keys.find { it == userDid } != null) {
291293
throw ConflictException("User [$userEmail] has already reported this group[$groupObjectId].")
292294
}
293-
groupEntity.reported.add(userDid)
295+
groupEntity.reported[userDid] = Report(reportRequestDto.reportType, reportRequestDto.reason)
294296

295297
if (groupEntity.reported.size >= 5 && groupEntity.status != GroupStatus.REPORTED) {
296298
groupEntity.status = GroupStatus.REPORTED

src/test/kotlin/com/duckbox/controller/GroupControllerTest.kt

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.duckbox.dto.OverallDetailDto
1111
import com.duckbox.dto.group.GroupDetailDto
1212
import com.duckbox.dto.group.GroupRegisterDto
1313
import com.duckbox.dto.group.GroupUpdateDto
14+
import com.duckbox.dto.group.ReportRequestDto
1415
import com.duckbox.dto.user.LoginRequestDto
1516
import com.duckbox.dto.user.RegisterDto
1617
import com.duckbox.errors.exception.ConflictException
@@ -565,7 +566,9 @@ class GroupControllerTest {
565566
}
566567
val mockDto: GroupRegisterDto = mockGroupRegisterDto.copy(leader = userRepository.findByEmail(mockUserEmail2).did)
567568
val groupId: String = groupService.registerGroup(mockUserEmail2, mockDto).body!! // mockUser 2
568-
val httpEntity = HttpEntity(groupId, httpHeaders)
569+
570+
val reportRegisterDto = ReportRequestDto(groupId, 0, "reason")
571+
val httpEntity = HttpEntity(reportRegisterDto, httpHeaders)
569572

570573
// act, assert
571574
restTemplate
@@ -583,7 +586,9 @@ class GroupControllerTest {
583586
val httpHeaders = HttpHeaders().apply {
584587
this["Authorization"] = "Bearer $token"
585588
}
586-
val httpEntity = HttpEntity(ObjectId().toString(), httpHeaders)
589+
590+
val reportRegisterDto = ReportRequestDto(ObjectId().toString(), 0, "reason")
591+
val httpEntity = HttpEntity(reportRegisterDto, httpHeaders)
587592

588593
// act, assert
589594
restTemplate
@@ -603,10 +608,12 @@ class GroupControllerTest {
603608
}
604609
val mockDto: GroupRegisterDto = mockGroupRegisterDto.copy(leader = userRepository.findByEmail(mockUserEmail2).did)
605610
val groupId: String = groupService.registerGroup(mockUserEmail2, mockDto).body!! // mockUser 2
606-
val httpEntity = HttpEntity(groupId, httpHeaders)
611+
612+
val reportRegisterDto = ReportRequestDto(groupId, 0, "reason")
613+
val httpEntity = HttpEntity(reportRegisterDto, httpHeaders)
607614

608615
// act
609-
groupService.reportGroup(mockUserEmail, groupId)
616+
groupService.reportGroup(mockUserEmail, reportRegisterDto)
610617

611618
// act, assert
612619
restTemplate

src/test/kotlin/com/duckbox/service/GroupServiceTest.kt

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.duckbox.dto.OverallDetailDto
1313
import com.duckbox.dto.group.GroupDetailDto
1414
import com.duckbox.dto.group.GroupRegisterDto
1515
import com.duckbox.dto.group.GroupUpdateDto
16+
import com.duckbox.dto.group.ReportRequestDto
1617
import com.duckbox.dto.user.RegisterDto
1718
import com.duckbox.errors.exception.ConflictException
1819
import com.duckbox.errors.exception.ForbiddenException
@@ -537,9 +538,10 @@ class GroupServiceTest {
537538
registerMockUser2()
538539
val mockDto: GroupRegisterDto = mockGroupRegisterDto.copy(leader = userRepository.findByEmail(mockUserEmail).did)
539540
val groupId: String = groupService.registerGroup(mockUserEmail, mockDto).body!!
541+
val reportRegisterDto = ReportRequestDto(groupId, 0, "reason")
540542

541543
// act
542-
groupService.reportGroup(mockUserEmail2, groupId)
544+
groupService.reportGroup(mockUserEmail2, reportRegisterDto)
543545

544546
// assert
545547
assertThat(groupRepository.findById(ObjectId(groupId)).get().reported.size).isEqualTo(1)
@@ -552,24 +554,23 @@ class GroupServiceTest {
552554
val mockDto: GroupRegisterDto = mockGroupRegisterDto.copy(leader = userRepository.findByEmail(mockUserEmail).did)
553555
val groupId: String = groupService.registerGroup(mockUserEmail, mockDto).body!!
554556

557+
val reportRegisterDto = ReportRequestDto(groupId, 0, "reason")
555558
val emailList: List<String> = listOf("1@com", "2@com", "3@com", "4@com", "5@com")
556-
val reportedList: MutableList<String> = mutableListOf()
557-
reportedList.add(userService.register(MockDto.mockRegisterDto.copy(email = emailList[0], nickname = "1")).body!!)
558-
reportedList.add(userService.register(MockDto.mockRegisterDto.copy(email = emailList[1], nickname = "2")).body!!)
559-
reportedList.add(userService.register(MockDto.mockRegisterDto.copy(email = emailList[2], nickname = "3")).body!!)
560-
reportedList.add(userService.register(MockDto.mockRegisterDto.copy(email = emailList[3], nickname = "4")).body!!)
561-
reportedList.add(userService.register(MockDto.mockRegisterDto.copy(email = emailList[4], nickname = "5")).body!!)
559+
userService.register(MockDto.mockRegisterDto.copy(email = emailList[0], nickname = "1"))
560+
userService.register(MockDto.mockRegisterDto.copy(email = emailList[1], nickname = "2"))
561+
userService.register(MockDto.mockRegisterDto.copy(email = emailList[2], nickname = "3"))
562+
userService.register(MockDto.mockRegisterDto.copy(email = emailList[3], nickname = "4"))
563+
userService.register(MockDto.mockRegisterDto.copy(email = emailList[4], nickname = "5"))
562564

563565
// act: report to limit(5)
564566
emailList.forEach {
565-
groupService.reportGroup(it, groupId)
567+
groupService.reportGroup(it, reportRegisterDto)
566568
}
567569

568570
// assert
569571
groupRepository.findById(ObjectId(groupId)).get().apply {
570572
assertThat(status).isEqualTo(GroupStatus.REPORTED)
571-
assertThat(reported.size).isEqualTo(reportedList.size)
572-
assertThat(reported).isEqualTo(reportedList)
573+
assertThat(reported.size).isEqualTo(emailList.size)
573574
}
574575
}
575576

@@ -578,10 +579,11 @@ class GroupServiceTest {
578579
// arrange
579580
registerMockUser()
580581
val invalidGroupId: String = ObjectId().toString()
582+
val reportRegisterDto = ReportRequestDto(invalidGroupId, 0, "reason")
581583

582584
// act & assert
583585
runCatching {
584-
groupService.reportGroup(mockUserEmail, invalidGroupId)
586+
groupService.reportGroup(mockUserEmail, reportRegisterDto)
585587
}.onSuccess {
586588
fail("This should be failed.")
587589
}.onFailure {
@@ -597,13 +599,14 @@ class GroupServiceTest {
597599
registerMockUser2()
598600
val mockDto: GroupRegisterDto = mockGroupRegisterDto.copy(leader = userRepository.findByEmail(mockUserEmail).did)
599601
val groupId: String = groupService.registerGroup(mockUserEmail, mockDto).body!!
602+
val reportRegisterDto = ReportRequestDto(groupId, 0, "reason")
600603

601604
// act
602-
groupService.reportGroup(mockUserEmail2, groupId)
605+
groupService.reportGroup(mockUserEmail2, reportRegisterDto)
603606

604607
// act & assert
605608
runCatching {
606-
groupService.reportGroup(mockUserEmail2, groupId)
609+
groupService.reportGroup(mockUserEmail2, reportRegisterDto)
607610
}.onSuccess {
608611
fail("This should be failed.")
609612
}.onFailure {

0 commit comments

Comments
 (0)