Have got publishing to Netlify
This commit is contained in:
parent
8e0ffb6c24
commit
7ef6725bdb
23 changed files with 667 additions and 109 deletions
|
|
@ -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
42
providers/db/publish.go
Normal 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
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
29
providers/netlify/provider.go
Normal file
29
providers/netlify/provider.go
Normal 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()
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue