Fixed handling of content only vs structural page changes.

This commit is contained in:
Leon Mika 2025-02-16 16:12:50 +11:00
parent 573517565d
commit 3cf4294e87
2 changed files with 58 additions and 4 deletions

View file

@ -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 {

View file

@ -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})
}