feat: establish Orbit models, migrations and development baseline

This commit is contained in:
2026-09-17 07:04:21 +08:00
commit 4f2935e36f
84 changed files with 4915 additions and 0 deletions

46
internal/config/config.go Normal file
View File

@@ -0,0 +1,46 @@
package config
import (
"errors"
"fmt"
"net"
"os"
"strconv"
)
type Config struct {
HTTPAddr string
MySQLDSN string
MaxOpen int
MaxIdle int
}
func Load() (Config, error) { return FromEnv(os.Getenv) }
func FromEnv(get func(string) string) (Config, error) {
c := Config{HTTPAddr: get("ORBIT_HTTP_ADDR"), MySQLDSN: get("ORBIT_MYSQL_DSN"), MaxOpen: 20, MaxIdle: 5}
if c.HTTPAddr == "" {
c.HTTPAddr = "127.0.0.1:8080"
}
if _, _, err := net.SplitHostPort(c.HTTPAddr); err != nil {
return Config{}, errors.New("invalid ORBIT_HTTP_ADDR")
}
if c.MySQLDSN == "" {
return Config{}, errors.New("ORBIT_MYSQL_DSN is required")
}
for _, field := range []struct {
name string
dst *int
}{{"ORBIT_DB_MAX_OPEN", &c.MaxOpen}, {"ORBIT_DB_MAX_IDLE", &c.MaxIdle}} {
if raw := get(field.name); raw != "" {
n, err := strconv.Atoi(raw)
if err != nil || n < 0 {
return Config{}, fmt.Errorf("%s must be a nonnegative integer", field.name)
}
*field.dst = n
}
}
if c.MaxOpen <= 0 || c.MaxIdle > c.MaxOpen {
return Config{}, errors.New("database pool requires 0 <= max_idle <= max_open and max_open > 0")
}
return c, nil
}