server.go

 1// Package server is the reusable server
 2package web
 3
 4import (
 5	"context"
 6	"net/http"
 7
 8	"github.com/charmbracelet/log"
 9	"github.com/charmbracelet/soft-serve/server/backend"
10	"github.com/charmbracelet/soft-serve/server/config"
11	"goji.io"
12	"goji.io/pat"
13)
14
15// Route is an interface for a route.
16type Route interface {
17	http.Handler
18	goji.Pattern
19}
20
21// NewRouter returns a new HTTP router.
22func NewRouter(ctx context.Context) *goji.Mux {
23	mux := goji.NewMux()
24	cfg := config.FromContext(ctx)
25	be := backend.FromContext(ctx)
26	logger := log.FromContext(ctx).WithPrefix("http")
27
28	// Middlewares
29	mux.Use(NewLoggingMiddleware(logger))
30
31	// Git routes
32	for _, service := range gitRoutes(ctx, logger) {
33		mux.Handle(service, service)
34	}
35
36	// go-get handler
37	mux.Handle(pat.Get("/*"), GoGetHandler{cfg, be})
38
39	return mux
40}