hugo-cms/main.go
2025-02-01 11:04:32 +11:00

143 lines
3.9 KiB
Go

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()
log.Println("Connected to database")
if err := dbp.Migrate(context.Background()); err != nil {
log.Fatal(err)
}
log.Println("Database migrated")
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}
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...")
}