Have got publishing to Netlify

This commit is contained in:
Leon Mika 2025-01-27 15:45:53 +11:00
parent 8e0ffb6c24
commit 7ef6725bdb
23 changed files with 667 additions and 109 deletions

View file

@ -6,6 +6,7 @@ import (
"lmika.dev/lmika/hugo-crm/gen/sqlc/dbq"
"lmika.dev/lmika/hugo-crm/models"
"lmika.dev/pkg/modash/moslice"
"time"
)
func (db *DB) ListPostsOfSite(ctx context.Context, siteID int64) ([]models.Post, error) {
@ -14,17 +15,20 @@ func (db *DB) ListPostsOfSite(ctx context.Context, siteID int64) ([]models.Post,
return nil, err
}
return moslice.Map(res, func(p dbq.Post) models.Post {
return models.Post{
ID: p.ID,
SiteID: p.SiteID,
Title: p.Title.String,
Body: p.Body,
State: models.PostState(p.State),
PostDate: p.PostDate.Time,
CreatedAt: p.CreatedAt.Time,
}
}), nil
return moslice.Map(res, dbPostToPost), nil
}
func (db *DB) ListPublishablePosts(ctx context.Context, fromID, siteID int64, now time.Time) ([]models.Post, error) {
res, err := db.q.ListPublishablePosts(ctx, dbq.ListPublishablePostsParams{
ID: fromID,
SiteID: siteID,
PostDate: pgtype.Timestamptz{Time: now, Valid: true},
})
if err != nil {
return nil, err
}
return moslice.Map(res, dbPostToPost), nil
}
func (db *DB) InsertPost(ctx context.Context, p *models.Post) error {
@ -44,3 +48,15 @@ func (db *DB) InsertPost(ctx context.Context, p *models.Post) error {
p.ID = res
return nil
}
func dbPostToPost(p dbq.Post) models.Post {
return models.Post{
ID: p.ID,
SiteID: p.SiteID,
Title: p.Title.String,
Body: p.Body,
State: models.PostState(p.State),
PostDate: p.PostDate.Time,
CreatedAt: p.CreatedAt.Time,
}
}

42
providers/db/publish.go Normal file
View file

@ -0,0 +1,42 @@
package db
import (
"context"
"lmika.dev/lmika/hugo-crm/gen/sqlc/dbq"
"lmika.dev/lmika/hugo-crm/models"
"lmika.dev/pkg/modash/moslice"
)
func (db *DB) InsertPublishTarget(ctx context.Context, target *models.PublishTarget) error {
id, err := db.q.InsertPublishTarget(ctx, dbq.InsertPublishTargetParams{
SiteID: target.SiteID,
Role: dbq.TargetRole(target.Role),
TargetType: dbq.TargetType(target.Type),
Url: target.URL,
TargetRef: target.TargetRef,
})
if err != nil {
return err
}
target.ID = id
return nil
}
func (db *DB) GetPublishTargets(ctx context.Context, siteID int64) ([]models.PublishTarget, error) {
res, err := db.q.ListPublishTargetsOfRole(ctx, siteID)
if err != nil {
return nil, err
}
return moslice.Map(res, func(m dbq.PublishTarget) models.PublishTarget {
return models.PublishTarget{
ID: m.ID,
SiteID: m.SiteID,
Role: models.TargetRole(m.Role),
Type: models.TargetType(m.TargetType),
URL: m.Url,
TargetRef: m.TargetRef,
}
}), nil
}

View file

@ -14,10 +14,11 @@ import (
type Provider struct {
stagingDir string
scratchDir string
tmpls *template.Template
}
func New(stagingDir string) (*Provider, error) {
func New(stagingDir, scratchDir string) (*Provider, error) {
ts, err := template.ParseFS(tmpls.FS, "*.tmpl")
if err != nil {
return nil, err
@ -25,6 +26,7 @@ func New(stagingDir string) (*Provider, error) {
return &Provider{
stagingDir: stagingDir,
scratchDir: scratchDir,
tmpls: ts,
}, nil
}
@ -52,6 +54,37 @@ func (p *Provider) NewSite(ctx context.Context, site models.Site) error {
return nil
}
func (p *Provider) PublishSite(ctx context.Context, site models.Site, target models.PublishTarget) (outDir string, clean func(), err error) {
if err := os.MkdirAll(p.scratchDir, 0755); err != nil {
return "", nil, err
}
outDir, err = os.MkdirTemp(p.scratchDir, site.Name+"-*")
if err != nil {
return "", nil, err
}
clean = func() {
os.RemoveAll(outDir)
}
outDir, err = filepath.Abs(outDir)
if err != nil {
return "", nil, err
}
cmd := exec.CommandContext(ctx, "hugo",
"--source", p.SiteStagingDir(site, BaseSiteDir),
"--destination", outDir,
"--baseURL", target.URL)
cmd.Stderr = os.Stderr
cmd.Stdout = os.Stdout
if err := cmd.Run(); err != nil {
return "", clean, err
}
return outDir, clean, nil
}
func (p *Provider) ReconfigureSite(ctx context.Context, site models.Site) error {
// Reconfigure the site
var hugoCfg bytes.Buffer

View file

@ -0,0 +1,29 @@
package netlify
import (
"context"
"fmt"
"lmika.dev/lmika/hugo-crm/models"
"os"
"os/exec"
)
type Provider struct {
authToken string
}
func New(authToken string) *Provider {
return &Provider{
authToken: authToken,
}
}
func (p *Provider) Publish(ctx context.Context, target models.PublishTarget, dir string) error {
cmd := exec.CommandContext(ctx, "netlify", "deploy", "--dir", dir, "--prod")
cmd.Env = append(os.Environ(),
fmt.Sprintf("NETLIFY_SITE_ID=%v", target.TargetRef),
fmt.Sprintf("NETLIFY_AUTH_TOKEN=%v", p.authToken))
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
return cmd.Run()
}