l-dingtalk-stream-sdk-go/plugin/plugin_handler.go

46 lines
1.3 KiB
Go

package plugin
import (
"context"
"encoding/json"
"github.com/open-dingtalk/dingtalk-stream-sdk-go/payload"
)
type CallbackResponse struct {
Response interface{} `json:"response"`
}
type IDingTalkPluginHandler func(c context.Context, data *DingTalkPluginMessage) (interface{}, error)
type DefaultDingTalkPluginFrameHandler struct {
defaultHandler IDingTalkPluginHandler
}
func NewDefaultDingTalkPluginFrameHandler(defaultHandler IDingTalkPluginHandler) *DefaultDingTalkPluginFrameHandler {
return &DefaultDingTalkPluginFrameHandler{
defaultHandler: defaultHandler,
}
}
func (h *DefaultDingTalkPluginFrameHandler) OnEventReceived(ctx context.Context, df *payload.DataFrame) (*payload.DataFrameResponse, error) {
msgData := &DingTalkPluginMessage{}
err := json.Unmarshal([]byte(df.Data), msgData)
if err != nil {
return nil, err
}
if h.defaultHandler == nil {
return payload.NewDataFrameResponse(payload.DataFrameResponseStatusCodeKHandlerNotFound), nil
}
result, err := h.defaultHandler(ctx, msgData)
if err != nil {
return nil, err
}
dingTalkPluginResponse := &DingTalkPluginResponse{RequestId: msgData.RequestId, Result: result}
callbackResponse := &CallbackResponse{Response: dingTalkPluginResponse}
frameResp := payload.NewSuccessDataFrameResponse()
frameResp.SetJson(callbackResponse)
return frameResp, nil
}