pages: some fixups
This commit is contained in:
parent
68aa9c0e13
commit
295811411e
|
@ -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"`
|
||||||
|
|
2
main.go
2
main.go
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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 }}
|
||||||
|
|
Loading…
Reference in a new issue