package sitebuilder import ( "context" "errors" "gopkg.in/yaml.v3" "lmika.dev/lmika/hugo-cms/models" "lmika.dev/lmika/hugo-cms/providers/hugo" "log" "os" "path/filepath" "time" ) func (s *Service) WritePost(site models.Site, post models.Post) models.Job { return models.Job{ Do: func(ctx context.Context) error { rbn, err := s.fullRebuildNecessary(ctx, site) if err != nil { return err } else if rbn { return s.RebuildSite(site, site).Do(ctx) } if err := s.writePost(site, post); err != nil { return err } return s.publish(ctx, 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) DeletePost(site models.Site, post models.Post) models.Job { return models.Jobs( models.Job{ Do: func(ctx context.Context) error { themeMeta, ok := s.themes.Lookup(site.Theme) if !ok { return errors.New("theme not found") } postFilename := s.postFilename(site, themeMeta, post) if _, err := os.Stat(postFilename); err != nil { if errors.Is(err, os.ErrNotExist) { return nil } return err } if os.Remove(postFilename) != nil { return nil } return nil }, }, s.Publish(site), ) } 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 := s.postFilename(site, themeMeta, post) 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) postFilename(site models.Site, themeMeta models.ThemeMeta, post models.Post) string { return filepath.Join(s.hugo.SiteStagingDir(site, hugo.ContentSiteDir), themeMeta.PostDir, post.CreatedAt.Format("2006-01-02-150405.md")) }