platform

package
v0.8.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 17, 2026 License: Apache-2.0 Imports: 28 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func InitLogger

func InitLogger()

InitLogger configures zerolog. When LOG_FORMAT=pretty (or LOG_PRETTY=true), uses colorized console output for development. Otherwise outputs JSON for production/log aggregation.

func IsDuplicateKey

func IsDuplicateKey(err error) bool

IsDuplicateKey returns true if err is a Postgres unique-violation (SQLSTATE 23505).

func MetricsMiddleware added in v0.7.0

func MetricsMiddleware(next http.Handler) http.Handler

func Migrate

func Migrate(db *sql.DB) error

func MigrateDown

func MigrateDown(db *sql.DB) error

func MigrateStatus

func MigrateStatus(db *sql.DB) error

func NewPool

func NewPool(ctx context.Context, databaseURL string, cfg *PoolConfig) (*pgxpool.Pool, error)

func OpenDB

func OpenDB(databaseURL string) (*sql.DB, error)

func RateLimiter added in v0.7.0

func RateLimiter(requestsPerMinute int, _ time.Duration) func(http.Handler) http.Handler

RateLimiter returns middleware that enforces per-IP rate limiting. requestsPerMinute controls the sustained rate; window is unused but reserved for future burst tuning. Clients exceeding the limit receive 429 with a Retry-After header. Stale entries are cleaned up on access.

func RequestID added in v0.7.0

func RequestID(next http.Handler) http.Handler

RequestID is a Chi-compatible middleware that reads X-Request-ID from the incoming request, or generates a UUID if absent. It sets the ID on the response header and in the request context.

func RequestIDFromContext added in v0.7.0

func RequestIDFromContext(ctx context.Context) string

RequestIDFromContext returns the request ID stored in ctx, or "".

func RequestLogger

func RequestLogger(next http.Handler) http.Handler

RequestLogger is a Chi-compatible middleware that logs every request using zerolog. Logs method, path, status, duration, and remote IP.

func RunMigrations

func RunMigrations(ctx context.Context, pool *pgxpool.Pool) error

func SecurityHeaders added in v0.7.0

func SecurityHeaders(cookieSecure bool) func(http.Handler) http.Handler

SecurityHeaders returns middleware that sets common security response headers. When cookieSecure is true, Strict-Transport-Security is also set.

Types

type Config

type Config struct {
	DatabaseURL   string
	StoragePath   string
	ListenAddr    string
	DisableSignup bool
	GitHubToken   string

	// EventRetentionDays controls how many days of skill_events to keep.
	// Events older than this are purged on startup. 0 disables cleanup.
	EventRetentionDays int

	// ExternalScanCmd, when set, is an opt-in external security scanner command
	// run over each skill on publish/import (Phase 2). The token "{dir}" is
	// replaced with the skill directory and the command must emit SARIF on
	// stdout, e.g. "gitleaks dir {dir} --report-format sarif --report-path
	// /dev/stdout". Empty disables the feature.
	ExternalScanCmd     string
	ExternalScanTimeout time.Duration

	DBMaxConns          int
	DBMinConns          int
	DBMaxConnLifetime   time.Duration
	DBMaxConnIdleTime   time.Duration
	DBHealthCheckPeriod time.Duration

	CORSOrigins   string
	LogLevel      string
	RateLimitAuth int
}

Config holds all runtime configuration for the skael server.

func LoadConfig

func LoadConfig() (*Config, error)

LoadConfig reads configuration from environment variables. DATABASE_URL is required; returns an error if absent. STORAGE_PATH defaults to "./data/skills" (or "s3://bucket/prefix" for S3); LISTEN_ADDR defaults to ":8080". DISABLE_SIGNUP=true prevents new registrations.

type LocalStorage added in v0.5.0

type LocalStorage struct {
	BasePath string
}

LocalStorage provides local filesystem storage for skill archive files.

func NewLocalStorage added in v0.5.0

func NewLocalStorage(basePath string) (*LocalStorage, error)

NewLocalStorage creates a LocalStorage rooted at basePath, creating the directory if it does not already exist.

func (*LocalStorage) Delete added in v0.5.0

func (s *LocalStorage) Delete(_ context.Context, name string) error

Delete removes the file stored under name (relative to BasePath).

func (*LocalStorage) Ping added in v0.6.0

func (s *LocalStorage) Ping(_ context.Context) error

Ping verifies the base path still exists and is a directory.

func (*LocalStorage) Read added in v0.5.0

func (s *LocalStorage) Read(_ context.Context, name string) (io.ReadCloser, error)

Read opens the file stored under name (relative to BasePath) for reading. The caller is responsible for closing the returned ReadCloser.

func (*LocalStorage) Write added in v0.5.0

func (s *LocalStorage) Write(_ context.Context, name string, r io.Reader) (string, error)

Write stores the content from r under name (relative to BasePath). It uses an atomic write: content is first written to a .tmp file which is then renamed to the final destination, ensuring no partial files are visible. Returns the full path of the written file.

type PoolConfig added in v0.7.0

type PoolConfig struct {
	MaxConns          int
	MinConns          int
	MaxConnLifetime   time.Duration
	MaxConnIdleTime   time.Duration
	HealthCheckPeriod time.Duration
}

PoolConfig holds optional pgxpool tuning parameters. A nil value keeps pgxpool's built-in defaults.

type S3Storage added in v0.5.0

type S3Storage struct {
	// contains filtered or unexported fields
}

S3Storage stores archives in any S3-compatible object store.

func (*S3Storage) Delete added in v0.5.0

func (s *S3Storage) Delete(ctx context.Context, name string) error

func (*S3Storage) Ping added in v0.6.0

func (s *S3Storage) Ping(ctx context.Context) error

Ping verifies the bucket is reachable.

func (*S3Storage) Read added in v0.5.0

func (s *S3Storage) Read(ctx context.Context, name string) (io.ReadCloser, error)

func (*S3Storage) Write added in v0.5.0

func (s *S3Storage) Write(ctx context.Context, name string, r io.Reader) (string, error)

type Storage

type Storage interface {
	// Write stores r under name and returns the stored key (name).
	Write(ctx context.Context, name string, r io.Reader) (string, error)
	// Read opens the blob stored under name; caller closes the ReadCloser.
	Read(ctx context.Context, name string) (io.ReadCloser, error)
	// Delete removes the blob stored under name.
	Delete(ctx context.Context, name string) error
	// Ping verifies the backing store is reachable (readiness checks).
	Ping(ctx context.Context) error
}

Storage abstracts archive blob storage (local filesystem or object storage). Names are relative keys, e.g. "code-review/abc123.tar.gz".

func NewStorageFromConfig added in v0.5.0

func NewStorageFromConfig(cfg *Config) (Storage, error)

NewStorageFromConfig builds the Storage backend selected by STORAGE_PATH: "s3://bucket/prefix" → S3; anything else → local filesystem.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL