diff --git a/gen/sqlc/dbq/sites.sql.go b/gen/sqlc/dbq/sites.sql.go index 432289b..3ba7978 100644 --- a/gen/sqlc/dbq/sites.sql.go +++ b/gen/sqlc/dbq/sites.sql.go @@ -76,28 +76,3 @@ 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 d032137..f64997c 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-20250201221851-97d4b9b4a1ac // indirect + lmika.dev/pkg/modash v0.0.0-20250127022145-5dcbffe270a1 // indirect ) diff --git a/go.sum b/go.sum index cc84584..9d4e412 100644 --- a/go.sum +++ b/go.sum @@ -97,5 +97,3 @@ 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 cc4ceee..cded58a 100644 --- a/handlers/site.go +++ b/handlers/site.go @@ -46,27 +46,6 @@ 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 76cc66a..0badf3f 100644 --- a/main.go +++ b/main.go @@ -129,9 +129,6 @@ 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 3b07e0e..72094a8 100644 --- a/models/theme.go +++ b/models/theme.go @@ -1,7 +1,6 @@ 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 75c2c88..fac59fa 100644 --- a/providers/db/sites.go +++ b/providers/db/sites.go @@ -35,12 +35,3 @@ 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/config.go b/providers/hugo/config.go deleted file mode 100644 index e888090..0000000 --- a/providers/hugo/config.go +++ /dev/null @@ -1,22 +0,0 @@ -package hugo - -type hugoConfig struct { - BaseURL string `yaml:"baseURL,omitempty"` - LanguageCode string `yaml:"languageCode"` - Title string `yaml:"title"` - Theme string `yaml:"theme"` - - Markup hugoConfigMarkup `yaml:"markup"` -} - -type hugoConfigMarkup struct { - Goldmark hugoGoldmarkConfig `yaml:"goldmark"` -} - -type hugoGoldmarkConfig struct { - Renderer hugoGoldmarkRendererConfig `yaml:"renderer"` -} - -type hugoGoldmarkRendererConfig struct { - Unsafe bool `yaml:"unsafe"` -} diff --git a/providers/hugo/provider.go b/providers/hugo/provider.go index 7fc516a..e88f614 100644 --- a/providers/hugo/provider.go +++ b/providers/hugo/provider.go @@ -1,24 +1,33 @@ package hugo import ( + "bytes" "context" - "gopkg.in/yaml.v3" "lmika.dev/lmika/hugo-cms/models" + "lmika.dev/lmika/hugo-cms/providers/hugo/tmpls" "log" "os" "os/exec" "path/filepath" + "text/template" ) type Provider struct { stagingDir string scratchDir string + tmpls *template.Template } func New(stagingDir, scratchDir string) (*Provider, error) { + ts, err := template.ParseFS(tmpls.FS, "*.tmpl") + if err != nil { + return nil, err + } + return &Provider{ stagingDir: stagingDir, scratchDir: scratchDir, + tmpls: ts, }, nil } @@ -39,9 +48,7 @@ func (p *Provider) NewSite(ctx context.Context, site models.Site) error { } // Create the new site - if err := exec.CommandContext(ctx, "hugo", "new", "site", - "--config=hugo.yaml", - p.SiteStagingDir(site, BaseSiteDir)).Run(); err != nil { + if err := exec.CommandContext(ctx, "hugo", "new", "site", p.SiteStagingDir(site, BaseSiteDir)).Run(); err != nil { return err } return nil @@ -79,33 +86,18 @@ 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.Title, - LanguageCode: "en", - Theme: site.Theme, - Markup: hugoConfigMarkup{ - Goldmark: hugoGoldmarkConfig{ - Renderer: hugoGoldmarkRendererConfig{ - Unsafe: true, - }, - }, - }, - } - - ymlBytes, err := yaml.Marshal(hugoCfg) - if err != nil { + // Reconfigure the site + var hugoCfg bytes.Buffer + if err := p.tmpls.ExecuteTemplate(&hugoCfg, "config.toml.tmpl", struct { + Site models.Site + }{ + Site: site, + }); err != nil { return err } - if err := os.WriteFile(filepath.Join(p.SiteStagingDir(site, BaseSiteDir), "hugo.yaml"), ymlBytes, 0644); err != nil { + if err := os.WriteFile(filepath.Join(p.SiteStagingDir(site, BaseSiteDir), "hugo.toml"), hugoCfg.Bytes(), 0644); err != nil { return err } - - if _, err := os.Stat(filepath.Join(p.SiteStagingDir(site, BaseSiteDir), "hugo.toml")); err == nil { - if err := os.Remove(filepath.Join(p.SiteStagingDir(site, BaseSiteDir), "hugo.toml")); err != nil { - return err - } - } - return nil } diff --git a/providers/hugo/tmpls/config.toml.tmpl b/providers/hugo/tmpls/config.toml.tmpl new file mode 100644 index 0000000..8960ff4 --- /dev/null +++ b/providers/hugo/tmpls/config.toml.tmpl @@ -0,0 +1,5 @@ +baseURL = 'https://example.com/' +languageCode = 'en-us' +title = {{.Site.Title | printf "%q"}} + +theme = {{.Site.Theme | printf "%q"}} \ No newline at end of file diff --git a/providers/hugo/tmpls/fs.go b/providers/hugo/tmpls/fs.go new file mode 100644 index 0000000..f3d0429 --- /dev/null +++ b/providers/hugo/tmpls/fs.go @@ -0,0 +1,6 @@ +package tmpls + +import "embed" + +//go:embed *.tmpl +var FS embed.FS diff --git a/providers/themes/meta.go b/providers/themes/meta.go index c0a48a2..e09798e 100644 --- a/providers/themes/meta.go +++ b/providers/themes/meta.go @@ -2,26 +2,11 @@ package themes import "lmika.dev/lmika/hugo-cms/models" -var themes = []models.ThemeMeta{ - { - ID: "bear", - Name: "Bear", +var themes = map[string]models.ThemeMeta{ + "bear": models.ThemeMeta{ + 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 46945c7..762b16f 100644 --- a/providers/themes/provider.go +++ b/providers/themes/provider.go @@ -1,33 +1,14 @@ package themes -import ( - "lmika.dev/lmika/hugo-cms/models" - "lmika.dev/pkg/modash/momap" - "slices" - "sort" -) +import "lmika.dev/lmika/hugo-cms/models" -type Provider struct { - themes []models.ThemeMeta - themeIndex map[string]models.ThemeMeta -} +type Provider struct{} func New() *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 + return &Provider{} } func (p *Provider) Lookup(name string) (models.ThemeMeta, bool) { - t, ok := p.themeIndex[name] + t, ok := themes[name] return t, ok } diff --git a/services/sitebuilder/posts.go b/services/sitebuilder/posts.go index 30e44ef..6cf1f14 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, site).Do(ctx) + return s.RebuildSite(site).Do(ctx) } if err := s.writePost(site, post); err != nil { diff --git a/services/sitebuilder/service.go b/services/sitebuilder/service.go index 79bc879..ad909b2 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(oldSite, newSite models.Site) models.Job { +func (s *Service) RebuildSite(site models.Site) models.Job { return models.Jobs( models.Job{ Do: func(ctx context.Context) error { // Teardown the existing site - siteDir := s.hugo.SiteStagingDir(oldSite, hugo.BaseSiteDir) + siteDir := s.hugo.SiteStagingDir(site, hugo.BaseSiteDir) if err := os.RemoveAll(siteDir); err != nil { return err } return nil }, }, - s.CreateNewSite(newSite), - s.WriteAllPosts(newSite), - s.Publish(newSite), + s.CreateNewSite(site), + s.WriteAllPosts(site), + s.Publish(site), ) } @@ -72,7 +72,7 @@ func (s *Service) fullRebuildNecessary(ctx context.Context, site models.Site) (b } filesMustExists := []string{ - filepath.Join(s.hugo.SiteStagingDir(site, hugo.BaseSiteDir), "hugo.yaml"), + filepath.Join(s.hugo.SiteStagingDir(site, hugo.BaseSiteDir), "hugo.toml"), } for _, dir := range dirsMustExists { diff --git a/services/sites/service.go b/services/sites/service.go index af5d853..53a0492 100644 --- a/services/sites/service.go +++ b/services/sites/service.go @@ -51,7 +51,6 @@ 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) @@ -64,54 +63,25 @@ func (s *Service) CreateSite(ctx context.Context, user models.User, name string) } // TEMP - /* - if err := s.db.InsertPublishTarget(ctx, &models.PublishTarget{ - SiteID: newSite.ID, - Role: models.TargetRoleProduction, - Type: models.TargetTypeNetlify, - URL: "https://meek-meringue-060cfc.netlify.app/", - TargetRef: "e628dc6e-e6e1-45a9-847a-982adef940a8", - }); err != nil { - return models.Site{}, err - } - */ + if err := s.db.InsertPublishTarget(ctx, &models.PublishTarget{ + SiteID: newSite.ID, + Role: models.TargetRoleProduction, + Type: models.TargetTypeNetlify, + URL: "https://meek-meringue-060cfc.netlify.app/", + TargetRef: "e628dc6e-e6e1-45a9-847a-982adef940a8", + }); err != nil { + return models.Site{}, err + } 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, site)) -} - -func (s *Service) Themes() []models.ThemeMeta { - return s.themes.Themes() + return s.jobs.Queue(ctx, s.sb.RebuildSite(site)) } func normaliseName(name string) string { diff --git a/sql/queries/sites.sql b/sql/queries/sites.sql index d858afa..c71346c 100644 --- a/sql/queries/sites.sql +++ b/sql/queries/sites.sql @@ -12,11 +12,4 @@ INSERT INTO sites ( theme, props ) VALUES ($1, $2, $3, $4, $5) -RETURNING id; - --- name: UpdateSite :exec -UPDATE sites SET - name = $2, - title = $3, - theme = $4 -WHERE id = $1; \ No newline at end of file +RETURNING id; \ No newline at end of file diff --git a/templates/fs.go b/templates/fs.go index a8b1117..aedde93 100644 --- a/templates/fs.go +++ b/templates/fs.go @@ -6,5 +6,4 @@ 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 a946e46..789354e 100644 --- a/templates/layouts/site.html +++ b/templates/layouts/site.html @@ -12,7 +12,7 @@

Hugo CMS