Files
Crussell/backend/internal/validators/validators.go
T

49 lines
1.2 KiB
Go

package validators
import (
"fmt"
"github.com/go-playground/validator/v10"
"reflect"
"regexp"
"strings"
"time"
)
var Validate *validator.Validate
func init() {
Validate = validator.New()
Validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
if name == "-" {
return ""
}
return name
})
}
// ID format: 12-character hexadecimal string (from gen_random_bytes(6) encoded as hex)
var validIDRegex = regexp.MustCompile(`^[0-9a-f]{12}$`)
// IsValidID checks if an ID is valid based on the database constraint (CHAR(12) hex string)
// Valid IDs are exactly 12 hexadecimal characters (0-9, a-f)
func IsValidID(id string) bool {
if id == "" {
return false
}
return validIDRegex.MatchString(id)
}
// ParseCursor splits a "createdAt|id" cursor string into its components.
func ParseCursor(cursor string) (time.Time, string, error) {
parts := strings.SplitN(cursor, "|", 2)
if len(parts) != 2 {
return time.Time{}, "", fmt.Errorf("invalid cursor format")
}
t, err := time.Parse(time.RFC3339, parts[0])
if err != nil {
return time.Time{}, "", fmt.Errorf("invalid cursor created_at: %w", err)
}
return t, parts[1], nil
}