Plugin System
Arsitektur plugin, registry antar plugin, generator, dan registrasi manual.
Konsep inti
Plugin dibuat di bawah folder plugins/. Setiap plugin punya folder sendiri dengan opsional migrations/, handlers, dan kode registrasi. Framework menyediakan dua package bawaan: pages (built-in) dan plugin_registry (kontrak antar plugin).
File inti:
- Loader:
internal/pluginloader/loader.go - Registry:
internal/plugins/registry.go - Types & priorities:
internal/plugins/types.go,internal/plugins/middleware_priorities.go
Interface plugins.Plugin
ID() string
RegisterServices(deps plugins.ServiceDeps) error
RegisterMiddleware() []plugins.MiddlewareDescriptor
RegisterRoutes(router *gin.Engine, admin, api *gin.RouterGroup) error
Seed() error
ConsoleCommands() []*cobra.Command
Shared deps (plugins.ServiceDeps) berisi DB *gorm.DB dan Store storage.Store.
Registrasi
Plugin harus di-register di dua entrypoint:
cmd/server/main.go— routes & middleware HTTPcmd/console/main.go— console commands (migrasi, seed, custom)
Lihat creating-a-plugin untuk langkah detail + skeleton lengkap.
Built-in plugin (PATEN — jangan dihapus)
pages melayani SPA dari ./sub_app/webapp/dist, wildcard route via router.NoRoute, dan proxy homepage opsional (HOMEPAGE_URL). Selalu di-register paling akhir via pluginloader.RegisterLastPlugins() karena memegang router.NoRoute — semua route spesifik (api/admin/health) harus menang duluan.
Registrasinya idempotent + dedup via plugins.EnsurePluginLast, jadi pages selalu tepat satu dan di akhir, apa pun yang user daftarkan.
Plugin Registry (komunikasi antar plugin)
plugins/plugin_registry memungkinkan plugin berbagi interface fungsi tanpa circular import:
- Definisikan interface contract di
plugin_registry/registry.go(mis.ChatProvider) - Plugin provider daftarkan implementasi via
Register<X>Provider(...)diRegisterServices(deps) - Plugin consumer panggil delegation function (mis.
SendMessage(...)) - Keduanya hanya import
plugin_registry— tidak saling import - Setiap delegation function punya nil-guard: tanpa provider, kembalikan default aman (bukan panic)
Lihat plugin_registry untuk detail.