feat(12.2-01): add deferred:purge, its daily framework schedule and relation child hooks

- deferred:purge [--days] in lagoon.RuntimeCommands (purge_days, default 5)
- lagoon.FrameworkSchedule entry at purge_at (default 03:00, empty disables)
- conga prepends framework entries as summercms.lagoon[i]:<command>
- pact.Relation{Before,After}{Create,Update,Delete} optional hooks
- lagoon, conga and pact READMEs, scheduling and setup docs
This commit is contained in:
Jakub Zych
2026-10-02 17:45:41 +02:00
parent f48a886f94
commit 8818d7b023
11 changed files with 378 additions and 8 deletions

View File

@@ -13,6 +13,7 @@ import (
"git.golem15.com/golem15/summercms/modules/backpack"
"git.golem15.com/golem15/summercms/modules/bonfire"
"git.golem15.com/golem15/summercms/modules/lagoon"
"git.golem15.com/golem15/summercms/modules/pact"
"git.golem15.com/golem15/summercms/modules/party"
"github.com/riverqueue/river"
@@ -60,15 +61,35 @@ func (e scheduleEntry) construct() (river.JobArgs, *river.InsertOpts) {
}
}
// scheduleEntries compiles the pact.HasSchedule entries of plugins in
// activation order, then declaration order. Entry ids are
// "<plugin id>[<index>]:<command>".
// scheduleEntries compiles the framework's own entries
// (lagoon.FrameworkSchedule, listed under lagoon.FrameworkScheduleID) and
// then the pact.HasSchedule entries of plugins in activation order, then
// declaration order. Entry ids are "<plugin id>[<index>]:<command>".
func scheduleEntries(app *backpack.App, plugins []party.Plugin) ([]scheduleEntry, error) {
loc, err := appLocation(app)
if err != nil {
return nil, err
}
var out []scheduleEntry
framework, err := lagoon.FrameworkSchedule(app)
if err != nil {
return nil, fmt.Errorf("conga: framework schedule: %w", err)
}
for i, sc := range framework {
sched, period, err := scheduleFor(sc.Cadence, loc)
if err != nil {
return nil, fmt.Errorf("conga: framework schedule entry %d (%s): %w", i, sc.Command, err)
}
sc.Args = slices.Clone(sc.Args)
out = append(out, scheduleEntry{
id: fmt.Sprintf("%s[%d]:%s", lagoon.FrameworkScheduleID, i, sc.Command),
plugin: lagoon.FrameworkScheduleID,
index: i,
cmd: sc,
schedule: sched,
period: period,
})
}
for _, p := range plugins {
hs, ok := p.(pact.HasSchedule)
if !ok {