Siden du leter etter eksisterer ikke.
diff --git a/cmd/serve.go b/cmd/serve.go index 5935379..beb7b51 100644 --- a/cmd/serve.go +++ b/cmd/serve.go @@ -8,7 +8,9 @@ import ( "os/signal" "syscall" - "github.com/gorilla/mux" + "github.com/go-chi/chi/v5" + "github.com/go-chi/chi/v5/middleware" + "github.com/go-chi/cors" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -120,55 +122,54 @@ func runServe(cmd *cobra.Command, args []string) { contentHandler := api.NewContentHandler(database, authService) contentHandler.SetSiteManager(siteManager) - // Setup router - router := mux.NewRouter() + // Setup Chi router + router := chi.NewRouter() - // Add middleware - router.Use(api.CORSMiddleware) - router.Use(api.LoggingMiddleware) + // Add Chi middleware + router.Use(middleware.Logger) + router.Use(middleware.Recoverer) + router.Use(cors.Handler(cors.Options{ + AllowedOrigins: []string{"*"}, // In dev mode, allow all origins + AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}, + AllowedHeaders: []string{"*"}, + ExposedHeaders: []string{"Link"}, + AllowCredentials: true, + MaxAge: 300, // Maximum value not ignored by any of major browsers + })) router.Use(api.ContentTypeMiddleware) // Health check endpoint - router.HandleFunc("/health", api.HealthMiddleware()) - - // API routes - apiRouter := router.PathPrefix("/api").Subrouter() - - // Content endpoints - contentRouter := apiRouter.PathPrefix("/content").Subrouter() - contentRouter.HandleFunc("/bulk", contentHandler.GetBulkContent).Methods("GET") - contentRouter.HandleFunc("/{id}", contentHandler.GetContent).Methods("GET") - - contentRouter.HandleFunc("", contentHandler.GetAllContent).Methods("GET") - contentRouter.HandleFunc("", contentHandler.CreateContent).Methods("POST") - - // Version control endpoints - contentRouter.HandleFunc("/{id}/versions", contentHandler.GetContentVersions).Methods("GET") - contentRouter.HandleFunc("/{id}/rollback", contentHandler.RollbackContent).Methods("POST") - - // Site enhancement endpoint - apiRouter.HandleFunc("/enhance", contentHandler.EnhanceSite).Methods("POST") + router.Get("/health", api.HealthMiddleware()) // Static library serving (for demo sites) - router.HandleFunc("/insertr.js", contentHandler.ServeInsertrJS).Methods("GET") + router.Get("/insertr.js", contentHandler.ServeInsertrJS) + + // API routes + router.Route("/api", func(apiRouter chi.Router) { + // Site enhancement endpoint + apiRouter.Post("/enhance", contentHandler.EnhanceSite) + + // Content endpoints + apiRouter.Route("/content", func(contentRouter chi.Router) { + contentRouter.Get("/bulk", contentHandler.GetBulkContent) + contentRouter.Get("/{id}", contentHandler.GetContent) + contentRouter.Get("/", contentHandler.GetAllContent) + contentRouter.Post("/", contentHandler.CreateContent) + + // Version control endpoints + contentRouter.Get("/{id}/versions", contentHandler.GetContentVersions) + contentRouter.Post("/{id}/rollback", contentHandler.RollbackContent) + }) + }) // Static site serving - serve registered sites at /sites/{site_id} - siteRouter := router.PathPrefix("/sites").Subrouter() + // This fixes the MIME type issues with Chi's FileServer for siteID, siteConfig := range siteManager.GetAllSites() { log.Printf("đ Serving site %s from %s at /sites/%s/", siteID, siteConfig.Path, siteID) - siteRouter.PathPrefix("/" + siteID + "/").Handler( - http.StripPrefix("/sites/"+siteID+"/", - http.FileServer(http.Dir(siteConfig.Path)))) + fileServer := http.FileServer(http.Dir(siteConfig.Path)) + router.Handle("/sites/"+siteID+"/*", http.StripPrefix("/sites/"+siteID+"/", fileServer)) } - // Handle CORS preflight requests explicitly - contentRouter.HandleFunc("/{id}", api.CORSPreflightHandler).Methods("OPTIONS") - contentRouter.HandleFunc("", api.CORSPreflightHandler).Methods("OPTIONS") - contentRouter.HandleFunc("/bulk", api.CORSPreflightHandler).Methods("OPTIONS") - contentRouter.HandleFunc("/{id}/versions", api.CORSPreflightHandler).Methods("OPTIONS") - contentRouter.HandleFunc("/{id}/rollback", api.CORSPreflightHandler).Methods("OPTIONS") - apiRouter.HandleFunc("/enhance", api.CORSPreflightHandler).Methods("OPTIONS") - // Start server addr := fmt.Sprintf(":%d", port) mode := "production" diff --git a/demos/devigo-web/404.html b/demos/devigo-web/404.html new file mode 100644 index 0000000..1b339e9 --- /dev/null +++ b/demos/devigo-web/404.html @@ -0,0 +1,5 @@ +
Jeg har sju Är pÄ folkeskolen, tre Är pÄ gymnas, men etter to netter pÄ en husmorsskole gikk utdannelsen i knas!
+ VÄr tjeneste er Ä sÞrge for at dine selgere yter sitt beste. SÄ selger du mer!
+ Kontakt oss + + + Les mer +Salg er ikke bare et yrke, men en kultur. Vi kick-starter dine nye ansattes selvtillit
+Ved Ă„ investere i selgeren…
+Lorem ipsum dolor sit amet, officia excepteur ex fugiat reprehenderit enim labore culpa sint ad nisi Lorem pariatur mollit ex esse exercitation amet. Nisi anim cupidatat excepteur officia. Reprehenderit nostrud nostrud ipsum Lorem est aliquip amet voluptate voluptate dolor minim nulla est proident. Nostrud officia pariatur ut officia. Sit irure elit esse ea nulla sunt ex occaecat reprehenderit commodo officia dolor Lorem duis laboris cupidatat officia voluptate. Culpa proident adipisicing id nulla nisi laboris ex
+Ble stiftet i Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley
+
+ + Jeg har sju Är pÄ folkeskolen, tre Är pÄ gymnas, men etter to netter pÄ en husmorsskole gikk utdannelsen i knas! +
+ +Ikke tro pÄ oss, tro pÄ vÄre fantastiske kunder
+Vi svarer sÄ fort vi kan, vanligvis samme dag.
+${search_no_results} "${escapeHTML(e)}"
+#{description}
#{ end } +#{content}
+${e.section}
+ ${d} +Jeg har sju Är pÄ folkeskolen, tre Är pÄ gymnas, men etter to netter pÄ en husmorsskole gikk utdannelsen i knas!

VÄr tjeneste er Ä sÞrge for at dine selgere yter sitt beste. SÄ selger du mer!
Kontakt oss + +Les merSalg er ikke bare et yrke, men en kultur. Vi kick-starter dine nye ansattes selvtillit
Ved Ă„ investere i selgeren…
Lorem ipsum dolor sit amet, officia excepteur ex fugiat reprehenderit enim labore culpa sint ad nisi Lorem pariatur mollit ex esse exercitation amet. Nisi anim cupidatat excepteur officia. Reprehenderit nostrud nostrud ipsum Lorem est aliquip amet voluptate voluptate dolor minim nulla est proident. Nostrud officia pariatur ut officia. Sit irure elit esse ea nulla sunt ex occaecat reprehenderit commodo officia dolor Lorem duis laboris cupidatat officia voluptate. Culpa proident adipisicing id nulla nisi laboris ex
Ble stiftet i Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry’s standard dummy text ever since the 1500s, when an unknown printer took a galley

Jeg har sju Är pÄ folkeskolen, tre Är pÄ gymnas, men etter to netter pÄ en husmorsskole gikk utdannelsen i knas!
Ikke tro pÄ oss, tro pÄ vÄre fantastiske kunder
Du kan bruke skjema nedenfor til Ä sende oss en henvendelse, eller ta kontakt pÄ telefon.
${search_no_results} "${escapeHTML(e)}"
+#{description}
#{ end } +#{content}
+${e.section}
+ ${d} +Du kan bruke skjema nedenfor til Ä sende oss en henvendelse, eller ta kontakt pÄ telefon.
Du kan bruke skjema nedenfor til Ä sende oss en henvendelse, eller ta kontakt pÄ telefon.