package main import ( "bytes" "context" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/filesystem" "github.com/gofiber/template/html/v2" "github.com/yuin/goldmark" "html/template" "lmika.dev/lmika/hugo-cms/assets" "lmika.dev/lmika/hugo-cms/config" "lmika.dev/lmika/hugo-cms/handlers" "lmika.dev/lmika/hugo-cms/providers/db" "lmika.dev/lmika/hugo-cms/providers/git" "lmika.dev/lmika/hugo-cms/providers/hugo" "lmika.dev/lmika/hugo-cms/providers/netlify" "lmika.dev/lmika/hugo-cms/providers/themes" "lmika.dev/lmika/hugo-cms/services/jobs" "lmika.dev/lmika/hugo-cms/services/posts" "lmika.dev/lmika/hugo-cms/services/sitebuilder" "lmika.dev/lmika/hugo-cms/services/sites" "lmika.dev/lmika/hugo-cms/templates" "log" "net/http" ) func main() { cfg, err := config.Load() if err != nil { log.Fatal(err) } dbp, err := db.New(cfg.DatabaseURL) if err != nil { log.Fatal(err) } defer dbp.Close() hugoProvider, err := hugo.New(cfg.StagingDir(), cfg.ScratchDir()) if err != nil { log.Fatal(err) } gitProvider := git.New() themesProvider := themes.New() netlifyProvider := netlify.New(cfg.NetlifyAuthToken) jobService := jobs.New() siteBuilderService := sitebuilder.New(dbp, themesProvider, gitProvider, hugoProvider, netlifyProvider) siteService := sites.NewService(cfg, dbp, themesProvider, siteBuilderService, jobService) postService := posts.New(dbp, siteBuilderService, jobService) siteHandlers := handlers.Site{Site: siteService} postHandlers := handlers.Post{Post: postService} log.Println("Connected to database") if err := dbp.Migrate(context.Background()); err != nil { log.Fatal(err) } log.Println("Database migrated") tmplEngine := html.NewFileSystem(http.FS(templates.FS), ".html") tmplEngine.Funcmap["markdown"] = func(s string) (template.HTML, error) { var buf bytes.Buffer if err := goldmark.Convert([]byte(s), &buf); err != nil { return "", err } return template.HTML(buf.String()), nil } app := fiber.New(fiber.Config{ Views: tmplEngine, }) app.Get("/", func(c *fiber.Ctx) error { return c.Render("index", fiber.Map{}, "layouts/main") }) app.Post("/sites", siteHandlers.Create()) app.Get("/sites/:siteId", siteHandlers.Show()) app.Route("/sites/:siteId", func(r fiber.Router) { r.Use(siteHandlers.WithSite()) r.Post("/rebuild", siteHandlers.Rebuild()) r.Get("/posts", postHandlers.Posts()) r.Get("/posts/:postId", postHandlers.Edit()) r.Get("/posts/new", postHandlers.New()) r.Post("/posts", postHandlers.Create()) r.Post("/posts/:postId", postHandlers.Update()) }) app.Use("/assets", filesystem.New(filesystem.Config{ Root: http.FS(assets.FS), })) app.Static("/assets", "./assets") jobService.Start() defer jobService.Stop() if err := app.Listen(":3000"); err != nil { log.Println(err) } log.Println("Shutting down...") }