package server import ( "database/sql" "log/slog" "net/http" "git.runcible.io/learning/ratchet/internal/model" "github.com/alexedwards/scs/v2" "github.com/go-playground/form/v4" ) type RatchetApp struct { http.Handler logger *slog.Logger templateCache *TemplateCache //Services used by HTTP routes snippetService *model.SnippetService UserService model.UserService formDecoder *form.Decoder sessionManager *scs.SessionManager } func NewRatchetApp(logger *slog.Logger, tc *TemplateCache, db *sql.DB, sm *scs.SessionManager) *RatchetApp { rs := new(RatchetApp) rs.logger = logger rs.snippetService = &model.SnippetService{DB: db} rs.formDecoder = form.NewDecoder() rs.templateCache = tc rs.sessionManager = sm // TODO implement middleware that disables directory listings fileServer := http.FileServer(http.Dir("./ui/static/")) router := http.NewServeMux() // Subtree pattern for static assets router.Handle("GET /static/", http.StripPrefix("/static/", fileServer)) // Mux Router implements the Handler interface. AKA it has a ServeHTTP receiver. // SEE we can really clean things up by moving this into routes.go and handlers.go wrappedMux := addRoutes(router, rs.logger, rs.templateCache, db, rs.formDecoder, sm, rs.snippetService) rs.Handler = CommonHeaderMiddleware(wrappedMux) rs.Handler = RequestLoggingMiddleware(rs.Handler, logger) rs.Handler = RecoveryMiddleware(rs.Handler) return rs }