2026-04-26 16:14:31 +09:00
|
|
|
package app
|
|
|
|
|
|
|
|
|
|
import (
|
2026-04-27 12:35:03 +09:00
|
|
|
"log"
|
2026-04-26 16:14:31 +09:00
|
|
|
"net/http"
|
|
|
|
|
|
2026-04-27 13:23:47 +09:00
|
|
|
"github.com/jackc/pgx/v5/pgxpool"
|
|
|
|
|
"tutor/internal/auth"
|
2026-04-26 16:14:31 +09:00
|
|
|
"tutor/internal/config"
|
2026-04-27 12:35:03 +09:00
|
|
|
"tutor/internal/db"
|
2026-04-26 16:14:31 +09:00
|
|
|
"tutor/internal/httpapi"
|
2026-04-26 16:24:35 +09:00
|
|
|
"tutor/internal/interview"
|
2026-04-26 16:34:52 +09:00
|
|
|
"tutor/internal/learnermemory"
|
2026-04-26 17:49:35 +09:00
|
|
|
"tutor/internal/ontology"
|
2026-04-26 16:39:19 +09:00
|
|
|
"tutor/internal/progression"
|
2026-04-26 17:54:23 +09:00
|
|
|
"tutor/internal/teachingassets"
|
2026-04-26 16:14:31 +09:00
|
|
|
"tutor/internal/workflows"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func NewServer(cfg config.Config) *http.Server {
|
|
|
|
|
runner := workflows.NewStubRunner()
|
2026-04-27 12:35:03 +09:00
|
|
|
|
|
|
|
|
var interviewStore interview.Store
|
|
|
|
|
var memoryStore learnermemory.Store
|
|
|
|
|
var ontologyStore ontology.Store
|
|
|
|
|
var assetsStore teachingassets.Store
|
2026-04-27 13:23:47 +09:00
|
|
|
var pool *pgxpool.Pool
|
2026-04-27 12:35:03 +09:00
|
|
|
|
|
|
|
|
if cfg.DatabaseURL != "" {
|
2026-04-27 13:23:47 +09:00
|
|
|
p, err := db.Open(cfg.DatabaseURL)
|
2026-04-27 12:35:03 +09:00
|
|
|
if err != nil {
|
|
|
|
|
log.Fatalf("open database: %v", err)
|
|
|
|
|
}
|
2026-04-27 13:23:47 +09:00
|
|
|
pool = p
|
2026-04-27 12:35:03 +09:00
|
|
|
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)
|
2026-04-26 16:39:19 +09:00
|
|
|
progress := progression.NewService(memory)
|
2026-04-27 12:35:03 +09:00
|
|
|
onto := ontology.NewService(ontologyStore)
|
|
|
|
|
assets := teachingassets.NewService(assetsStore, onto, cfg.ImageModelKey)
|
|
|
|
|
service := interview.NewService(interviewStore, runner, memory)
|
2026-04-26 17:54:23 +09:00
|
|
|
handler := httpapi.NewHandler(cfg, service, memory, progress, onto, assets)
|
2026-04-26 16:14:31 +09:00
|
|
|
|
2026-04-27 13:23:47 +09:00
|
|
|
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")
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-26 16:14:31 +09:00
|
|
|
return &http.Server{
|
|
|
|
|
Addr: cfg.HTTPAddr,
|
2026-04-27 13:23:47 +09:00
|
|
|
Handler: mux,
|
2026-04-26 16:14:31 +09:00
|
|
|
}
|
|
|
|
|
}
|