Guides
Creating a Plugin
Generate plugin dari CLI, atau buat manual — lengkap dengan registrasi dan skeleton.
Generate dari CLI (tercepat)
# minimal (default) — health check handler
go run ./cmd/console plugin new --id my-plugin
# crud — handler + service layer
go run ./cmd/console plugin new --id my-plugin --template crud
# middleware — fokus middleware
go run ./cmd/console plugin new --id my-plugin --template middleware
# dengan display name
go run ./cmd/console plugin new --id my-plugin --name "My Awesome Plugin"
Struktur yang dihasilkan:
plugins/my_plugin/
├── plugin.go # implement plugins.Plugin
├── handlers/ # HTTP handler
├── migrations/postgres/ # file migrasi
├── services/ # (template crud)
└── middleware/ # (template middleware)
Registrasi (wajib, di dua entrypoint)
cmd/server/main.go:
plugins.RegisterPlugins([]plugins.Plugin{
myplugin.New(),
})
cmd/console/main.go:
console.RegisterAdditionalPlugins([]plugins.Plugin{myplugin.New()})
console.Execute()
Skeleton minimal
package myplugin
type MyPlugin struct{}
func New() plugins.Plugin { return &MyPlugin{} }
func (p *MyPlugin) ID() string { return "myplugin" }
func (p *MyPlugin) RegisterServices(deps plugins.ServiceDeps) error {
// deps.DB dan deps.Store tersedia di sini
return nil
}
func (p *MyPlugin) RegisterMiddleware() []plugins.MiddlewareDescriptor {
return []plugins.MiddlewareDescriptor{
{Name: "myplugin.log", Target: "global", Priority: 100, Handler: func(c *gin.Context) { c.Next() }},
}
}
func (p *MyPlugin) RegisterRoutes(router *gin.Engine, admin, api *gin.RouterGroup) error {
admin.GET("/myplugin/ping", func(c *gin.Context) { c.JSON(200, gin.H{"pong": true}) })
return nil
}
func (p *MyPlugin) Seed() error { return nil }
func (p *MyPlugin) ConsoleCommands() []*cobra.Command { return nil }
Best practices
- Pilih
Prioritymiddleware dengan hati-hati agar urutan eksekusi predictable - Jaga plugin terisolasi & hindari global mutable state
- Register plugin sebelum
plugins.AttachMiddlewaredipanggil (bootstrap handle viaapp.Run)