mirror of
https://github.com/casdoor/casdoor.git
synced 2025-05-23 02:35:49 +08:00
feat: add object field filter for webhook (#3746)
This commit is contained in:
parent
91057f54f3
commit
eae69c41d7
@ -263,6 +263,27 @@ func addWebhookRecord(webhook *Webhook, record *casvisorsdk.Record, statusCode i
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func filterRecordObject(object string, objectFields []string) string {
|
||||||
|
var rawObject map[string]interface{}
|
||||||
|
_ = json.Unmarshal([]byte(object), &rawObject)
|
||||||
|
|
||||||
|
if rawObject == nil {
|
||||||
|
return object
|
||||||
|
}
|
||||||
|
|
||||||
|
filteredObject := make(map[string]interface{})
|
||||||
|
|
||||||
|
for _, field := range objectFields {
|
||||||
|
fieldValue, ok := rawObject[field]
|
||||||
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
filteredObject[field] = fieldValue
|
||||||
|
}
|
||||||
|
|
||||||
|
return util.StructToJson(filteredObject)
|
||||||
|
}
|
||||||
|
|
||||||
func SendWebhooks(record *casvisorsdk.Record) error {
|
func SendWebhooks(record *casvisorsdk.Record) error {
|
||||||
webhooks, err := getWebhooksByOrganization("")
|
webhooks, err := getWebhooksByOrganization("")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -271,7 +292,14 @@ func SendWebhooks(record *casvisorsdk.Record) error {
|
|||||||
|
|
||||||
errs := []error{}
|
errs := []error{}
|
||||||
webhooks = getFilteredWebhooks(webhooks, record.Organization, record.Action)
|
webhooks = getFilteredWebhooks(webhooks, record.Organization, record.Action)
|
||||||
|
|
||||||
|
record2 := *record
|
||||||
for _, webhook := range webhooks {
|
for _, webhook := range webhooks {
|
||||||
|
|
||||||
|
if len(webhook.ObjectFields) != 0 && webhook.ObjectFields[0] != "All" {
|
||||||
|
record2.Object = filterRecordObject(record.Object, webhook.ObjectFields)
|
||||||
|
}
|
||||||
|
|
||||||
var user *User
|
var user *User
|
||||||
if webhook.IsUserExtended {
|
if webhook.IsUserExtended {
|
||||||
user, err = getUser(record.Organization, record.User)
|
user, err = getUser(record.Organization, record.User)
|
||||||
@ -287,12 +315,12 @@ func SendWebhooks(record *casvisorsdk.Record) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
statusCode, respBody, err := sendWebhook(webhook, record, user)
|
statusCode, respBody, err := sendWebhook(webhook, &record2, user)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errs = append(errs, err)
|
errs = append(errs, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = addWebhookRecord(webhook, record, statusCode, respBody, err)
|
err = addWebhookRecord(webhook, &record2, statusCode, respBody, err)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errs = append(errs, err)
|
errs = append(errs, err)
|
||||||
}
|
}
|
||||||
|
@ -39,6 +39,7 @@ type Webhook struct {
|
|||||||
Headers []*Header `xorm:"mediumtext" json:"headers"`
|
Headers []*Header `xorm:"mediumtext" json:"headers"`
|
||||||
Events []string `xorm:"varchar(1000)" json:"events"`
|
Events []string `xorm:"varchar(1000)" json:"events"`
|
||||||
TokenFields []string `xorm:"varchar(1000)" json:"tokenFields"`
|
TokenFields []string `xorm:"varchar(1000)" json:"tokenFields"`
|
||||||
|
ObjectFields []string `xorm:"varchar(1000)" json:"objectFields"`
|
||||||
IsUserExtended bool `json:"isUserExtended"`
|
IsUserExtended bool `json:"isUserExtended"`
|
||||||
SingleOrgOnly bool `json:"singleOrgOnly"`
|
SingleOrgOnly bool `json:"singleOrgOnly"`
|
||||||
IsEnabled bool `json:"isEnabled"`
|
IsEnabled bool `json:"isEnabled"`
|
||||||
|
@ -144,6 +144,9 @@ class WebhookEditPage extends React.Component {
|
|||||||
if (["port"].includes(key)) {
|
if (["port"].includes(key)) {
|
||||||
value = Setting.myParseInt(value);
|
value = Setting.myParseInt(value);
|
||||||
}
|
}
|
||||||
|
if (key === "objectFields") {
|
||||||
|
value = value.includes("All") ? ["All"] : value;
|
||||||
|
}
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -294,6 +297,19 @@ class WebhookEditPage extends React.Component {
|
|||||||
</Select>
|
</Select>
|
||||||
</Col>
|
</Col>
|
||||||
</Row>
|
</Row>
|
||||||
|
<Row style={{marginTop: "20px"}} >
|
||||||
|
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
|
||||||
|
{Setting.getLabel(i18next.t("webhook:Object fields"), i18next.t("webhook:Object fields - Tooltip"))} :
|
||||||
|
</Col>
|
||||||
|
<Col span={22} >
|
||||||
|
<Select virtual={false} mode="tags" showSearch style={{width: "100%"}} value={this.state.webhook.objectFields} onChange={(value => {this.updateWebhookField("objectFields", value);})}>
|
||||||
|
<Option key="All" value="All">{i18next.t("general:All")}</Option>
|
||||||
|
{
|
||||||
|
["owner", "name", "createdTime", "updatedTime", "deletedTime", "id", "displayName"].map((item, index) => <Option key={index} value={item}>{item}</Option>)
|
||||||
|
}
|
||||||
|
</Select>
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
<Row style={{marginTop: "20px"}} >
|
<Row style={{marginTop: "20px"}} >
|
||||||
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 19 : 2}>
|
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 19 : 2}>
|
||||||
{Setting.getLabel(i18next.t("webhook:Is user extended"), i18next.t("webhook:Is user extended - Tooltip"))} :
|
{Setting.getLabel(i18next.t("webhook:Is user extended"), i18next.t("webhook:Is user extended - Tooltip"))} :
|
||||||
|
Loading…
x
Reference in New Issue
Block a user