package mutil import ( "errors" "net/http" "github.com/tech/sendico/pkg/api/http/response" "github.com/tech/sendico/pkg/db/verification" "github.com/tech/sendico/pkg/mlogger" "github.com/tech/sendico/pkg/mservice" "go.uber.org/zap" ) func MapTokenErrorToResponse(logger mlogger.Logger, service mservice.Type, err error) http.HandlerFunc { if errors.Is(err, verification.ErrTokenNotFound) { logger.Debug("Verification token not found during consume", zap.Error(err)) return response.NotFound(logger, service, "No account found associated with given verifcation token") } if errors.Is(err, verification.ErrTokenExpired) { logger.Debug("Verification token expired during consume", zap.Error(err)) return response.Gone(logger, service, "token_expired", "verification token has expired") } if errors.Is(err, verification.ErrTokenAlreadyUsed) { logger.Debug("Verification token already used during consume", zap.Error(err)) return response.DataConflict(logger, service, "verification token has already been used") } if errors.Is(err, verification.ErrTokenAttemptsExceeded) { logger.Debug("Verification token attempts exceeded", zap.Error(err)) return response.Forbidden(logger, service, "code_attempts_exceeded", "verification token has already been used") } if errors.Is(err, verification.ErrCooldownActive) { logger.Debug("Cooldown is still active", zap.Error(err)) return response.TooManyRequests(logger, service, "verification token can't be generated yet, cooldown is still active") } if errors.Is(err, verification.ErrIdempotencyConflict) { logger.Debug("Verification idempotency key conflict", zap.Error(err)) return response.DataConflict(logger, service, "verification request was already processed") } if err != nil { logger.Warn("Unexpected error during token verification", zap.Error(err)) return response.Auto(logger, service, err) } logger.Debug("No token verification error found") return response.Success(logger) }