Skip to content

Commit

Permalink
✨ Feat: 리뷰 제출 API
Browse files Browse the repository at this point in the history
  • Loading branch information
destiny3912 committed Sep 1, 2024
1 parent c58dc5f commit b9835fb
Show file tree
Hide file tree
Showing 10 changed files with 277 additions and 23 deletions.
1 change: 1 addition & 0 deletions core/core-api/src/docs/asciidoc/index.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@
include::educator.adoc[]
include::leaner.adoc[]
include::solution.adoc[]
include::review.adoc[]
include::symbol.adoc[]
include::chatbot.adoc[]
13 changes: 13 additions & 0 deletions core/core-api/src/docs/asciidoc/review.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
= 리뷰 API

리뷰 API 목록입니다.

== 리뷰 제출 API

=== Request __

operation::post-review-result[snippets='http-request,request-fields']

=== Response __

operation::post-review-result[snippets='http-response,response-fields']
Original file line number Diff line number Diff line change
@@ -1,17 +1,21 @@
package io.say.better.domain.review.application

import io.say.better.core.common.code.status.ErrorStatus
import io.say.better.core.common.exception.GeneralException
import io.say.better.core.common.utils.logger
import io.say.better.domain.review.application.converter.RecordSymbolConverter
import io.say.better.domain.review.application.impl.RecordService
import io.say.better.domain.review.application.impl.RecordSymbolService
import io.say.better.domain.review.application.impl.ReviewService
import io.say.better.domain.review.ui.dto.ReviewRequest
import io.say.better.domain.solution.application.converter.RecordConverter
import io.say.better.domain.solution.ui.dto.SolutionRequest.EndSolution
import io.say.better.domain.symbol.application.impl.SymbolService
import io.say.better.global.advice.Tx
import io.say.better.global.utils.IdUtil
import io.say.better.storage.mysql.domains.review.entity.Record
import io.say.better.storage.mysql.domains.review.entity.Review
import io.say.better.storage.mysql.domains.review.type.ReactionType
import io.say.better.storage.mysql.domains.symbol.entity.Symbol
import org.springframework.amqp.rabbit.annotation.RabbitListener
import org.springframework.stereotype.Component
Expand Down Expand Up @@ -47,4 +51,17 @@ class ReviewFacade(
recordSymbolService.createRecordSymbol(recordSymbol)
}
}

fun submitReview(request: List<ReviewRequest.SubmitReview>) {
Tx.writeable {
for (record in request) {
if (!ReactionType.entries.contains(ReactionType.valueOf(record.reactionType))) {
throw GeneralException(ErrorStatus.SUBMIT_REVIEW_REACTION_TYPE_INVALID)
}
}

recordService.updateReactionTypeOnRecord(request)
return@writeable
}
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package io.say.better.domain.review.application.impl

import io.say.better.core.common.code.status.ErrorStatus
import io.say.better.core.common.exception.GeneralException
import io.say.better.domain.review.ui.dto.ReviewRequest
import io.say.better.storage.mysql.domains.review.entity.Record
import io.say.better.storage.mysql.domains.review.entity.Review
import io.say.better.storage.mysql.domains.review.repository.RecordReadRepository
import io.say.better.storage.mysql.domains.review.repository.RecordWriteRepository
import io.say.better.storage.mysql.domains.review.type.ReactionType
import org.springframework.stereotype.Service

@Service
Expand All @@ -22,4 +26,16 @@ class RecordService(
record.saveVoice(voiceUrl)
recordWriteRepository.save(record)
}

fun updateReactionTypeOnRecord(request: List<ReviewRequest.SubmitReview>) {
for (submit in request) {
val record: Record =
recordReadRepository
.findById(submit.recordId)
.orElseThrow { GeneralException(ErrorStatus.SUBMIT_REVIEW_TARGET_RECORD_NOT_FOUND) }

record.updateReactionType(ReactionType.valueOf(submit.reactionType))
recordWriteRepository.save(record)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,20 @@
package io.say.better.domain.review.ui

import io.say.better.core.common.response.ResponseDto
import io.say.better.domain.review.application.ReviewFacade
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
import io.say.better.domain.review.ui.dto.ReviewRequest
import org.springframework.web.bind.annotation.*

@RestController
@RequestMapping("/api/review")
class ReviewController(
private val reviewFacade: ReviewFacade,
)
) {
@PostMapping
fun submitReview(
@RequestBody request: List<ReviewRequest.SubmitReview>,
): ResponseDto<Nothing?> {
reviewFacade.submitReview(request)
return ResponseDto.onSuccess(null)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,9 @@ class ReviewRequest private constructor() {
init {
throw IllegalStateException("Utility class")
}

data class SubmitReview constructor(
val recordId: Long,
val reactionType: String,
)
}
Loading

0 comments on commit b9835fb

Please sign in to comment.