Fix: 보상 이중 지급 방지, 에러 응답 개선, Rate Limit 조정
- reward_worker에 txCheck 기반 이중 지급 방지 추가 (LastTxID 저장 후 재시도 전 확인) - RewardFailure 모델에 LastTxID 필드 추가 - grantWithRetry가 txID를 반환하도록 변경 - 10회 재시도 초과 시 CRITICAL 로그에 상세 정보 포함 - 경험치 실패도 hasRewardFailure에 반영하여 reward_failed 상태 전이 - 에러 응답에 requestId 필드 포함 (관측성 개선) - /api/auth/refresh를 authLimiter에서 분리 (NAT 환경 한도 초과 방지) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -9,23 +9,41 @@ import (
|
||||
)
|
||||
|
||||
// ErrorHandler is a Fiber error handler that returns structured JSON for AppError.
|
||||
// Includes requestID in error responses for log correlation.
|
||||
func ErrorHandler(c *fiber.Ctx, err error) error {
|
||||
requestID, _ := c.Locals("requestID").(string)
|
||||
|
||||
var appErr *apperror.AppError
|
||||
if errors.As(err, &appErr) {
|
||||
return c.Status(appErr.Status).JSON(appErr)
|
||||
resp := fiber.Map{
|
||||
"error": appErr.Code,
|
||||
"message": appErr.Message,
|
||||
}
|
||||
if requestID != "" {
|
||||
resp["requestId"] = requestID
|
||||
}
|
||||
return c.Status(appErr.Status).JSON(resp)
|
||||
}
|
||||
|
||||
// Default Fiber error handling
|
||||
var fiberErr *fiber.Error
|
||||
if errors.As(err, &fiberErr) {
|
||||
return c.Status(fiberErr.Code).JSON(fiber.Map{
|
||||
resp := fiber.Map{
|
||||
"error": "server_error",
|
||||
"message": fiberErr.Message,
|
||||
})
|
||||
}
|
||||
if requestID != "" {
|
||||
resp["requestId"] = requestID
|
||||
}
|
||||
return c.Status(fiberErr.Code).JSON(resp)
|
||||
}
|
||||
|
||||
return c.Status(500).JSON(fiber.Map{
|
||||
resp := fiber.Map{
|
||||
"error": "internal_error",
|
||||
"message": "서버 오류가 발생했습니다",
|
||||
})
|
||||
}
|
||||
if requestID != "" {
|
||||
resp["requestId"] = requestID
|
||||
}
|
||||
return c.Status(500).JSON(resp)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user