[feature] scheduled statuses (#4274)

An implementation of [`scheduled_statuses`](https://docs.joinmastodon.org/methods/scheduled_statuses/). Will fix #1006.

this is heavily WIP and I need to reorganize some of the code, working on this made me somehow familiar with the codebase and led to my other recent contributions
i told some fops on fedi i'd work on this so i have no choice but to complete it 🤷‍♀️
btw iirc my avatar presents me working on this branch

Signed-off-by: nicole mikołajczyk <git@mkljczk.pl>
Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4274
Co-authored-by: nicole mikołajczyk <git@mkljczk.pl>
Co-committed-by: nicole mikołajczyk <git@mkljczk.pl>
This commit is contained in:
nicole mikołajczyk 2025-08-12 14:05:15 +02:00 committed by kim
commit 660cf2c94c
46 changed files with 2354 additions and 68 deletions

View file

@ -140,6 +140,9 @@ func testDefaults() config.Configuration {
StatusesPollOptionMaxChars: 50,
StatusesMediaMaxFiles: 6,
ScheduledStatusesMaxTotal: 300,
ScheduledStatusesMaxDaily: 25,
LetsEncryptEnabled: false,
LetsEncryptPort: 0,
LetsEncryptCertDir: "",

View file

@ -358,6 +358,12 @@ func StandardDBSetup(db db.DB, accounts map[string]*gtsmodel.Account) {
}
}
for _, v := range NewTestScheduledStatuses() {
if err := db.Put(ctx, v); err != nil {
log.Panic(ctx, err)
}
}
if err := db.CreateInstanceAccount(ctx); err != nil {
log.Panic(ctx, err)
}

View file

@ -4331,6 +4331,21 @@ func NewTestStatusEdits() map[string]*gtsmodel.StatusEdit {
}
}
func NewTestScheduledStatuses() map[string]*gtsmodel.ScheduledStatus {
return map[string]*gtsmodel.ScheduledStatus{
"scheduled_status_1": {
ID: "01JZ399E8JF23TS0NEVY6J91KP",
AccountID: "01F8MH1H7YV1Z7D2C8K2730QBF", // local account 1,
ScheduledAt: TimeMustParse("2080-07-01T21:37:00+02:00"),
Text: ":neopapaj_woozy:",
Visibility: gtsmodel.VisibilityPublic,
Sensitive: util.Ptr(false),
Language: "pl",
ApplicationID: "01F8MGY43H3N2C8EWPR2FPYEXG",
},
}
}
// GetSignatureForActivity prepares a mock HTTP request as if it were going to deliver activity to destination signed for privkey and pubKeyID, signs the request and returns the header values.
func GetSignatureForActivity(activity pub.Activity, pubKeyID string, privkey *rsa.PrivateKey, destination *url.URL) (signatureHeader string, digestHeader string, dateHeader string) {
// convert the activity into json bytes