package main import ( "bytes" "context" "flag" "fmt" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/encryptcookie" "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/services/users" "lmika.dev/lmika/hugo-cms/templates" "log" "net/http" ) func main() { flagGenKey := flag.Bool("gen-key", false, "Generate a new key") flagUser := flag.String("user", "", "add new user") flagPassword := flag.String("password", "", "add new password") flag.Parse() if *flagGenKey { fmt.Println(encryptcookie.GenerateKey()) return } 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() userService := users.NewService(dbp) if *flagUser != "" { if _, err := userService.AddUser(context.Background(), users.NewUser{ Email: *flagUser, Password: *flagPassword, }); err != nil { log.Fatal(err) } log.Println("User added") return } 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) indexHandlers := handlers.IndexHandler{} siteHandlers := handlers.Site{Site: siteService} postHandlers := handlers.Post{Post: postService} authHandlers := handlers.AuthHandler{UserService: userService} 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 } if cfg.EncryptedCookieKey == "" { log.Println("No encrypt cookie key defined. Generating random key") cfg.EncryptedCookieKey = encryptcookie.GenerateKey() } app := fiber.New(fiber.Config{ Views: tmplEngine, PassLocalsToViews: true, }) app.Use(encryptcookie.New(encryptcookie.Config{Key: cfg.EncryptedCookieKey})) app.Use("/assets", filesystem.New(filesystem.Config{Root: http.FS(assets.FS)})) app.Get("/auth/login", authHandlers.ShowLogin) app.Post("/auth/login", authHandlers.Login) app.Use(authHandlers.RequireAuth) app.Get("/", indexHandlers.Index) 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/new", postHandlers.New) r.Post("/posts", postHandlers.Create) r.Get("/posts/:postId", postHandlers.Edit) r.Post("/posts/:postId", postHandlers.Update) r.Delete("/posts/:postId", postHandlers.Delete) }) jobService.Start() defer jobService.Stop() if err := app.Listen(":3000"); err != nil { log.Println(err) } log.Println("Shutting down...") }