Added RSS and JSON feeds

This commit is contained in:
Leon Mika 2026-03-05 22:04:24 +11:00
parent 65e5ce2733
commit 21f181f83d
13 changed files with 192 additions and 31 deletions

View file

@ -4,6 +4,7 @@ import (
"context"
"lmika.dev/lmika/weiro/models"
"lmika.dev/lmika/weiro/providers/db"
)
func (s *Service) ListPosts(ctx context.Context, showDeleted bool) ([]*models.Post, error) {
@ -12,7 +13,10 @@ func (s *Service) ListPosts(ctx context.Context, showDeleted bool) ([]*models.Po
return nil, models.SiteRequiredError
}
posts, err := s.db.SelectPostsOfSite(ctx, site.ID, showDeleted)
posts, err := s.db.SelectPostsOfSite(ctx, site.ID, showDeleted, db.PagingParams{
Offset: 0,
Limit: 25,
})
if err != nil {
return nil, err
}

View file

@ -0,0 +1,37 @@
package publisher
import (
"context"
"iter"
"lmika.dev/lmika/weiro/models"
"lmika.dev/lmika/weiro/providers/db"
)
// PostIter returns a post iterator which returns posts in reverse chronological order.
func (s *Publisher) postIter(ctx context.Context, site int64) iter.Seq[models.Maybe[*models.Post]] {
return func(yield func(models.Maybe[*models.Post]) bool) {
paging := db.PagingParams{Offset: 0, Limit: 50}
page, err := s.db.SelectPostsOfSite(ctx, site, false, paging)
if err != nil {
yield(models.Maybe[*models.Post]{Err: err})
return
}
for {
for _, post := range page {
if !yield(models.Maybe[*models.Post]{Value: post}) {
return
}
}
paging.Offset += paging.Limit
page, err = s.db.SelectPostsOfSite(ctx, site, false, paging)
if err != nil {
yield(models.Maybe[*models.Post]{Err: err})
return
} else if len(page) == 0 {
return
}
}
}
}

View file

@ -3,6 +3,7 @@ package publisher
import (
"context"
"io"
"iter"
"log"
"os"
@ -38,12 +39,6 @@ func (p *Publisher) Publish(ctx context.Context, site models.Site) error {
return err
}
// Fetch all content of site
posts, err := p.db.SelectPostsOfSite(ctx, site.ID, false)
if err != nil {
return err
}
// Fetch all uploads of site
uploads, err := p.db.SelectUploadsOfSite(ctx, site.ID)
if err != nil {
@ -56,8 +51,10 @@ func (p *Publisher) Publish(ctx context.Context, site models.Site) error {
}
pubSite := pubmodel.Site{
Site: site,
Posts: posts,
Site: site,
PostIter: func(ctx context.Context) iter.Seq[models.Maybe[*models.Post]] {
return p.postIter(ctx, site.ID)
},
BaseURL: target.BaseURL,
Uploads: uploads,
OpenUpload: func(u models.Upload) (io.ReadCloser, error) {
@ -77,6 +74,7 @@ func (p *Publisher) publishSite(ctx context.Context, pubSite pubmodel.Site, targ
sb, err := sitebuilder.New(pubSite, sitebuilder.Options{
BasePosts: "/posts",
TemplatesFS: simplecss.FS,
FeedItems: 30,
})
if err != nil {
return err
@ -88,7 +86,11 @@ func (p *Publisher) publishSite(ctx context.Context, pubSite pubmodel.Site, targ
if err := exporter.WriteSiteYAML(); err != nil {
return err
}
for _, p := range pubSite.Posts {
for mp := range pubSite.PostIter(ctx) {
p, err := mp.Get()
if err != nil {
return err
}
if err := exporter.WritePost(p); err != nil {
return err
}