Have got post creation working.

This commit is contained in:
Leon Mika 2025-01-27 14:23:54 +11:00
parent 63b19a249a
commit 8e0ffb6c24
20 changed files with 479 additions and 11 deletions

View file

@ -0,0 +1,47 @@
package posts
import (
"context"
"lmika.dev/lmika/hugo-crm/models"
"lmika.dev/lmika/hugo-crm/providers/db"
"lmika.dev/lmika/hugo-crm/services/jobs"
"lmika.dev/lmika/hugo-crm/services/sitebuilder"
"time"
)
type Service struct {
db *db.DB
sb *sitebuilder.Service
jobs *jobs.Service
}
func New(
db *db.DB,
sb *sitebuilder.Service,
jobs *jobs.Service,
) *Service {
return &Service{
db: db,
sb: sb,
jobs: jobs,
}
}
func (s *Service) ListPostOfSite(ctx context.Context, site models.Site) ([]models.Post, error) {
return s.db.ListPostsOfSite(ctx, site.ID)
}
func (s *Service) Create(ctx context.Context, site models.Site, body string) (models.Post, error) {
post := models.Post{
SiteID: site.ID,
Body: body,
State: models.PostStatePublished,
PostDate: time.Now(),
CreatedAt: time.Now(),
}
if err := s.db.InsertPost(ctx, &post); err != nil {
return models.Post{}, err
}
return post, s.jobs.Queue(ctx, s.sb.WritePost(site, post))
}

View file

@ -3,11 +3,15 @@ package sitebuilder
import (
"context"
"errors"
"gopkg.in/yaml.v3"
"lmika.dev/lmika/hugo-crm/models"
"lmika.dev/lmika/hugo-crm/providers/git"
"lmika.dev/lmika/hugo-crm/providers/hugo"
"lmika.dev/lmika/hugo-crm/providers/themes"
"log"
"os"
"path/filepath"
"time"
)
type Service struct {
@ -55,3 +59,57 @@ func (s *Service) CreateNewSite(site models.Site) models.Job {
},
}
}
func (s *Service) WritePost(site models.Site, post models.Post) models.Job {
return models.Job{
Do: func(ctx context.Context) error {
themeMeta, ok := s.themes.Lookup(site.Theme)
if !ok {
return errors.New("theme not found")
}
postFilename := filepath.Join(s.hugo.SiteStagingDir(site, hugo.ContentSiteDir), themeMeta.PostDir, post.CreatedAt.Format("2006-01-02-150405.md"))
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
},
}
}