pages: some fixups

This commit is contained in:
Leon Mika 2025-02-18 21:26:24 +11:00
parent 68aa9c0e13
commit 295811411e
7 changed files with 64 additions and 39 deletions

View file

@ -10,6 +10,7 @@ type Config struct {
NetlifyAuthToken string `env:"NETLIFY_AUTH_TOKEN"` NetlifyAuthToken string `env:"NETLIFY_AUTH_TOKEN"`
DataDir string `env:"DATA_DIR"` DataDir string `env:"DATA_DIR"`
EncryptedCookieKey string `env:"ENCRYPTED_COOKIE_KEY"` EncryptedCookieKey string `env:"ENCRYPTED_COOKIE_KEY"`
BaseURL string `env:"BASE_URL,default=http://localhost:3000/"`
DataStagingDir string `env:"DATA_STAGING_DIR,default=staging"` DataStagingDir string `env:"DATA_STAGING_DIR,default=staging"`
DataScratchDir string `env:"DATA_SCRATCH_DIR,default=scratch"` DataScratchDir string `env:"DATA_SCRATCH_DIR,default=scratch"`

View file

@ -72,7 +72,7 @@ func main() {
return return
} }
hugoProvider, err := hugo.New(cfg.StagingDir(), cfg.PreviewDir(), cfg.ScratchDir()) hugoProvider, err := hugo.New(cfg.StagingDir(), cfg.BaseURL, cfg.PreviewDir(), cfg.ScratchDir())
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }

View file

@ -2,26 +2,33 @@ package hugo
import ( import (
"context" "context"
"fmt"
"gopkg.in/yaml.v3" "gopkg.in/yaml.v3"
"lmika.dev/lmika/hugo-cms/models" "lmika.dev/lmika/hugo-cms/models"
"log" "log"
"net/url"
"os" "os"
"os/exec" "os/exec"
"path/filepath" "path/filepath"
) )
type Provider struct { type Provider struct {
stagingDir string stagingDir string
previewDir string previewDir string
scratchDir string previewBaseURL *url.URL
scratchDir string
} }
func New(stagingDir, previewDir, scratchDir string) (*Provider, error) { func New(stagingDir, previewBaseURL, previewDir, scratchDir string) (*Provider, error) {
baseURL, err := url.Parse(previewBaseURL)
if err != nil {
return nil, err
}
return &Provider{ return &Provider{
stagingDir: stagingDir, stagingDir: stagingDir,
previewDir: previewDir, previewBaseURL: baseURL,
scratchDir: scratchDir, previewDir: previewDir,
scratchDir: scratchDir,
}, nil }, nil
} }
@ -51,8 +58,12 @@ func (p *Provider) NewSite(ctx context.Context, site models.Site) error {
} }
func (p *Provider) PreviewSite(ctx context.Context, site models.Site) (outDir string, err error) { func (p *Provider) PreviewSite(ctx context.Context, site models.Site) (outDir string, err error) {
previewURL, err := p.previewBaseURL.Parse("preview/" + site.Name)
if err != nil {
return "", err
}
previewTarget := models.PublishTarget{ previewTarget := models.PublishTarget{
URL: fmt.Sprintf("http://localhost:3000/preview/%s", site.Name), URL: previewURL.String(),
} }
return p.publishSiteAt(ctx, p.previewDir, site, previewTarget, "hugoPreview.yaml") return p.publishSiteAt(ctx, p.previewDir, site, previewTarget, "hugoPreview.yaml")
@ -80,6 +91,7 @@ func (p *Provider) publishSiteAt(ctx context.Context, dir string, site models.Si
cmd := exec.CommandContext(ctx, "hugo", cmd := exec.CommandContext(ctx, "hugo",
"--source", baseSiteDir, "--source", baseSiteDir,
"--destination", outDir, "--destination", outDir,
"--quiet",
"--config", filepath.Join(baseSiteDir, configFile), "--config", filepath.Join(baseSiteDir, configFile),
"--baseURL", target.URL) "--baseURL", target.URL)
cmd.Stderr = os.Stderr cmd.Stderr = os.Stderr
@ -91,12 +103,11 @@ func (p *Provider) publishSiteAt(ctx context.Context, dir string, site models.Si
return outDir, nil return outDir, nil
} }
func (p *Provider) ReconfigureSite(ctx context.Context, configBase string, site models.Site) error { func (p *Provider) ReconfigureSite(ctx context.Context, isPreviewConfig bool, configBase string, site models.Site) error {
hugoCfg := hugoConfig{ hugoCfg := hugoConfig{
Title: site.Title, Title: site.Title,
LanguageCode: "en", LanguageCode: "en",
Theme: site.Theme, Theme: site.Theme,
CanonifyURLs: configBase == "hugoPreview",
Markup: hugoConfigMarkup{ Markup: hugoConfigMarkup{
Goldmark: hugoGoldmarkConfig{ Goldmark: hugoGoldmarkConfig{
Renderer: hugoGoldmarkRendererConfig{ Renderer: hugoGoldmarkRendererConfig{
@ -106,6 +117,10 @@ func (p *Provider) ReconfigureSite(ctx context.Context, configBase string, site
}, },
} }
if isPreviewConfig {
hugoCfg.CanonifyURLs = true
}
ymlBytes, err := yaml.Marshal(hugoCfg) ymlBytes, err := yaml.Marshal(hugoCfg)
if err != nil { if err != nil {
return err return err

View file

@ -172,11 +172,11 @@ func (s *Service) createSite(ctx context.Context, site models.Site) error {
return err return err
} }
if err := s.hugo.ReconfigureSite(ctx, "hugo", site); err != nil { if err := s.hugo.ReconfigureSite(ctx, false, "hugo", site); err != nil {
return err return err
} }
if err := s.hugo.ReconfigureSite(ctx, "hugoPreview", site); err != nil { if err := s.hugo.ReconfigureSite(ctx, true, "hugoPreview", site); err != nil {
return err return err
} }

View file

@ -61,26 +61,28 @@ func (s *Service) SaveSettings(ctx context.Context, site models.Site, newSetting
return err return err
} }
pubTarget, err := s.db.GetPublishTargetBySiteRole(ctx, newSite.ID, models.TargetRoleProduction) if newSettings.TargetRef != "" && newSettings.TargetURL != "" {
if err == nil { pubTarget, err := s.db.GetPublishTargetBySiteRole(ctx, newSite.ID, models.TargetRoleProduction)
pubTarget.TargetRef = newSettings.TargetRef if err == nil {
pubTarget.URL = newSettings.TargetURL pubTarget.TargetRef = newSettings.TargetRef
if err := s.db.UpdatePublishTarget(ctx, pubTarget); err != nil { pubTarget.URL = newSettings.TargetURL
if err := s.db.UpdatePublishTarget(ctx, pubTarget); err != nil {
return err
}
} else if errors.Is(err, pgx.ErrNoRows) {
pubTarget = models.PublishTarget{
SiteID: newSite.ID,
Role: models.TargetRoleProduction,
Type: models.TargetTypeNetlify,
URL: newSettings.TargetURL,
TargetRef: newSettings.TargetRef,
}
if err := s.db.InsertPublishTarget(ctx, &pubTarget); err != nil {
return err
}
} else {
return err return err
} }
} else if errors.Is(err, pgx.ErrNoRows) {
pubTarget = models.PublishTarget{
SiteID: newSite.ID,
Role: models.TargetRoleProduction,
Type: models.TargetTypeNetlify,
URL: newSettings.TargetURL,
TargetRef: newSettings.TargetRef,
}
if err := s.db.InsertPublishTarget(ctx, &pubTarget); err != nil {
return err
}
} else {
return err
} }
return s.jobs.Queue(ctx, s.sb.RebuildSite(site, newSite)) return s.jobs.Queue(ctx, s.sb.RebuildSite(site, newSite))

View file

@ -3,6 +3,10 @@ CREATE TYPE post_state AS ENUM (
'published' 'published'
); );
CREATE TYPE post_format AS ENUM (
'markdown'
);
CREATE TYPE target_role AS ENUM ( CREATE TYPE target_role AS ENUM (
'production' 'production'
); );
@ -49,16 +53,17 @@ CREATE TABLE post_types (
); );
CREATE TABLE posts ( CREATE TABLE posts (
id BIGSERIAL NOT NULL PRIMARY KEY, id BIGSERIAL NOT NULL PRIMARY KEY,
site_id BIGINT NOT NULL, site_id BIGINT NOT NULL,
title TEXT, title TEXT,
post_type_id BIGINT, post_type_id BIGINT,
body TEXT NOT NULL, format post_format NOT NULL DEFAULT 'markdown',
state post_state NOT NULL, body TEXT NOT NULL,
props JSON NOT NULL, state post_state NOT NULL,
props JSON NOT NULL,
publish_date TIMESTAMP WITH TIME ZONE, publish_date TIMESTAMP WITH TIME ZONE,
created_at TIMESTAMP NOT NULL, created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL, updated_at TIMESTAMP NOT NULL,
FOREIGN KEY (post_type_id) REFERENCES post_types (id) ON DELETE CASCADE, FOREIGN KEY (post_type_id) REFERENCES post_types (id) ON DELETE CASCADE,
FOREIGN KEY (site_id) REFERENCES sites (id) ON DELETE CASCADE FOREIGN KEY (site_id) REFERENCES sites (id) ON DELETE CASCADE
@ -80,6 +85,7 @@ CREATE TABLE pages (
bundle_id BIGINT NOT NULL, bundle_id BIGINT NOT NULL,
name TEXT NOT NULL, name TEXT NOT NULL,
name_provenance page_name_provenance NOT NULL, name_provenance page_name_provenance NOT NULL,
format post_format NOT NULL DEFAULT 'markdown',
title TEXT, title TEXT,
post_type_id BIGINT, post_type_id BIGINT,
body TEXT NOT NULL, body TEXT NOT NULL,

View file

@ -14,6 +14,7 @@
<h1>Hugo CMS</h1> <h1>Hugo CMS</h1>
<nav> <nav>
<span>{{.site.Title}}</span> <span>{{.site.Title}}</span>
<a href="/preview/{{.site.Name}}" target="_blank">Preview</a>
{{ if .prodTarget }} {{ if .prodTarget }}
<a href="{{.prodTarget.URL}}" target="_blank">Visit</a> <a href="{{.prodTarget.URL}}" target="_blank">Visit</a>
{{ end }} {{ end }}