- 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>
50 lines
1.1 KiB
Go
50 lines
1.1 KiB
Go
package middleware
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"a301_server/pkg/apperror"
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
)
|
|
|
|
// 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) {
|
|
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) {
|
|
resp := fiber.Map{
|
|
"error": "server_error",
|
|
"message": fiberErr.Message,
|
|
}
|
|
if requestID != "" {
|
|
resp["requestId"] = requestID
|
|
}
|
|
return c.Status(fiberErr.Code).JSON(resp)
|
|
}
|
|
|
|
resp := fiber.Map{
|
|
"error": "internal_error",
|
|
"message": "서버 오류가 발생했습니다",
|
|
}
|
|
if requestID != "" {
|
|
resp["requestId"] = requestID
|
|
}
|
|
return c.Status(500).JSON(resp)
|
|
}
|