mirror of
https://github.com/casdoor/casdoor.git
synced 2025-05-23 02:35:49 +08:00
feat: can specify user fields in webhook edit page (#3635)
This commit is contained in:
parent
85ca318e2f
commit
08e41ab762
@ -38,6 +38,7 @@ type Webhook struct {
|
|||||||
ContentType string `xorm:"varchar(100)" json:"contentType"`
|
ContentType string `xorm:"varchar(100)" json:"contentType"`
|
||||||
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"`
|
||||||
IsUserExtended bool `json:"isUserExtended"`
|
IsUserExtended bool `json:"isUserExtended"`
|
||||||
SingleOrgOnly bool `json:"singleOrgOnly"`
|
SingleOrgOnly bool `json:"singleOrgOnly"`
|
||||||
IsEnabled bool `json:"isEnabled"`
|
IsEnabled bool `json:"isEnabled"`
|
||||||
|
@ -17,6 +17,7 @@ package object
|
|||||||
import (
|
import (
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/casdoor/casdoor/util"
|
"github.com/casdoor/casdoor/util"
|
||||||
@ -25,17 +26,33 @@ import (
|
|||||||
|
|
||||||
func sendWebhook(webhook *Webhook, record *casvisorsdk.Record, extendedUser *User) (int, string, error) {
|
func sendWebhook(webhook *Webhook, record *casvisorsdk.Record, extendedUser *User) (int, string, error) {
|
||||||
client := &http.Client{}
|
client := &http.Client{}
|
||||||
|
userMap := make(map[string]interface{})
|
||||||
|
var body io.Reader
|
||||||
|
|
||||||
type RecordEx struct {
|
if webhook.TokenFields != nil && len(webhook.TokenFields) > 0 && extendedUser != nil {
|
||||||
casvisorsdk.Record
|
userValue := reflect.ValueOf(extendedUser).Elem()
|
||||||
ExtendedUser *User `xorm:"-" json:"extendedUser"`
|
|
||||||
}
|
|
||||||
recordEx := &RecordEx{
|
|
||||||
Record: *record,
|
|
||||||
ExtendedUser: extendedUser,
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
req, err := http.NewRequest(webhook.Method, webhook.Url, body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -174,7 +174,16 @@ class WebhookEditPage extends React.Component {
|
|||||||
renderWebhook() {
|
renderWebhook() {
|
||||||
const preview = Setting.deepCopy(previewTemplate);
|
const preview = Setting.deepCopy(previewTemplate);
|
||||||
if (this.state.webhook.isUserExtended) {
|
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);
|
const previewText = JSON.stringify(preview, null, 2);
|
||||||
|
|
||||||
@ -295,6 +304,18 @@ class WebhookEditPage extends React.Component {
|
|||||||
}} />
|
}} />
|
||||||
</Col>
|
</Col>
|
||||||
</Row>
|
</Row>
|
||||||
|
<Row style={{marginTop: "20px"}} >
|
||||||
|
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
|
||||||
|
{Setting.getLabel(i18next.t("application:Extended user fields"), i18next.t("application:Extended user fields - Tooltip"))} :
|
||||||
|
</Col>
|
||||||
|
<Col span={22} >
|
||||||
|
<Select virtual={false} mode="tags" showSearch style={{width: "100%"}} value={this.state.webhook.tokenFields} onChange={(value => {this.updateWebhookField("tokenFields", value);})}>
|
||||||
|
{
|
||||||
|
Setting.getUserCommonFields().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()) ? 22 : 2}>
|
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
|
||||||
{Setting.getLabel(i18next.t("general:Preview"), i18next.t("general:Preview - Tooltip"))} :
|
{Setting.getLabel(i18next.t("general:Preview"), i18next.t("general:Preview - Tooltip"))} :
|
||||||
|
Loading…
x
Reference in New Issue
Block a user