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 } // HasMiddlewareFactories is implemented by plugins that register // parameterized middleware ("name:param"), resolved at wrap time. type HasMiddlewareFactories interface { MiddlewareFactories() map[string]func(param string) Middleware } // HasHouseMiddleware is implemented by plugins that register middleware // tagged as house-envelope/error handling -- refused inside a raw group // (D-16). This is the ONLY way a plugin declares a house-tagged name: // plugins never call a Router.Register* method directly (there is no such // call site anywhere in this codebase -- RegisterMiddleware/ // RegisterMiddlewareFactory/RegisterHouseMiddleware are all called // exclusively from surf.Assemble/BuildRouter's plugin loop, the same way // HasMiddleware's Middlewares() map is today). A name present in both // Middlewares() and HouseMiddlewares() (from the same or a different // plugin) fails boot with the existing duplicate-name error, since both are // registered into the same underlying name table. type HasHouseMiddleware interface { HouseMiddlewares() map[string]Middleware } // Router is the Laravel-like group builder implemented by surf. type Router interface { Group(prefix string, middleware []string, fn func(Router)) GroupRaw(prefix string, middleware []string, fn func(Router)) Get(path string, handler http.HandlerFunc, middleware ...string) Post(path string, handler http.HandlerFunc, middleware ...string) Put(path string, handler http.HandlerFunc, middleware ...string) Patch(path string, handler http.HandlerFunc, middleware ...string) Delete(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/HasMiddlewareFactories/HasHouseMiddleware/HasRoutes // (surf assemble). surf.BucketProvider is type-asserted in Assemble/ // BuildRouter (not a pact interface: pact cannot import surf without a cycle).