Have got publishing to Netlify
This commit is contained in:
parent
8e0ffb6c24
commit
7ef6725bdb
23 changed files with 667 additions and 109 deletions
98
services/sitebuilder/posts.go
Normal file
98
services/sitebuilder/posts.go
Normal file
|
|
@ -0,0 +1,98 @@
|
|||
package sitebuilder
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"gopkg.in/yaml.v3"
|
||||
"lmika.dev/lmika/hugo-crm/models"
|
||||
"lmika.dev/lmika/hugo-crm/providers/hugo"
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"time"
|
||||
)
|
||||
|
||||
func (s *Service) WritePost(site models.Site, post models.Post) models.Job {
|
||||
return models.Jobs(
|
||||
models.Job{
|
||||
Do: func(ctx context.Context) error {
|
||||
return s.writePost(site, post)
|
||||
},
|
||||
},
|
||||
s.Publish(site),
|
||||
)
|
||||
}
|
||||
|
||||
func (s *Service) WriteAllPosts(site models.Site) models.Job {
|
||||
return models.Job{
|
||||
Do: func(ctx context.Context) error {
|
||||
var startId int64
|
||||
now := time.Now()
|
||||
for {
|
||||
posts, err := s.db.ListPublishablePosts(ctx, int64(startId), site.ID, now)
|
||||
if err != nil {
|
||||
return err
|
||||
} else if len(posts) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
for _, post := range posts {
|
||||
if err := s.writePost(site, post); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
startId = posts[len(posts)-1].ID
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Service) writePost(site models.Site, post models.Post) error {
|
||||
themeMeta, ok := s.themes.Lookup(site.Theme)
|
||||
if !ok {
|
||||
return errors.New("theme not found")
|
||||
}
|
||||
|
||||
postFilename := filepath.Join(s.hugo.SiteStagingDir(site, hugo.ContentSiteDir), themeMeta.PostDir, post.CreatedAt.Format("2006-01-02-150405.md"))
|
||||
|
||||
log.Printf(" .. post %v", postFilename)
|
||||
|
||||
if err := os.MkdirAll(filepath.Dir(postFilename), 0755); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
frontMatter := map[string]string{
|
||||
"date": post.PostDate.Format(time.RFC3339),
|
||||
}
|
||||
if post.Title != "" {
|
||||
frontMatter["title"] = post.Title
|
||||
} else if themeMeta.PreferTitle {
|
||||
frontMatter["title"] = post.PostDate.Format(time.ANSIC)
|
||||
}
|
||||
|
||||
fmBytes, err := yaml.Marshal(frontMatter)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
f, err := os.Create(postFilename)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
if _, err := f.WriteString("---\n"); err != nil {
|
||||
return err
|
||||
}
|
||||
if _, err := f.Write(fmBytes); err != nil {
|
||||
return err
|
||||
}
|
||||
if _, err := f.WriteString("---\n"); err != nil {
|
||||
return err
|
||||
}
|
||||
if _, err := f.WriteString(post.Body); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
40
services/sitebuilder/publish.go
Normal file
40
services/sitebuilder/publish.go
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
package sitebuilder
|
||||
|
||||
import (
|
||||
"context"
|
||||
"lmika.dev/lmika/hugo-crm/models"
|
||||
)
|
||||
|
||||
func (s *Service) Publish(site models.Site) models.Job {
|
||||
return models.Job{
|
||||
Do: func(ctx context.Context) error {
|
||||
targets, err := s.db.GetPublishTargets(ctx, site.ID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, target := range targets {
|
||||
if err := s.publishTarget(ctx, site, target); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Service) publishTarget(ctx context.Context, site models.Site, target models.PublishTarget) error {
|
||||
outDir, cleanFn, err := s.hugo.PublishSite(ctx, site, target)
|
||||
//defer func() {
|
||||
// if cleanFn != nil {
|
||||
// cleanFn()
|
||||
// }
|
||||
//}()
|
||||
_ = cleanFn
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return s.netlify.Publish(ctx, target, outDir)
|
||||
}
|
||||
|
|
@ -3,113 +3,86 @@ package sitebuilder
|
|||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"gopkg.in/yaml.v3"
|
||||
"lmika.dev/lmika/hugo-crm/models"
|
||||
"lmika.dev/lmika/hugo-crm/providers/db"
|
||||
"lmika.dev/lmika/hugo-crm/providers/git"
|
||||
"lmika.dev/lmika/hugo-crm/providers/hugo"
|
||||
"lmika.dev/lmika/hugo-crm/providers/netlify"
|
||||
"lmika.dev/lmika/hugo-crm/providers/themes"
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Service struct {
|
||||
themes *themes.Provider
|
||||
git *git.Provider
|
||||
hugo *hugo.Provider
|
||||
db *db.DB
|
||||
themes *themes.Provider
|
||||
git *git.Provider
|
||||
hugo *hugo.Provider
|
||||
netlify *netlify.Provider
|
||||
}
|
||||
|
||||
func New(
|
||||
db *db.DB,
|
||||
themes *themes.Provider,
|
||||
git *git.Provider,
|
||||
hugo *hugo.Provider,
|
||||
netlify *netlify.Provider,
|
||||
) *Service {
|
||||
return &Service{
|
||||
themes: themes,
|
||||
git: git,
|
||||
hugo: hugo,
|
||||
db: db,
|
||||
themes: themes,
|
||||
git: git,
|
||||
hugo: hugo,
|
||||
netlify: netlify,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Service) CreateNewSite(site models.Site) models.Job {
|
||||
return models.Job{
|
||||
Do: func(ctx context.Context) error {
|
||||
themeMeta, ok := s.themes.Lookup(site.Theme)
|
||||
if !ok {
|
||||
return errors.New("theme not found")
|
||||
}
|
||||
|
||||
// Build the site
|
||||
log.Printf(" .. build")
|
||||
if err := s.hugo.NewSite(ctx, site); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Setup the theme
|
||||
log.Printf(" .. theme")
|
||||
if err := s.git.Clone(ctx, themeMeta.URL, s.hugo.SiteStagingDir(site, hugo.ThemeSiteDir)); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := s.hugo.ReconfigureSite(ctx, site); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
return s.createSite(ctx, site)
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Service) WritePost(site models.Site, post models.Post) models.Job {
|
||||
return models.Job{
|
||||
Do: func(ctx context.Context) error {
|
||||
themeMeta, ok := s.themes.Lookup(site.Theme)
|
||||
if !ok {
|
||||
return errors.New("theme not found")
|
||||
}
|
||||
|
||||
postFilename := filepath.Join(s.hugo.SiteStagingDir(site, hugo.ContentSiteDir), themeMeta.PostDir, post.CreatedAt.Format("2006-01-02-150405.md"))
|
||||
|
||||
log.Printf(" .. post %v", postFilename)
|
||||
|
||||
if err := os.MkdirAll(filepath.Dir(postFilename), 0755); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
frontMatter := map[string]string{
|
||||
"date": post.PostDate.Format(time.RFC3339),
|
||||
}
|
||||
if post.Title != "" {
|
||||
frontMatter["title"] = post.Title
|
||||
} else if themeMeta.PreferTitle {
|
||||
frontMatter["title"] = post.PostDate.Format(time.ANSIC)
|
||||
}
|
||||
|
||||
fmBytes, err := yaml.Marshal(frontMatter)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
f, err := os.Create(postFilename)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
if _, err := f.WriteString("---\n"); err != nil {
|
||||
return err
|
||||
}
|
||||
if _, err := f.Write(fmBytes); err != nil {
|
||||
return err
|
||||
}
|
||||
if _, err := f.WriteString("---\n"); err != nil {
|
||||
return err
|
||||
}
|
||||
if _, err := f.WriteString(post.Body); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
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(site, hugo.BaseSiteDir)
|
||||
if err := os.RemoveAll(siteDir); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
},
|
||||
},
|
||||
}
|
||||
s.CreateNewSite(site),
|
||||
s.WriteAllPosts(site),
|
||||
s.Publish(site),
|
||||
)
|
||||
}
|
||||
|
||||
func (s *Service) createSite(ctx context.Context, site models.Site) error {
|
||||
themeMeta, ok := s.themes.Lookup(site.Theme)
|
||||
if !ok {
|
||||
return errors.New("theme not found")
|
||||
}
|
||||
|
||||
// Build the site
|
||||
log.Printf(" .. build")
|
||||
if err := s.hugo.NewSite(ctx, site); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Setup the theme
|
||||
log.Printf(" .. theme")
|
||||
if err := s.git.Clone(ctx, themeMeta.URL, s.hugo.SiteStagingDir(site, hugo.ThemeSiteDir)); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := s.hugo.ReconfigureSite(ctx, site); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue