Scheduled posts: written now, published at their time

POST /api/v1/statuses with scheduled_at no longer posts at once: the post is
kept as asked (at least five minutes ahead; 300 waiting, 25 a day, as
Mastodon allows), its media kept from the janitor, and a PublishScheduled job
publishes it at its time as the persona. scheduled_statuses lists, moves and
drops them; a moved post's old job finds it not due. Idempotency-Key holds
for scheduling too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LsXgEaXee4GCU1hwYgPJXw
This commit is contained in:
thepraandClaude Opus 5.5 committed 2026-10-05 02:55:17 +02:00
1 parent 73c362de96
commit cafd2e6db3
13 files changed
+418 -26

No files matched your search

+4
View File
@@ -68,6 +68,9 @@ Written 2026-10-01 from the original 2023 code, the decePubClient UI, a federati
persona's own and never federate.
- [x] Filters: v2 (keywords, whole words, statuses, contexts, warn/hide/blur, expiry) and v1 over their keywords;
every status carries the filters it matches in `filtered`, and clients apply context and action, as Mastodon's do.
- [x] Scheduled posts: `scheduled_at` (at least five minutes ahead; 300 waiting, 25 a day) keeps the post as asked,
with its media kept from the janitor, and a `PublishScheduled` job publishes it at its time; `scheduled_statuses`
lists, moves and drops them.
## Intent
@@ -453,6 +456,7 @@ The first refactor commit is a pure move with namespaces only. Logic changes fol
`resolve`.
- **Lists:** CRUD, `:id/accounts`, `accounts/:id/lists`, `timelines/list/:id` (P9).
- **Filters:** v2 with keywords and statuses, v1, `filtered` on statuses (P9).
- **Scheduled statuses:** `scheduled_at` on posting, `scheduled_statuses` (P9).
- **Stubs:** `custom_emojis`, announcements, trends, suggestions, `followed_tags`, preferences.
- **Mapping:**
- Avatar, ForeignAvatar and Group all map to Account (`group: true` for groups). `acct` uses a WebFinger-verified