Started working on the event bus
This commit is contained in:
parent
fdd2ecc7fc
commit
e2f159e980
9 changed files with 233 additions and 61 deletions
|
|
@ -15,11 +15,14 @@ import (
|
|||
func (s *Service) WritePost(site models.Site, post models.Post) 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(site, site).Do(ctx)
|
||||
return s.rebuildSite(ctx, site, site)
|
||||
}
|
||||
|
||||
if err := s.writePost(site, post); err != nil {
|
||||
|
|
@ -33,53 +36,64 @@ func (s *Service) WritePost(site models.Site, post models.Post) models.Job {
|
|||
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
|
||||
}
|
||||
s.signalSiteBuildingStarted(ctx, site)
|
||||
defer s.signalSiteBuildingFinished(ctx, site)
|
||||
|
||||
for _, post := range posts {
|
||||
if err := s.writePost(site, post); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
startId = posts[len(posts)-1].ID
|
||||
if err := s.writeAllPosts(ctx, site); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return s.publish(ctx, site)
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
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")
|
||||
}
|
||||
return models.Job{
|
||||
Do: func(ctx context.Context) error {
|
||||
s.signalSiteBuildingStarted(ctx, site)
|
||||
defer s.signalSiteBuildingFinished(ctx, site)
|
||||
|
||||
postFilename := s.postFilename(site, themeMeta, post)
|
||||
themeMeta, ok := s.themes.Lookup(site.Theme)
|
||||
if !ok {
|
||||
return errors.New("theme not found")
|
||||
}
|
||||
|
||||
if _, err := os.Stat(postFilename); err != nil {
|
||||
if errors.Is(err, os.ErrNotExist) {
|
||||
return nil
|
||||
}
|
||||
return err
|
||||
}
|
||||
postFilename := s.postFilename(site, themeMeta, post)
|
||||
|
||||
if os.Remove(postFilename) != nil {
|
||||
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 s.publish(ctx, site)
|
||||
},
|
||||
s.Publish(site),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Service) writeAllPosts(ctx context.Context, site models.Site) 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) writePost(site models.Site, post models.Post) error {
|
||||
|
|
|
|||
|
|
@ -8,6 +8,9 @@ import (
|
|||
func (s *Service) Publish(site models.Site) models.Job {
|
||||
return models.Job{
|
||||
Do: func(ctx context.Context) error {
|
||||
s.signalSiteBuildingStarted(ctx, site)
|
||||
defer s.signalSiteBuildingFinished(ctx, site)
|
||||
|
||||
return s.publish(ctx, site)
|
||||
},
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import (
|
|||
"context"
|
||||
"errors"
|
||||
"lmika.dev/lmika/hugo-cms/models"
|
||||
"lmika.dev/lmika/hugo-cms/providers/bus"
|
||||
"lmika.dev/lmika/hugo-cms/providers/db"
|
||||
"lmika.dev/lmika/hugo-cms/providers/git"
|
||||
"lmika.dev/lmika/hugo-cms/providers/hugo"
|
||||
|
|
@ -20,6 +21,7 @@ type Service struct {
|
|||
git *git.Provider
|
||||
hugo *hugo.Provider
|
||||
netlify *netlify.Provider
|
||||
bus *bus.Bus
|
||||
}
|
||||
|
||||
func New(
|
||||
|
|
@ -28,6 +30,7 @@ func New(
|
|||
git *git.Provider,
|
||||
hugo *hugo.Provider,
|
||||
netlify *netlify.Provider,
|
||||
bus *bus.Bus,
|
||||
) *Service {
|
||||
return &Service{
|
||||
db: db,
|
||||
|
|
@ -35,33 +38,48 @@ func New(
|
|||
git: git,
|
||||
hugo: hugo,
|
||||
netlify: netlify,
|
||||
bus: bus,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Service) CreateNewSite(site models.Site) models.Job {
|
||||
return models.Job{
|
||||
Do: func(ctx context.Context) error {
|
||||
s.signalSiteBuildingStarted(ctx, site)
|
||||
defer s.signalSiteBuildingFinished(ctx, site)
|
||||
|
||||
return s.createSite(ctx, site)
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Service) RebuildSite(oldSite, newSite models.Site) models.Job {
|
||||
return models.Jobs(
|
||||
models.Job{
|
||||
Do: func(ctx context.Context) error {
|
||||
// Teardown the existing site
|
||||
siteDir := s.hugo.SiteStagingDir(oldSite, hugo.BaseSiteDir)
|
||||
if err := os.RemoveAll(siteDir); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
},
|
||||
return models.Job{
|
||||
Do: func(ctx context.Context) error {
|
||||
s.signalSiteBuildingStarted(ctx, newSite)
|
||||
defer s.signalSiteBuildingFinished(ctx, newSite)
|
||||
|
||||
return s.rebuildSite(ctx, oldSite, newSite)
|
||||
},
|
||||
s.CreateNewSite(newSite),
|
||||
s.WriteAllPosts(newSite),
|
||||
s.Publish(newSite),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Service) rebuildSite(ctx context.Context, oldSite, newSite models.Site) error {
|
||||
// Teardown the existing site
|
||||
siteDir := s.hugo.SiteStagingDir(oldSite, hugo.BaseSiteDir)
|
||||
if err := os.RemoveAll(siteDir); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := s.createSite(ctx, newSite); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := s.writeAllPosts(ctx, newSite); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return s.publish(ctx, newSite)
|
||||
}
|
||||
|
||||
func (s *Service) fullRebuildNecessary(ctx context.Context, site models.Site) (bool, error) {
|
||||
|
|
@ -122,3 +140,11 @@ func (s *Service) createSite(ctx context.Context, site models.Site) error {
|
|||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *Service) signalSiteBuildingStarted(ctx context.Context, site models.Site) {
|
||||
s.bus.Fire(models.Event{Type: models.EventSiteBuildingStart, Data: site})
|
||||
}
|
||||
|
||||
func (s *Service) signalSiteBuildingFinished(ctx context.Context, site models.Site) {
|
||||
s.bus.Fire(models.Event{Type: models.EventSiteBuildingDone, Data: site})
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue