Files

100 lines
2.6 KiB
Go

package triggers
import (
"strings"
fctl "github.com/formancehq/fctl/pkg"
"github.com/formancehq/formance-sdk-go/v2/pkg/models/shared"
"github.com/formancehq/go-libs/pointer"
"github.com/pkg/errors"
"github.com/pterm/pterm"
"github.com/spf13/cobra"
)
type TriggersCreateStore struct {
Trigger shared.Trigger `json:"trigger"`
}
type TriggersCreateController struct {
store *TriggersCreateStore
nameFlag string
filterFlag string
varsFlag string
}
var _ fctl.Controller[*TriggersCreateStore] = (*TriggersCreateController)(nil)
func NewDefaultTriggersCreateStore() *TriggersCreateStore {
return &TriggersCreateStore{}
}
func NewTriggersCreateController() *TriggersCreateController {
return &TriggersCreateController{
store: NewDefaultTriggersCreateStore(),
nameFlag: "name",
filterFlag: "filter",
varsFlag: "vars",
}
}
func NewCreateCommand() *cobra.Command {
ctrl := NewTriggersCreateController()
return fctl.NewCommand("create <event> <workflow-id>",
fctl.WithShortDescription("Create a trigger"),
fctl.WithArgs(cobra.ExactArgs(2)),
fctl.WithController[*TriggersCreateStore](ctrl),
fctl.WithStringFlag(ctrl.nameFlag, "", "Trigger's name"),
fctl.WithStringFlag(ctrl.filterFlag, "", "Filter events"),
fctl.WithStringSliceFlag(ctrl.varsFlag, []string{}, "Variables to pass to the workflow"),
)
}
func (c *TriggersCreateController) GetStore() *TriggersCreateStore {
return c.store
}
func (c *TriggersCreateController) Run(cmd *cobra.Command, args []string) (fctl.Renderable, error) {
store := fctl.GetStackStore(cmd.Context())
var (
event = args[0]
name = fctl.GetString(cmd, c.nameFlag)
filter = fctl.GetString(cmd, c.filterFlag)
vars = fctl.GetStringSlice(cmd, c.varsFlag)
workflow = args[1]
)
data := &shared.TriggerData{
Event: event,
Name: &name,
WorkflowID: workflow,
Vars: map[string]interface{}{},
}
if filter != "" {
data.Filter = pointer.For(filter)
}
if len(vars) > 0 {
for _, v := range vars {
parts := strings.SplitN(v, "=", 2)
if len(parts) != 2 {
return nil, errors.New("invalid 'vars' flag")
}
data.Vars[parts[0]] = parts[1]
}
}
res, err := store.Client().Orchestration.V1.CreateTrigger(cmd.Context(), data)
if err != nil {
return nil, errors.Wrap(err, "reading trigger")
}
c.store.Trigger = res.CreateTriggerResponse.Data
return c, nil
}
func (c *TriggersCreateController) Render(cmd *cobra.Command, args []string) error {
pterm.Success.WithWriter(cmd.OutOrStdout()).Printfln("Trigger created with ID: %s", c.store.Trigger.ID)
return nil
}