Files
browser/platform/api/router.go
T
2026-07-11 14:56:10 +08:00

75 lines
1.8 KiB
Go

package api
import (
"fmt"
"net/http"
"strings"
"browser.local/platform/config"
"browser.local/platform/repo"
"browser.local/platform/service"
)
func NewRouter() http.Handler {
router, err := NewRouterFromConfig(config.Load())
if err != nil {
panic(err)
}
return router
}
func NewRouterFromConfig(cfg config.Config) (http.Handler, error) {
store, err := storeFromConfig(cfg)
if err != nil {
return nil, err
}
logStore, err := logStoreFromConfig(cfg)
if err != nil {
return nil, err
}
core := service.NewCoreServiceWithLogStore(store, logStore)
if err := core.SeedLocalPlatformAdmin(); err != nil {
return nil, err
}
return NewRouterWithCore(core), nil
}
func NewRouterWithCore(core service.Core) http.Handler {
handlers := newCoreHandlers(core)
mux := http.NewServeMux()
mux.HandleFunc("/healthz", HealthHandler)
handlers.register(mux)
return mux
}
func storeFromConfig(cfg config.Config) (repo.Store, error) {
switch strings.ToLower(strings.TrimSpace(cfg.StorageBackend)) {
case "", "file":
return repo.NewFileStore(cfg.MetadataPath)
case "memory":
return repo.NewMemoryStore(), nil
case "mysql":
return repo.NewMySQLStore(cfg.MySQLDSN)
default:
return nil, fmt.Errorf("unsupported platform storage backend %q", cfg.StorageBackend)
}
}
func logStoreFromConfig(cfg config.Config) (service.LogBodyStore, error) {
backend := strings.ToLower(strings.TrimSpace(cfg.LogBodyBackend))
if backend == "" {
backend = strings.ToLower(strings.TrimSpace(cfg.StorageBackend))
if backend == "mysql" {
backend = "file"
}
}
switch backend {
case "", "file":
return service.NewFileLogBodyStore(cfg.LogDir)
case "memory":
return service.NewMemoryLogBodyStore(), nil
default:
return nil, fmt.Errorf("unsupported platform log body backend %q", backend)
}
}