package sitebuilder import ( "context" "fmt" "lmika.dev/lmika/hugo-cms/models" "lmika.dev/pkg/modash/momap" "os" "time" ) func (s *Service) WritePage(site models.Site, bundle models.Bundle, page models.Page) models.Job { return models.Job{ Do: func(ctx context.Context) error { s.signalSiteBuildingStarted(ctx, site) defer s.signalSiteBuildingFinished(ctx, site) rbn, err := s.fullRebuildNecessary(ctx, site) if err != nil { return err } else if rbn { return s.rebuildSite(ctx, site, site) } themeMeta, ok := s.themes.Lookup(site.Theme) if !ok { return fmt.Errorf("theme %s not found in themes", site.Theme) } if err := s.writePage(site, themeMeta, bundle, page); err != nil { return err } return s.publish(ctx, site) }, } } func (s *Service) DeletePage(site models.Site, page models.Page) models.Job { return models.Job{ Do: func(ctx context.Context) error { s.signalSiteBuildingStarted(ctx, site) defer s.signalSiteBuildingFinished(ctx, site) bundle, err := s.db.GetBundleWithID(ctx, page.BundleID) if err != nil { return err } postFilename := s.pageFilename(site, bundle, page) if os.Remove(postFilename) != nil { return nil } // TODO: if dir is empty, delete it return s.publish(ctx, site) }, } } func (s *Service) writeAllPages(ctx context.Context, site models.Site) error { themeMeta, ok := s.themes.Lookup(site.Theme) if !ok { return fmt.Errorf("theme %s not found in themes", site.Theme) } bundles, err := s.db.ListBundles(ctx, site.ID) if err != nil { return err } bundlesByID := momap.FromSlice(bundles, func(b models.Bundle) (int64, models.Bundle) { return b.ID, b }) var startId int64 for { pages, err := s.db.ListPublishablePages(ctx, int64(startId), site.ID) if err != nil { return err } else if len(pages) == 0 { return nil } for _, page := range pages { if err := s.writePage(site, themeMeta, bundlesByID[page.BundleID], page); err != nil { return err } } startId = pages[len(pages)-1].ID } } func (s *Service) writePage(site models.Site, themeMeta models.ThemeMeta, bundle models.Bundle, page models.Page) error { postFilename := s.pageFilename(site, bundle, page) frontMatter := map[string]any{ "date": page.PublishDate.Format(time.RFC3339), } if page.Title != "" { frontMatter["title"] = page.Title } else if themeMeta.PreferTitle { frontMatter["title"] = page.PublishDate.Format(time.ANSIC) } return s.writeMarkdownFile(postFilename, frontMatter, page.Body) }