From fa9be690451b1c7332994e8604194581e4335d69 Mon Sep 17 00:00:00 2001 From: Leon Mika Date: Sun, 8 Mar 2026 09:37:49 +1100 Subject: [PATCH] Added feeds for crossposting and a rebuild site button --- cmds/server.go | 3 +++ handlers/posts.go | 14 +++++++++++++- providers/sitebuilder/builder.go | 29 ++++++++++++++++++++--------- providers/sitebuilder/models.go | 10 ++++++++++ services/posts/create.go | 10 ++++++++++ views/posts/index.html | 7 ++++++- 6 files changed, 62 insertions(+), 11 deletions(-) create mode 100644 providers/sitebuilder/models.go diff --git a/cmds/server.go b/cmds/server.go index 1e368ce..2445b8a 100644 --- a/cmds/server.go +++ b/cmds/server.go @@ -125,6 +125,9 @@ Starting weiro without any arguments will start the server. siteGroup.Patch("/posts/:postID", ph.Patch) siteGroup.Delete("/posts/:postID", ph.Delete) + // TODO Move + siteGroup.Post("/rebuild", ph.Rebuild) + siteGroup.Get("/uploads", uh.Index) siteGroup.Get("/uploads/slug/+", uh.ShowFromSlug) siteGroup.Get("/uploads/:uploadID", uh.Show) diff --git a/handlers/posts.go b/handlers/posts.go index 1bab15d..283ffd9 100644 --- a/handlers/posts.go +++ b/handlers/posts.go @@ -149,6 +149,18 @@ func (ph PostsHandler) Delete(c fiber.Ctx) error { return accepts(c, json(func() any { return fiber.Map{} }), html(func(c fiber.Ctx) error { - return c.Redirect().To("/sites") + return c.Redirect().To("/") + })) +} + +func (ph PostsHandler) Rebuild(c fiber.Ctx) error { + if err := ph.PostService.RebuildSite(c.Context()); err != nil { + return err + } + + return accepts(c, json(func() any { + return fiber.Map{} + }), html(func(c fiber.Ctx) error { + return c.Redirect().To("/") })) } diff --git a/providers/sitebuilder/builder.go b/providers/sitebuilder/builder.go index 3417fba..9b25fb1 100644 --- a/providers/sitebuilder/builder.go +++ b/providers/sitebuilder/builder.go @@ -72,7 +72,17 @@ func (b *Builder) BuildSite(outDir string) error { }) eg.Go(func() error { - if err := b.renderFeeds(buildCtx, b.site.PostIter(ctx)); err != nil { + if err := b.renderFeeds(buildCtx, b.site.PostIter(ctx), feedOptions{ + targetNamePrefix: "/feed", + titlePrefix: "", + }); err != nil { + return err + } + + if err := b.renderFeeds(buildCtx, b.site.PostIter(ctx), feedOptions{ + targetNamePrefix: "/feeds/microblog-crosspost", + titlePrefix: "Devlog: ", + }); err != nil { return err } return nil @@ -119,7 +129,7 @@ func (b *Builder) renderPostList(ctx buildContext, postIter iter.Seq[models.Mayb }) } -func (b *Builder) renderFeeds(ctx buildContext, postIter iter.Seq[models.Maybe[*models.Post]]) error { +func (b *Builder) renderFeeds(ctx buildContext, postIter iter.Seq[models.Maybe[*models.Post]], opts feedOptions) error { now := time.Now() feed := &feedhub.Feed{ Title: b.site.Title, @@ -141,9 +151,14 @@ func (b *Builder) renderFeeds(ctx buildContext, postIter iter.Seq[models.Maybe[* return err } + postTitle := post.Title + if postTitle != "" { + postTitle = opts.titlePrefix + postTitle + } + feed.Items = append(feed.Items, &feedhub.Item{ Id: filepath.Join(b.site.BaseURL, post.GUID), - Title: post.Title, + Title: postTitle, Link: &feedhub.Link{Href: renderedPost.PostURL}, Content: string(renderedPost.HTML), // TO FIX: Created should be first published @@ -157,7 +172,7 @@ func (b *Builder) renderFeeds(ctx buildContext, postIter iter.Seq[models.Maybe[* } } - if err := b.createAtPath(ctx, "/feed.xml", func(f io.Writer) error { + if err := b.createAtPath(ctx, opts.targetNamePrefix+".xml", func(f io.Writer) error { rss, err := feed.ToRss() if err != nil { return fmt.Errorf("failed to convert feed to RSS: %w", err) @@ -168,7 +183,7 @@ func (b *Builder) renderFeeds(ctx buildContext, postIter iter.Seq[models.Maybe[* return err } - if err := b.createAtPath(ctx, "/feed.json", func(f io.Writer) error { + if err := b.createAtPath(ctx, opts.targetNamePrefix+".json", func(f io.Writer) error { rss, err := feed.ToJSON() if err != nil { return fmt.Errorf("failed to convert feed to JSON feed: %w", err) @@ -276,7 +291,3 @@ func (b *Builder) writeUploads(ctx buildContext, uploads []models.Upload) error } return nil } - -type buildContext struct { - outDir string -} diff --git a/providers/sitebuilder/models.go b/providers/sitebuilder/models.go new file mode 100644 index 0000000..30419c6 --- /dev/null +++ b/providers/sitebuilder/models.go @@ -0,0 +1,10 @@ +package sitebuilder + +type buildContext struct { + outDir string +} + +type feedOptions struct { + targetNamePrefix string + titlePrefix string +} diff --git a/services/posts/create.go b/services/posts/create.go index 4c99b82..52b9400 100644 --- a/services/posts/create.go +++ b/services/posts/create.go @@ -79,3 +79,13 @@ func (s *Service) fetchOrCreatePost(ctx context.Context, site models.Site, param } return post, nil } + +// TEMP - to move +func (s *Service) RebuildSite(ctx context.Context) error { + site, ok := models.GetSite(ctx) + if !ok { + return models.SiteRequiredError + } + s.publisher.Queue(site) + return nil +} diff --git a/views/posts/index.html b/views/posts/index.html index 83f0b8b..252c9c9 100644 --- a/views/posts/index.html +++ b/views/posts/index.html @@ -1,7 +1,12 @@ {{ $showingTrash := eq .req.Filter "deleted" }}
- New Post +
+ New Post +
+ +
+