Add per-webhook event retention reaper (closes #63)
All checks were successful
check / check (push) Successful in 5s

This commit is contained in:
2026-08-07 20:19:01 +07:00
parent 752d6beead
commit f6abc9b392
5 changed files with 604 additions and 5 deletions

View File

@@ -8,6 +8,7 @@ import (
"os"
"strconv"
"strings"
"time"
"go.uber.org/fx"
"sneak.berlin/go/webhooker/internal/globals"
@@ -26,6 +27,10 @@ const (
// defaultPort is the default HTTP listen port.
defaultPort = 8080
// defaultRetentionSweepInterval is how often the retention
// reaper deletes events older than each webhook's RetentionDays.
defaultRetentionSweepInterval = time.Hour
)
// ErrInvalidEnvironment is returned when WEBHOOKER_ENVIRONMENT
@@ -51,8 +56,12 @@ type Config struct {
MetricsUsername string
Port int
SentryDSN string
params *ConfigParams
log *slog.Logger
// RetentionSweepInterval is how often the retention reaper runs.
RetentionSweepInterval time.Duration
params *ConfigParams
log *slog.Logger
}
// IsDev returns true if running in development environment.
@@ -95,6 +104,23 @@ func envInt(key string, defaultValue int) int {
return defaultValue
}
// envDuration returns the value of the named environment variable
// parsed as a Go duration (e.g. "1h", "30m"). Returns defaultValue if
// not set or unparseable.
func envDuration(
key string,
defaultValue time.Duration,
) time.Duration {
if v := os.Getenv(key); v != "" {
d, err := time.ParseDuration(v)
if err == nil {
return d
}
}
return defaultValue
}
// New creates a Config by reading environment variables.
//
//nolint:revive // lc parameter is required by fx even if unused.
@@ -128,8 +154,12 @@ func New(lc fx.Lifecycle, params ConfigParams) (*Config, error) {
MetricsPassword: envString("METRICS_PASSWORD"),
Port: envInt("PORT", defaultPort),
SentryDSN: envString("SENTRY_DSN"),
log: log,
params: &params,
RetentionSweepInterval: envDuration(
"RETENTION_SWEEP_INTERVAL",
defaultRetentionSweepInterval,
),
log: log,
params: &params,
}
// Set default DataDir. All SQLite databases (main application
@@ -151,6 +181,7 @@ func New(lc fx.Lifecycle, params ConfigParams) (*Config, error) {
"debug", s.Debug,
"maintenanceMode", s.MaintenanceMode,
"dataDir", s.DataDir,
"retentionSweepInterval", s.RetentionSweepInterval.String(),
"hasSentryDSN", s.SentryDSN != "",
"hasMetricsAuth",
s.MetricsUsername != "" && s.MetricsPassword != "",