package pact import ( "context" "io/fs" "net/http" "git.golem15.com/golem15/summercms/bonfire" "github.com/go-gormigrate/gormigrate/v2" ) // HasCommands is implemented by plugins that register console commands. type HasCommands interface { Commands() []bonfire.Command } // HasConfig is implemented by plugins that ship default YAML configuration. // ConfigFS should contain files such as config/config.yaml, merged later at // the plugin ID path. type HasConfig interface { ConfigFS() fs.FS } // HasMigrations is implemented by plugins that ship an ordered gormigrate // set. The kernel runs each set in party.Activate order with a separate // history table per plugin ID. type HasMigrations interface { Migrations() []*gormigrate.Migration } // Middleware is a named HTTP wrapper registered by a plugin. type Middleware func(http.Handler) http.Handler // HasMiddleware is implemented by plugins that register named middleware. type HasMiddleware interface { Middlewares() map[string]Middleware } // Router is the Laravel-like group builder implemented by surf. type Router interface { Group(prefix string, middleware []string, fn func(Router)) Get(path string, handler http.HandlerFunc, middleware ...string) Where(param, pattern string) WhereIn(param string, values ...string) } // HasRoutes is implemented by plugins that declare HTTP routes. type HasRoutes interface { Routes(Router) error } // HasModels is implemented by plugins that expose GORM models. type HasModels interface { Models() []any } // JobArgs is the typed payload a job worker receives. Kind identifies the // job so a worker can reject unexpected argument types. type JobArgs interface { Kind() string } // Job is a unit of background work. Phase 11 adapts this onto River; the // interface itself must not import River. type Job interface { Work(ctx context.Context, args JobArgs) error } // HasJobs is implemented by plugins that register background jobs. type HasJobs interface { Jobs() []Job } // AdminController is the compile-time admin controller contract. Phase 9 // grows the schema pipeline; ID, model name and YAML config directory are // enough for generated stubs to compile. type AdminController interface { ID() string ModelName() string ConfigDir() string } // HasAdminControllers is implemented by plugins that register admin controllers. type HasAdminControllers interface { AdminControllers() []AdminController } // HasLang is implemented by plugins that ship embedded translation YAML // under lang//.yaml. type HasLang interface { LangFS() fs.FS } // HasMailTemplates is implemented by plugins that ship Winter-shaped mail // templates and layout aliases. MailTemplatesFS contains views/mail assets; // MailTemplates lists dotted template names; MailLayouts maps a short layout // name to the full dotted layout name. type HasMailTemplates interface { MailTemplatesFS() fs.FS MailTemplates() []string MailLayouts() map[string]string } // OptionalMessage is a service an optional plugin may publish so other // plugins can integrate without importing that plugin's package. type OptionalMessage interface { Message() string } // Future capability families are type-asserted when their first consumer // packages exist: // // HasListeners // HasNavigation // HasPermissions // HasSchedule // // The kernel type-asserts HasConfig (party, before Register), HasCommands // (generated app main, after Boot), HasMigrations (lagoon migrate), and // HasMiddleware/HasRoutes (surf assemble).