Files
2026-06-15 20:02:43 +08:00

60 lines
1.3 KiB
Go

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
}