2025-01-26 23:19:31 +00:00
|
|
|
package sitebuilder
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"errors"
|
2025-01-27 03:23:54 +00:00
|
|
|
"gopkg.in/yaml.v3"
|
2025-01-26 23:19:31 +00:00
|
|
|
"lmika.dev/lmika/hugo-crm/models"
|
|
|
|
"lmika.dev/lmika/hugo-crm/providers/git"
|
|
|
|
"lmika.dev/lmika/hugo-crm/providers/hugo"
|
|
|
|
"lmika.dev/lmika/hugo-crm/providers/themes"
|
|
|
|
"log"
|
2025-01-27 03:23:54 +00:00
|
|
|
"os"
|
|
|
|
"path/filepath"
|
|
|
|
"time"
|
2025-01-26 23:19:31 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
type Service struct {
|
|
|
|
themes *themes.Provider
|
|
|
|
git *git.Provider
|
|
|
|
hugo *hugo.Provider
|
|
|
|
}
|
|
|
|
|
|
|
|
func New(
|
|
|
|
themes *themes.Provider,
|
|
|
|
git *git.Provider,
|
|
|
|
hugo *hugo.Provider,
|
|
|
|
) *Service {
|
|
|
|
return &Service{
|
|
|
|
themes: themes,
|
|
|
|
git: git,
|
|
|
|
hugo: hugo,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
2025-01-27 03:23:54 +00:00
|
|
|
|
|
|
|
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
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|