Ddonisgo
Framework

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 HTTP
  • cmd/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:

  1. Definisikan interface contract di plugin_registry/registry.go (mis. ChatProvider)
  2. Plugin provider daftarkan implementasi via Register<X>Provider(...) di RegisterServices(deps)
  3. Plugin consumer panggil delegation function (mis. SendMessage(...))
  4. Keduanya hanya import plugin_registry — tidak saling import
  5. Setiap delegation function punya nil-guard: tanpa provider, kembalikan default aman (bukan panic)

Lihat plugin_registry untuk detail.