From 5d6eb5da4fcea80d0b9d3cdf263aa273beee85a1 Mon Sep 17 00:00:00 2001 From: Klaus Date: Thu, 3 Aug 2023 00:24:17 +0900 Subject: [PATCH] =?UTF-8?q?=EC=8B=A0=EA=B3=A0=20API=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/co/vividnext/sodalive/report/Report.kt | 34 ++++++++++++ .../sodalive/report/ReportController.kt | 23 ++++++++ .../sodalive/report/ReportRepository.kt | 7 +++ .../sodalive/report/ReportRequest.kt | 9 ++++ .../sodalive/report/ReportService.kt | 52 +++++++++++++++++++ 5 files changed, 125 insertions(+) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/report/Report.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/report/ReportController.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/report/ReportRepository.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/report/ReportRequest.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/report/ReportService.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/report/Report.kt b/src/main/kotlin/kr/co/vividnext/sodalive/report/Report.kt new file mode 100644 index 0000000..89a46d6 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/report/Report.kt @@ -0,0 +1,34 @@ +package kr.co.vividnext.sodalive.report + +import kr.co.vividnext.sodalive.common.BaseEntity +import kr.co.vividnext.sodalive.explorer.profile.CreatorCheers +import kr.co.vividnext.sodalive.member.Member +import javax.persistence.Entity +import javax.persistence.EnumType +import javax.persistence.Enumerated +import javax.persistence.FetchType +import javax.persistence.JoinColumn +import javax.persistence.ManyToOne + +@Entity +data class Report( + @Enumerated(value = EnumType.STRING) + val type: ReportType, + val reason: String +) : BaseEntity() { + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "member_id", nullable = false) + var member: Member? = null + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "reported_member_id", nullable = true) + var reportedAccount: Member? = null + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "cheers_id", nullable = true) + var cheers: CreatorCheers? = null +} + +enum class ReportType { + REVIEW, PROFILE, USER, CHEERS, AUDIO_CONTENT +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/report/ReportController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/report/ReportController.kt new file mode 100644 index 0000000..10a2903 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/report/ReportController.kt @@ -0,0 +1,23 @@ +package kr.co.vividnext.sodalive.report + +import kr.co.vividnext.sodalive.common.ApiResponse +import kr.co.vividnext.sodalive.common.SodaException +import kr.co.vividnext.sodalive.member.Member +import org.springframework.security.core.annotation.AuthenticationPrincipal +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RestController +@RequestMapping("/report") +class ReportController(private val service: ReportService) { + @PostMapping + fun report( + @RequestBody request: ReportRequest, + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + ApiResponse.ok(service.save(member, request), "신고가 접수되었습니다.") + } +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/report/ReportRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/report/ReportRepository.kt new file mode 100644 index 0000000..e6368c9 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/report/ReportRepository.kt @@ -0,0 +1,7 @@ +package kr.co.vividnext.sodalive.report + +import org.springframework.data.jpa.repository.JpaRepository +import org.springframework.stereotype.Repository + +@Repository +interface ReportRepository : JpaRepository diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/report/ReportRequest.kt b/src/main/kotlin/kr/co/vividnext/sodalive/report/ReportRequest.kt new file mode 100644 index 0000000..0c52797 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/report/ReportRequest.kt @@ -0,0 +1,9 @@ +package kr.co.vividnext.sodalive.report + +data class ReportRequest( + val type: ReportType, + val reason: String, + val reportedMemberId: Long? = null, + val cheersId: Long? = null, + val audioContentId: Long? = null +) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/report/ReportService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/report/ReportService.kt new file mode 100644 index 0000000..2926dda --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/report/ReportService.kt @@ -0,0 +1,52 @@ +package kr.co.vividnext.sodalive.report + +import kr.co.vividnext.sodalive.common.SodaException +import kr.co.vividnext.sodalive.explorer.profile.CreatorCheersRepository +import kr.co.vividnext.sodalive.member.Member +import kr.co.vividnext.sodalive.member.MemberRepository +import org.springframework.data.repository.findByIdOrNull +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional + +@Service +@Transactional(readOnly = true) +class ReportService( + private val repository: ReportRepository, + private val memberRepository: MemberRepository, + private val cheersRepository: CreatorCheersRepository +) { + @Transactional + fun save(member: Member, request: ReportRequest) { + if (conditionAllIsNull(request, isNull = true) || conditionAllIsNull(request, isNull = false)) { + throw SodaException("신고가 접수되었습니다.") + } + + val reportedAccount = if (request.reportedMemberId != null) { + memberRepository.findByIdOrNull(request.reportedMemberId) + ?: throw SodaException("신고가 접수되었습니다.") + } else { + null + } + + val cheers = if (request.cheersId != null) { + cheersRepository.findByIdOrNull(request.cheersId) + ?: throw SodaException("신고가 접수되었습니다.") + } else { + null + } + + val report = Report(type = request.type, reason = request.reason) + report.member = member + report.reportedAccount = reportedAccount + report.cheers = cheers + repository.save(report) + } + + private fun conditionAllIsNull(request: ReportRequest, isNull: Boolean): Boolean { + return if (isNull) { + request.reportedMemberId == null && request.cheersId == null && request.audioContentId == null + } else { + request.reportedMemberId != null && request.cheersId != null && request.audioContentId != null + } + } +}