plugin_handler.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package plugin
  2. import (
  3. "context"
  4. "encoding/json"
  5. "github.com/open-dingtalk/dingtalk-stream-sdk-go/payload"
  6. )
  7. type CallbackResponse struct {
  8. Response interface{} `json:"response"`
  9. }
  10. type IPluginMessageHandler func(c context.Context, data *GraphRequest) (*GraphResponse, error)
  11. type DefaultPluginFrameHandler struct {
  12. defaultHandler IPluginMessageHandler
  13. }
  14. func NewDefaultPluginFrameHandler(defaultHandler IPluginMessageHandler) *DefaultPluginFrameHandler {
  15. return &DefaultPluginFrameHandler{
  16. defaultHandler: defaultHandler,
  17. }
  18. }
  19. func (h *DefaultPluginFrameHandler) OnEventReceived(ctx context.Context, df *payload.DataFrame) (*payload.DataFrameResponse, error) {
  20. msgData := &GraphRequest{}
  21. err := json.Unmarshal([]byte(df.Data), msgData)
  22. if err != nil {
  23. return nil, err
  24. }
  25. if h.defaultHandler == nil {
  26. return payload.NewDataFrameResponse(payload.DataFrameResponseStatusCodeKHandlerNotFound), nil
  27. }
  28. result, err := h.defaultHandler(ctx, msgData)
  29. if err != nil {
  30. return nil, err
  31. }
  32. result.StatusLine.Code = 200
  33. result.StatusLine.Reason = "OK"
  34. callbackResponse := &CallbackResponse{Response: result}
  35. frameResp := payload.NewSuccessDataFrameResponse()
  36. if err = frameResp.SetJson(callbackResponse); err != nil {
  37. return nil, err
  38. }
  39. return frameResp, nil
  40. }