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) } }