package config import ( "fmt" "strconv" "strings" "time" ) const shareCodeTTLMax = 365 * 24 * time.Hour // parseShareCodeTTL parses SHARE_CODE_TTL_MIN values: // - bare number (e.g. "30") = minutes (backward compatible) // - with suffix: m (minutes), h (hours), d (days), e.g. "30m", "24h", "30d" func parseShareCodeTTL(raw string) (time.Duration, error) { raw = strings.TrimSpace(raw) if raw == "" { return 30 * time.Minute, nil } if n, err := strconv.Atoi(raw); err == nil { if n <= 0 { return 0, fmt.Errorf("must be positive") } d := time.Duration(n) * time.Minute if d > shareCodeTTLMax { return 0, fmt.Errorf("exceeds maximum of 365d") } return d, nil } if len(raw) < 2 { return 0, fmt.Errorf("invalid format %q", raw) } unit := strings.ToLower(string(raw[len(raw)-1])) numStr := raw[:len(raw)-1] n, err := strconv.Atoi(numStr) if err != nil || n <= 0 { return 0, fmt.Errorf("invalid format %q", raw) } var d time.Duration switch unit { case "m": d = time.Duration(n) * time.Minute case "h": d = time.Duration(n) * time.Hour case "d": d = time.Duration(n) * 24 * time.Hour default: return 0, fmt.Errorf("unknown unit %q (use m, h, or d)", unit) } if d > shareCodeTTLMax { return 0, fmt.Errorf("exceeds maximum of 365d") } return d, nil }