Ddonisgo
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 Priority middleware dengan hati-hati agar urutan eksekusi predictable
  • Jaga plugin terisolasi & hindari global mutable state
  • Register plugin sebelum plugins.AttachMiddleware dipanggil (bootstrap handle via app.Run)