data layer

This commit is contained in:
2026-05-25 08:38:26 +07:00
parent 4e8c11d545
commit a428170fef
81 changed files with 3941 additions and 0 deletions

View File

@@ -0,0 +1,33 @@
// Package apperr defines AppError, the single error type used across the
// worker. Job handlers wrap any underlying driver error before returning so
// river retry/log lines stay consistent with the api service.
package apperr
import (
"errors"
"fmt"
)
type AppError struct {
Message string
Err error
}
func (e *AppError) Error() string {
if e.Err != nil {
return fmt.Sprintf("%s: %v", e.Message, e.Err)
}
return e.Message
}
func (e *AppError) Unwrap() error { return e.Err }
func As(err error) (*AppError, bool) {
var ae *AppError
if errors.As(err, &ae) {
return ae, true
}
return nil, false
}
func Wrap(msg string, err error) *AppError { return &AppError{Message: msg, Err: err} }

View File

@@ -0,0 +1,37 @@
// Package config loads runtime configuration for the analytics worker.
package config
import (
"fmt"
"time"
"github.com/caarlos0/env/v11"
)
type Config struct {
HTTPAddr string `env:"WORKER_HTTP_ADDR" envDefault:":4001"`
LogLevel string `env:"WORKER_LOG_LEVEL" envDefault:"info"`
ShutdownTimeout time.Duration `env:"WORKER_SHUTDOWN_TIMEOUT_SECONDS" envDefault:"60s"`
// river queue tuning
MaxWorkers int `env:"WORKER_MAX_WORKERS" envDefault:"50"`
ComputeTraitsEvery time.Duration `env:"WORKER_COMPUTE_TRAITS_EVERY" envDefault:"1h"`
RefreshSegmentEvery time.Duration `env:"WORKER_REFRESH_SEGMENT_EVERY" envDefault:"1h"`
// Shared infra ----------------------------------------------------------
PostgresDSN string `env:"POSTGRES_DSN,required"`
RedisAddr string `env:"REDIS_ADDR" envDefault:"localhost:6379"`
ClickHouseAddr string `env:"CLICKHOUSE_ADDR" envDefault:"localhost:9000"`
ClickHouseDB string `env:"CLICKHOUSE_DB" envDefault:"cdp"`
ClickHouseUser string `env:"CLICKHOUSE_USER" envDefault:"default"`
ClickHousePassword string `env:"CLICKHOUSE_PASSWORD"`
}
func Load() (*Config, error) {
cfg := &Config{}
if err := env.Parse(cfg); err != nil {
return nil, fmt.Errorf("config load: %w", err)
}
return cfg, nil
}

View File