package app import ( "log" "net/http" "github.com/jackc/pgx/v5/pgxpool" "tutor/internal/auth" "tutor/internal/config" "tutor/internal/db" "tutor/internal/httpapi" "tutor/internal/interview" "tutor/internal/learnermemory" "tutor/internal/ontology" "tutor/internal/progression" "tutor/internal/teachingassets" "tutor/internal/workflows" ) func NewServer(cfg config.Config) *http.Server { runner := workflows.NewStubRunner() var interviewStore interview.Store var memoryStore learnermemory.Store var ontologyStore ontology.Store var assetsStore teachingassets.Store var pool *pgxpool.Pool if cfg.DatabaseURL != "" { p, err := db.Open(cfg.DatabaseURL) if err != nil { log.Fatalf("open database: %v", err) } pool = p if err := db.Migrate(pool); err != nil { log.Fatalf("migrate database: %v", err) } interviewStore = interview.NewPostgresStore(pool) memoryStore = learnermemory.NewPostgresStore(pool) ontologyStore = ontology.NewPostgresStore(pool) assetsStore = teachingassets.NewPostgresStore(pool) log.Println("using postgres persistence") } else { interviewStore = interview.NewMemoryStore() memoryStore = learnermemory.NewMemoryStore() ontologyStore = ontology.NewMemoryStore() assetsStore = teachingassets.NewMemoryStore() log.Println("using in-memory persistence") } memory := learnermemory.NewService(memoryStore) progress := progression.NewService(memory) onto := ontology.NewService(ontologyStore) assets := teachingassets.NewService(assetsStore, onto, cfg.ImageModelKey) service := interview.NewService(interviewStore, runner, memory) handler := httpapi.NewHandler(cfg, service, memory, progress, onto, assets) mux := handler.Routes().(*http.ServeMux) if pool != nil && cfg.GoogleClientID != "" && cfg.JWTSecret != "" { authService := auth.NewService(pool, cfg.GoogleClientID, cfg.JWTSecret) authService.RegisterRoutes(mux) log.Println("auth routes registered") } return &http.Server{ Addr: cfg.HTTPAddr, Handler: mux, } }