Files
tutor-service/internal/app/server.go

79 lines
2.3 KiB
Go

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/llm"
"tutor/internal/ontology"
"tutor/internal/progression"
"tutor/internal/teachingassets"
"tutor/internal/workflows"
)
func NewServer(cfg config.Config) *http.Server {
var runner workflows.Runner
if cfg.HasLLM() {
client := llm.NewClient(cfg.LLMEndpoint, cfg.LLMAPIKey, cfg.ModelKey)
runner = workflows.NewLLMRunner(client)
log.Printf("using llm runner: endpoint=%s model=%s", cfg.LLMEndpoint, cfg.ModelKey)
} else {
runner = workflows.NewStubRunner()
log.Println("using stub runner (TUTOR_LLM_ENDPOINT not set)")
}
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,
}
}