From 3cf4294e87430d69ed3beab2d600b13f5145f642 Mon Sep 17 00:00:00 2001 From: Leon Mika Date: Sun, 16 Feb 2025 16:12:50 +1100 Subject: [PATCH] Fixed handling of content only vs structural page changes. --- services/pages/services.go | 26 ++++++++++++++++++++++-- services/sitebuilder/service.go | 36 +++++++++++++++++++++++++++++++-- 2 files changed, 58 insertions(+), 4 deletions(-) diff --git a/services/pages/services.go b/services/pages/services.go index c289946..8d43616 100644 --- a/services/pages/services.go +++ b/services/pages/services.go @@ -48,13 +48,15 @@ func (s *Service) DeletePage(ctx context.Context, site models.Site, id int) erro post, err := s.db.GetPage(ctx, int64(id)) if err != nil { return err + } else if post.SiteID != site.ID { + return errors.New("page not found") } if err := s.db.DeletePage(ctx, int64(id)); err != nil { return err } - return s.jobs.Queue(ctx, s.sb.DeletePage(site, post)) + return s.jobs.Queue(ctx, s.sb.RebuildSiteContent(site, site)) } func (s *Service) Create(ctx context.Context, site models.Site, req NewPost) (models.Page, error) { @@ -97,6 +99,10 @@ func (s *Service) Create(ctx context.Context, site models.Site, req NewPost) (mo return models.Page{}, err } + if err := s.jobs.Queue(ctx, s.sb.RebuildSiteContent(site, site)); err != nil { + return models.Page{}, err + } + return post, nil } @@ -117,6 +123,8 @@ func (s *Service) Update(ctx context.Context, site models.Site, pageID int64, re return models.Page{}, errors.New("page not found") } + oldPage := page + // Update the title if it wasn't set by the user if page.NameProvenance != models.UserNameProvenance { if req.Title == "" { @@ -134,6 +142,20 @@ func (s *Service) Update(ctx context.Context, site models.Site, pageID int64, re return models.Page{}, err } + // A content only change involves rewriting the file content. Anything else is a structural change + // that will need rewriting of all the page content. + contentOnlyChange := page.Name == oldPage.Name && page.Role == oldPage.Role + + if contentOnlyChange { + if err := s.jobs.Queue(ctx, s.sb.WritePage(site, bundle, page)); err != nil { + return models.Page{}, err + } + } else { + if err := s.jobs.Queue(ctx, s.sb.RebuildSiteContent(site, site)); err != nil { + return models.Page{}, err + } + } + return page, nil } @@ -153,7 +175,7 @@ func (s *Service) save(ctx context.Context, site models.Site, bundle models.Bund } } - return s.jobs.Queue(ctx, s.sb.WritePage(site, bundle, *page)) + return nil } func (s *Service) normalizePageName(title string) string { diff --git a/services/sitebuilder/service.go b/services/sitebuilder/service.go index b7c7faa..dabe65d 100644 --- a/services/sitebuilder/service.go +++ b/services/sitebuilder/service.go @@ -64,6 +64,17 @@ func (s *Service) RebuildSite(oldSite, newSite models.Site) models.Job { } } +func (s *Service) RebuildSiteContent(oldSite, newSite models.Site) models.Job { + return models.Job{ + Do: func(ctx context.Context) error { + s.signalSiteBuildingStarted(ctx, newSite) + defer s.signalSiteBuildingFinished(ctx, newSite) + + return s.rebuildContent(ctx, oldSite, newSite) + }, + } +} + func (s *Service) rebuildSite(ctx context.Context, oldSite, newSite models.Site) error { // Teardown the existing site siteDir := s.hugo.SiteStagingDir(oldSite, hugo.BaseSiteDir) @@ -75,6 +86,28 @@ func (s *Service) rebuildSite(ctx context.Context, oldSite, newSite models.Site) return err } + if err := s.writeAllContent(ctx, newSite); err != nil { + return err + } + + return s.publish(ctx, newSite) +} + +func (s *Service) rebuildContent(ctx context.Context, oldSite, newSite models.Site) error { + // Teardown the existing site + siteDir := s.hugo.SiteStagingDir(oldSite, hugo.ContentSiteDir) + if err := os.RemoveAll(siteDir); err != nil { + return err + } + + if err := s.writeAllContent(ctx, newSite); err != nil { + return err + } + + return s.publish(ctx, newSite) +} + +func (s *Service) writeAllContent(ctx context.Context, newSite models.Site) error { if err := s.writeAllPosts(ctx, newSite); err != nil { return err } @@ -83,7 +116,7 @@ func (s *Service) rebuildSite(ctx context.Context, oldSite, newSite models.Site) return err } - return s.publish(ctx, newSite) + return nil } func (s *Service) fullRebuildNecessary(ctx context.Context, site models.Site) (bool, error) { @@ -152,4 +185,3 @@ func (s *Service) signalSiteBuildingStarted(ctx context.Context, site models.Sit func (s *Service) signalSiteBuildingFinished(ctx context.Context, site models.Site) { s.bus.Fire(models.Event{Type: models.EventSiteBuildingDone, Data: site}) } -