Files
a301_server/pkg/middleware/error_handler.go
tolelom 9883985968
Some checks failed
Server CI/CD / lint-and-build (push) Failing after 32s
Server CI/CD / deploy (push) Has been skipped
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>
2026-03-19 21:01:45 +09:00

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)
}