package sitebuilder import ( "context" "errors" "gopkg.in/yaml.v3" "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" "os" "path/filepath" "time" ) 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 }, } } 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 }, } }