From 3774c903e237acc232063cb9754433ebdf0652fe Mon Sep 17 00:00:00 2001 From: Leon Mika Date: Sun, 2 Feb 2025 09:54:30 +1100 Subject: [PATCH] Added site setting. --- gen/sqlc/dbq/sites.sql.go | 25 +++++++++++++++++++++++++ go.mod | 2 +- go.sum | 2 ++ handlers/site.go | 21 +++++++++++++++++++++ main.go | 3 +++ models/theme.go | 1 + providers/db/sites.go | 9 +++++++++ providers/hugo/provider.go | 2 +- providers/themes/meta.go | 21 ++++++++++++++++++--- providers/themes/provider.go | 27 +++++++++++++++++++++++---- services/sitebuilder/posts.go | 2 +- services/sitebuilder/service.go | 10 +++++----- services/sites/service.go | 30 +++++++++++++++++++++++++++++- sql/queries/sites.sql | 9 ++++++++- templates/fs.go | 1 + templates/layouts/site.html | 2 +- templates/sites/settings.html | 21 +++++++++++++++++++++ 17 files changed, 170 insertions(+), 18 deletions(-) create mode 100644 templates/sites/settings.html diff --git a/gen/sqlc/dbq/sites.sql.go b/gen/sqlc/dbq/sites.sql.go index 3ba7978..432289b 100644 --- a/gen/sqlc/dbq/sites.sql.go +++ b/gen/sqlc/dbq/sites.sql.go @@ -76,3 +76,28 @@ func (q *Queries) NewSite(ctx context.Context, arg NewSiteParams) (int64, error) err := row.Scan(&id) return id, err } + +const updateSite = `-- name: UpdateSite :exec +UPDATE sites SET + name = $2, + title = $3, + theme = $4 +WHERE id = $1 +` + +type UpdateSiteParams struct { + ID int64 + Name string + Title string + Theme string +} + +func (q *Queries) UpdateSite(ctx context.Context, arg UpdateSiteParams) error { + _, err := q.db.Exec(ctx, updateSite, + arg.ID, + arg.Name, + arg.Title, + arg.Theme, + ) + return err +} diff --git a/go.mod b/go.mod index f64997c..d032137 100644 --- a/go.mod +++ b/go.mod @@ -48,5 +48,5 @@ require ( golang.org/x/sys v0.29.0 // indirect golang.org/x/text v0.21.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - lmika.dev/pkg/modash v0.0.0-20250127022145-5dcbffe270a1 // indirect + lmika.dev/pkg/modash v0.0.0-20250201221851-97d4b9b4a1ac // indirect ) diff --git a/go.sum b/go.sum index 9d4e412..cc84584 100644 --- a/go.sum +++ b/go.sum @@ -97,3 +97,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= lmika.dev/pkg/modash v0.0.0-20250127022145-5dcbffe270a1 h1:Seqp9vlIw3uJBL0V/eWIM3dAnSuToJ/cztkRQtl3g20= lmika.dev/pkg/modash v0.0.0-20250127022145-5dcbffe270a1/go.mod h1:8NDl/yR1eCCEhip9FJlVuMNXIeaztQ0Ks/tizExFcTI= +lmika.dev/pkg/modash v0.0.0-20250201221851-97d4b9b4a1ac h1:i/C+DYDCVQTQHtv7w1O8m20RMez6YS9fUIlhAGjTZhU= +lmika.dev/pkg/modash v0.0.0-20250201221851-97d4b9b4a1ac/go.mod h1:8NDl/yR1eCCEhip9FJlVuMNXIeaztQ0Ks/tizExFcTI= diff --git a/handlers/site.go b/handlers/site.go index cded58a..cc4ceee 100644 --- a/handlers/site.go +++ b/handlers/site.go @@ -46,6 +46,27 @@ func (s *Site) Show(c *fiber.Ctx) error { }, "layouts/main") } +func (s *Site) Settings(c *fiber.Ctx) error { + return c.Render("sites/settings", fiber.Map{ + "themes": s.Site.Themes(), + }, "layouts/site") +} + +func (s *Site) SaveSettings(c *fiber.Ctx) error { + site := GetSite(c) + + var req sites.NewSettings + if err := c.BodyParser(&req); err != nil { + return err + } + + if err := s.Site.SaveSettings(c.Context(), site, req); err != nil { + return err + } + + return c.Redirect(fmt.Sprintf("/sites/%v/settings", site.ID)) +} + func (s *Site) Rebuild(c *fiber.Ctx) error { if err := s.Site.Rebuild(c.UserContext(), GetSite(c)); err != nil { return err diff --git a/main.go b/main.go index 0badf3f..76cc66a 100644 --- a/main.go +++ b/main.go @@ -129,6 +129,9 @@ func main() { r.Get("/posts/:postId", postHandlers.Edit) r.Post("/posts/:postId", postHandlers.Update) r.Delete("/posts/:postId", postHandlers.Delete) + + r.Get("/settings", siteHandlers.Settings) + r.Post("/settings", siteHandlers.SaveSettings) }) jobService.Start() diff --git a/models/theme.go b/models/theme.go index 72094a8..3b07e0e 100644 --- a/models/theme.go +++ b/models/theme.go @@ -1,6 +1,7 @@ package models type ThemeMeta struct { + ID string `json:"id"` Name string `json:"name"` URL string `json:"repo"` diff --git a/providers/db/sites.go b/providers/db/sites.go index fac59fa..75c2c88 100644 --- a/providers/db/sites.go +++ b/providers/db/sites.go @@ -35,3 +35,12 @@ func (db *DB) GetSite(ctx context.Context, id int64) (models.Site, error) { Theme: site.Theme, }, nil } + +func (db *DB) UpdateSite(ctx context.Context, site models.Site) error { + return db.q.UpdateSite(ctx, dbq.UpdateSiteParams{ + ID: site.ID, + Name: site.Name, + Title: site.Title, + Theme: site.Theme, + }) +} diff --git a/providers/hugo/provider.go b/providers/hugo/provider.go index 462d1c2..7fc516a 100644 --- a/providers/hugo/provider.go +++ b/providers/hugo/provider.go @@ -80,7 +80,7 @@ func (p *Provider) PublishSite(ctx context.Context, site models.Site, target mod func (p *Provider) ReconfigureSite(ctx context.Context, site models.Site) error { hugoCfg := hugoConfig{ - Title: site.Name, + Title: site.Title, LanguageCode: "en", Theme: site.Theme, Markup: hugoConfigMarkup{ diff --git a/providers/themes/meta.go b/providers/themes/meta.go index e09798e..c0a48a2 100644 --- a/providers/themes/meta.go +++ b/providers/themes/meta.go @@ -2,11 +2,26 @@ package themes import "lmika.dev/lmika/hugo-cms/models" -var themes = map[string]models.ThemeMeta{ - "bear": models.ThemeMeta{ - Name: "bear", +var themes = []models.ThemeMeta{ + { + ID: "bear", + Name: "Bear", URL: "https://github.com/janraasch/hugo-bearblog", PreferTitle: true, PostDir: "blog", }, + { + ID: "terminal", + Name: "Terminal", + URL: "https://github.com/panr/hugo-theme-terminal", + PreferTitle: true, + PostDir: "posts", + }, + { + ID: "yingyang", + Name: "Yingyang", + URL: "https://github.com/joway/hugo-theme-yinyang", + PreferTitle: true, + PostDir: "posts", + }, } diff --git a/providers/themes/provider.go b/providers/themes/provider.go index 762b16f..46945c7 100644 --- a/providers/themes/provider.go +++ b/providers/themes/provider.go @@ -1,14 +1,33 @@ package themes -import "lmika.dev/lmika/hugo-cms/models" +import ( + "lmika.dev/lmika/hugo-cms/models" + "lmika.dev/pkg/modash/momap" + "slices" + "sort" +) -type Provider struct{} +type Provider struct { + themes []models.ThemeMeta + themeIndex map[string]models.ThemeMeta +} func New() *Provider { - return &Provider{} + ts := slices.Clone(themes) + sort.Slice(ts, func(i, j int) bool { return ts[i].Name < ts[j].Name }) + ti := momap.IndexSlice(themes, func(m models.ThemeMeta) string { return m.ID }) + + return &Provider{ + themes: ts, + themeIndex: ti, + } +} + +func (p *Provider) Themes() []models.ThemeMeta { + return p.themes } func (p *Provider) Lookup(name string) (models.ThemeMeta, bool) { - t, ok := themes[name] + t, ok := p.themeIndex[name] return t, ok } diff --git a/services/sitebuilder/posts.go b/services/sitebuilder/posts.go index 6cf1f14..30e44ef 100644 --- a/services/sitebuilder/posts.go +++ b/services/sitebuilder/posts.go @@ -19,7 +19,7 @@ func (s *Service) WritePost(site models.Site, post models.Post) models.Job { if err != nil { return err } else if rbn { - return s.RebuildSite(site).Do(ctx) + return s.RebuildSite(site, site).Do(ctx) } if err := s.writePost(site, post); err != nil { diff --git a/services/sitebuilder/service.go b/services/sitebuilder/service.go index 0b3084a..79bc879 100644 --- a/services/sitebuilder/service.go +++ b/services/sitebuilder/service.go @@ -46,21 +46,21 @@ func (s *Service) CreateNewSite(site models.Site) models.Job { } } -func (s *Service) RebuildSite(site models.Site) models.Job { +func (s *Service) RebuildSite(oldSite, newSite models.Site) models.Job { return models.Jobs( models.Job{ Do: func(ctx context.Context) error { // Teardown the existing site - siteDir := s.hugo.SiteStagingDir(site, hugo.BaseSiteDir) + siteDir := s.hugo.SiteStagingDir(oldSite, hugo.BaseSiteDir) if err := os.RemoveAll(siteDir); err != nil { return err } return nil }, }, - s.CreateNewSite(site), - s.WriteAllPosts(site), - s.Publish(site), + s.CreateNewSite(newSite), + s.WriteAllPosts(newSite), + s.Publish(newSite), ) } diff --git a/services/sites/service.go b/services/sites/service.go index 1395ad0..af5d853 100644 --- a/services/sites/service.go +++ b/services/sites/service.go @@ -51,6 +51,7 @@ func (s *Service) CreateSite(ctx context.Context, user models.User, name string) OwnerUserID: user.ID, Title: name, Theme: "bear", + //Theme: "yingyang", } _, ok := s.themes.Lookup(newSite.Theme) @@ -78,12 +79,39 @@ func (s *Service) CreateSite(ctx context.Context, user models.User, name string) return newSite, s.jobs.Queue(ctx, s.sb.CreateNewSite(newSite)) } +func (s *Service) SaveSettings(ctx context.Context, site models.Site, newSettings NewSettings) error { + _, ok := s.themes.Lookup(newSettings.Theme) + if !ok { + return errors.New("theme not found") + } + + newSite := site + newSite.Title = newSettings.Title + newSite.Name = normaliseName(newSite.Title) + newSite.Theme = newSettings.Theme + + if err := s.db.UpdateSite(ctx, newSite); err != nil { + return err + } + + return s.jobs.Queue(ctx, s.sb.RebuildSite(site, newSite)) +} + +type NewSettings struct { + Title string `form:"title"` + Theme string `form:"theme"` +} + func (s *Service) Rebuild(ctx context.Context, site models.Site) error { if site.ID == 0 { return errors.New("site id required") } - return s.jobs.Queue(ctx, s.sb.RebuildSite(site)) + return s.jobs.Queue(ctx, s.sb.RebuildSite(site, site)) +} + +func (s *Service) Themes() []models.ThemeMeta { + return s.themes.Themes() } func normaliseName(name string) string { diff --git a/sql/queries/sites.sql b/sql/queries/sites.sql index c71346c..d858afa 100644 --- a/sql/queries/sites.sql +++ b/sql/queries/sites.sql @@ -12,4 +12,11 @@ INSERT INTO sites ( theme, props ) VALUES ($1, $2, $3, $4, $5) -RETURNING id; \ No newline at end of file +RETURNING id; + +-- name: UpdateSite :exec +UPDATE sites SET + name = $2, + title = $3, + theme = $4 +WHERE id = $1; \ No newline at end of file diff --git a/templates/fs.go b/templates/fs.go index aedde93..a8b1117 100644 --- a/templates/fs.go +++ b/templates/fs.go @@ -6,4 +6,5 @@ import "embed" //go:embed auth/*.html //go:embed layouts/*.html //go:embed posts/*.html +//go:embed sites/*.html var FS embed.FS diff --git a/templates/layouts/site.html b/templates/layouts/site.html index 789354e..a946e46 100644 --- a/templates/layouts/site.html +++ b/templates/layouts/site.html @@ -12,7 +12,7 @@

Hugo CMS