From 08e41ab76204068e5e4206ef8ef871479cd2167f Mon Sep 17 00:00:00 2001 From: DacongDA Date: Tue, 4 Mar 2025 14:16:16 +0800 Subject: [PATCH] feat: can specify user fields in webhook edit page (#3635) --- object/webhook.go | 1 + object/webhook_util.go | 35 ++++++++++++++++++++++++++--------- web/src/WebhookEditPage.js | 23 ++++++++++++++++++++++- 3 files changed, 49 insertions(+), 10 deletions(-) diff --git a/object/webhook.go b/object/webhook.go index 63e5bad4..b0e56257 100644 --- a/object/webhook.go +++ b/object/webhook.go @@ -38,6 +38,7 @@ type Webhook struct { ContentType string `xorm:"varchar(100)" json:"contentType"` Headers []*Header `xorm:"mediumtext" json:"headers"` Events []string `xorm:"varchar(1000)" json:"events"` + TokenFields []string `xorm:"varchar(1000)" json:"tokenFields"` IsUserExtended bool `json:"isUserExtended"` SingleOrgOnly bool `json:"singleOrgOnly"` IsEnabled bool `json:"isEnabled"` diff --git a/object/webhook_util.go b/object/webhook_util.go index 0335c0f4..bbfbc76a 100644 --- a/object/webhook_util.go +++ b/object/webhook_util.go @@ -17,6 +17,7 @@ package object import ( "io" "net/http" + "reflect" "strings" "github.com/casdoor/casdoor/util" @@ -25,17 +26,33 @@ import ( func sendWebhook(webhook *Webhook, record *casvisorsdk.Record, extendedUser *User) (int, string, error) { client := &http.Client{} + userMap := make(map[string]interface{}) + var body io.Reader - type RecordEx struct { - casvisorsdk.Record - ExtendedUser *User `xorm:"-" json:"extendedUser"` - } - recordEx := &RecordEx{ - Record: *record, - ExtendedUser: extendedUser, - } + if webhook.TokenFields != nil && len(webhook.TokenFields) > 0 && extendedUser != nil { + userValue := reflect.ValueOf(extendedUser).Elem() - body := strings.NewReader(util.StructToJson(recordEx)) + for _, field := range webhook.TokenFields { + userField := userValue.FieldByName(field) + if userField.IsValid() { + newfield := util.SnakeToCamel(util.CamelToSnakeCase(field)) + userMap[newfield] = userField.Interface() + } + } + + body = strings.NewReader(util.StructToJson(userMap)) + } else { + type RecordEx struct { + casvisorsdk.Record + ExtendedUser *User `xorm:"-" json:"extendedUser"` + } + recordEx := &RecordEx{ + Record: *record, + ExtendedUser: extendedUser, + } + + body = strings.NewReader(util.StructToJson(recordEx)) + } req, err := http.NewRequest(webhook.Method, webhook.Url, body) if err != nil { diff --git a/web/src/WebhookEditPage.js b/web/src/WebhookEditPage.js index aeed3d25..2ddea834 100644 --- a/web/src/WebhookEditPage.js +++ b/web/src/WebhookEditPage.js @@ -174,7 +174,16 @@ class WebhookEditPage extends React.Component { renderWebhook() { const preview = Setting.deepCopy(previewTemplate); if (this.state.webhook.isUserExtended) { - preview["extendedUser"] = userTemplate; + if (this.state.webhook.tokenFields && this.state.webhook.tokenFields.length !== 0) { + const extendedUser = {}; + this.state.webhook.tokenFields.forEach(field => { + const fieldTrans = field.replace(field[0], field[0].toLowerCase()); + extendedUser[fieldTrans] = userTemplate[fieldTrans]; + }); + preview["extendedUser"] = extendedUser; + } else { + preview["extendedUser"] = userTemplate; + } } const previewText = JSON.stringify(preview, null, 2); @@ -295,6 +304,18 @@ class WebhookEditPage extends React.Component { }} /> + + + {Setting.getLabel(i18next.t("application:Extended user fields"), i18next.t("application:Extended user fields - Tooltip"))} : + + + + + {Setting.getLabel(i18next.t("general:Preview"), i18next.t("general:Preview - Tooltip"))} :