@@ -5,32 +5,32 @@ import kotlinx.coroutines.CoroutineScope
5
5
import kotlinx.coroutines.flow.filterNot
6
6
import kotlinx.coroutines.launch
7
7
import me.misik.api.api.response.ParsedOcrResponse
8
+ import me.misik.api.core.Chatbot
9
+ import me.misik.api.core.GracefulShutdownDispatcher
10
+ import me.misik.api.core.OcrParser
8
11
import me.misik.api.domain.CreateReviewCache
9
- import me.misik.api.domain.request.CreateReviewRequest
10
- import me.misik.api.domain.request.OcrTextRequest
11
12
import me.misik.api.domain.Review
12
13
import me.misik.api.domain.ReviewService
13
14
import me.misik.api.domain.prompt.PromptService
14
- import me.misik.api.core.Chatbot
15
- import me.misik.api.core.OcrParser
16
- import me.misik.api.core.GracefulShutdownDispatcher
15
+ import me.misik.api.domain.request.CreateReviewRequest
16
+ import me.misik.api.domain.request.OcrTextRequest
17
17
import org.slf4j.LoggerFactory
18
18
import org.springframework.stereotype.Service
19
19
20
20
21
21
@Service
22
22
class CreateReviewFacade (
23
- private val chatbot : Chatbot ,
23
+ private val chatbot : Chatbot ,
24
24
private val ocrParser : OcrParser ,
25
- private val reviewService : ReviewService ,
25
+ private val reviewService : ReviewService ,
26
26
private val promptService : PromptService ,
27
27
private val createReviewCache : CreateReviewCache ,
28
28
private val objectMapper : ObjectMapper ,
29
29
) {
30
30
31
31
private val logger = LoggerFactory .getLogger(this ::class .simpleName)
32
32
33
- fun createReviewInBackground (deviceId : String , createReviewRequest : CreateReviewRequest ) : Long {
33
+ fun createReviewInBackground (deviceId : String , createReviewRequest : CreateReviewRequest ): Long {
34
34
val prompt = promptService.getByStyle(createReviewRequest.reviewStyle)
35
35
val review = reviewService.createReview(deviceId, prompt.command, createReviewRequest)
36
36
@@ -54,7 +54,7 @@ class CreateReviewFacade(
54
54
}
55
55
}.invokeOnCompletion {
56
56
if (it == null ) {
57
- createReviewCache.get(review.id)? .let {
57
+ createReviewCache.get(review.id).let {
58
58
reviewService.updateAndCompleteReview(it.id, it.text)
59
59
}
60
60
createReviewCache.remove(review.id)
@@ -65,23 +65,36 @@ class CreateReviewFacade(
65
65
createReviewCache.remove(review.id)
66
66
throw it
67
67
}
68
- logger.warn(" Failed to create review. retrying... retryCount: \" ${retryCount + 1 } \" " , it)
68
+ logger.warn(
69
+ " Failed to create review. retrying... retryCount: \" ${retryCount + 1 } \" " ,
70
+ it
71
+ )
69
72
createReviewWithRetry(review, retryCount + 1 )
70
73
}
71
74
}
72
75
73
- fun parseOcrText (ocrText : OcrTextRequest ): ParsedOcrResponse {
74
- val response = ocrParser.createParsedOcr(OcrParser .Request .from(ocrText.text))
75
- val responseContent = response.result?.message?.content ? : " "
76
+ fun parseOcrText (ocrText : OcrTextRequest ): ParsedOcrResponse = parseOcrWithRetry(ocrText, 0 )
76
77
77
- val parsedOcr = objectMapper.readValue(responseContent, ParsedOcrResponse ::class .java)
78
- ? : throw IllegalStateException (" Invalid OCR text format" )
78
+ private fun parseOcrWithRetry (ocrText : OcrTextRequest , retryCount : Int ): ParsedOcrResponse {
79
+ return runCatching {
80
+ val response = ocrParser.createParsedOcr(OcrParser .Request .from(ocrText.text))
79
81
80
- if (parsedOcr.parsed.isEmpty()) {
81
- throw IllegalArgumentException (" Parsed OCR content is empty" )
82
- }
82
+ val responseContent = response.result?.message?.content ? : " "
83
+ logger.info(" ocr responseContent $responseContent " )
84
+
85
+ val parsedOcr = objectMapper.readValue(responseContent, ParsedOcrResponse ::class .java)
86
+ ? : throw IllegalStateException (" Invalid OCR text format" )
83
87
84
- return parsedOcr
88
+ require(parsedOcr.parsed.isEmpty().not ()) { " Parsed OCR content is empty" }
89
+
90
+ parsedOcr
91
+ }.getOrElse {
92
+ logger.error(" OCR Parsing fail" , it)
93
+ if (retryCount < MAX_RETRY_COUNT ) {
94
+ return @getOrElse parseOcrWithRetry(ocrText, retryCount + 1 )
95
+ }
96
+ throw it
97
+ }
85
98
}
86
99
87
100
private companion object {
0 commit comments