Skip to content

Commit 4078a10

Browse files
authored
Gemini와 Github 에러 처리 방식 분기
Gemini와 Github 에러 처리 방식 분기
2 parents 667a1db + c8f4179 commit 4078a10

2 files changed

Lines changed: 40 additions & 11 deletions

File tree

src/main/kotlin/com/project/codereview/core/controller/CodeReviewController.kt

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,20 @@ class CodeReviewController(
2828
): ResponseEntity<String> {
2929
if (sig256 == null) {
3030
logger.warn("Missing signature header for GitHub webhook")
31-
return unauthorized("Missing signature")
31+
return fail("Missing signature")
3232
}
3333
// 서명 검증
3434
if (!GithubSignature.isValid(sig256, secret, rawBody)) {
3535
logger.warn("Invalid signature detected from GitHub webhook")
36-
return unauthorized("Invalid signature")
36+
return fail("Invalid signature")
37+
}
38+
39+
val payload = try {
40+
parsePayload(rawBody)
41+
} catch (e: Exception) {
42+
return fail("Invalid payload : ${e.message}", HttpStatus.NOT_ACCEPTABLE)
3743
}
3844

39-
val payload = parsePayload(rawBody)
4045
val action = GithubActionType(payload.action)
4146
logger.info("payload = {}, action = {}", payload, action)
4247

@@ -55,7 +60,8 @@ class CodeReviewController(
5560
return ResponseEntity.ok("Request completed")
5661
}
5762

58-
private fun unauthorized(
59-
message: String
60-
) = ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(message)
63+
private fun fail(
64+
message: String,
65+
status: HttpStatus = HttpStatus.UNAUTHORIZED
66+
) = ResponseEntity.status(status).body(message)
6167
}

src/main/kotlin/com/project/codereview/core/service/ReviewWorker.kt

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.project.codereview.client.github.GithubReviewClient
55
import com.project.codereview.client.google.GoogleGeminiClient
66
import com.project.codereview.core.dto.GithubPayload
77
import com.project.codereview.core.dto.GithubReviewDto
8+
import org.slf4j.LoggerFactory
89
import org.springframework.stereotype.Service
910

1011
@Service
@@ -13,16 +14,38 @@ class ReviewWorker(
1314
private val githubReviewClient: GithubReviewClient,
1415
private val failedTaskManager: FailedTaskManager
1516
) {
17+
private val logger = LoggerFactory.getLogger(ReviewWorker::class.java)
18+
1619
suspend fun process(payload: GithubPayload, task: DiffTaskPreparer.ReviewTask) {
1720
val prompt = "```diff\n${task.part.content}\n```"
1821
val filePath = task.part.filePath
1922

23+
val reviewResult = runCatching {
24+
googleGeminiClient.chat(filePath, prompt)
25+
}.onFailure { e ->
26+
logger.warn("[Gemini error] - $payload, $task")
27+
logger.warn("[Gemini error] - {}", e.message)
28+
handleGeminiError(e.message ?: "", prompt, payload, task)
29+
}
30+
31+
val review = reviewResult.getOrNull() ?: return
32+
2033
runCatching {
21-
val review = googleGeminiClient.chat(filePath, prompt)
22-
if (review != null) {
23-
githubReviewClient.addReviewComment(GithubReviewDto(task.payload, task.part, payload.installation.id, review))
24-
}
25-
}.onFailure {
34+
githubReviewClient.addReviewComment(GithubReviewDto(task.payload, task.part, payload.installation.id, review))
35+
}.onFailure { e ->
36+
logger.warn("[Github error] - $payload, $task")
37+
logger.warn("[Github error] - cause {}", e.message)
38+
}
39+
}
40+
41+
private fun handleGeminiError(
42+
e: String,
43+
prompt: String,
44+
payload: GithubPayload,
45+
task: DiffTaskPreparer.ReviewTask
46+
) {
47+
val isTooManyRequestError = e.contains("429 Too Many Requests") || e.contains("429")
48+
if (isTooManyRequestError) {
2649
failedTaskManager.add(FailedTaskManager.OriginalTask(payload, task.part), prompt)
2750
}
2851
}

0 commit comments

Comments
 (0)