mirror of
https://github.com/casdoor/casdoor.git
synced 2025-05-23 10:45:47 +08:00
feat: support checking whether send-webhook API has error (#2944)
* feat: add webhook response for record * refactor: refactor SendWebhook and use readall to read response body * fix: improve code format * fix: improve code format * fix: improve code format
This commit is contained in:
parent
0ecc1d599f
commit
b6b0b7d318
2
go.mod
2
go.mod
@ -14,7 +14,7 @@ require (
|
|||||||
github.com/casdoor/notify v0.45.0
|
github.com/casdoor/notify v0.45.0
|
||||||
github.com/casdoor/oss v1.6.0
|
github.com/casdoor/oss v1.6.0
|
||||||
github.com/casdoor/xorm-adapter/v3 v3.1.0
|
github.com/casdoor/xorm-adapter/v3 v3.1.0
|
||||||
github.com/casvisor/casvisor-go-sdk v1.3.0
|
github.com/casvisor/casvisor-go-sdk v1.4.0
|
||||||
github.com/dchest/captcha v0.0.0-20200903113550-03f5f0333e1f
|
github.com/dchest/captcha v0.0.0-20200903113550-03f5f0333e1f
|
||||||
github.com/denisenkom/go-mssqldb v0.9.0
|
github.com/denisenkom/go-mssqldb v0.9.0
|
||||||
github.com/elazarl/go-bindata-assetfs v1.0.1 // indirect
|
github.com/elazarl/go-bindata-assetfs v1.0.1 // indirect
|
||||||
|
4
go.sum
4
go.sum
@ -1095,8 +1095,8 @@ github.com/casdoor/oss v1.6.0 h1:IOWrGLJ+VO82qS796eaRnzFPPA1Sn3cotYTi7O/VIlQ=
|
|||||||
github.com/casdoor/oss v1.6.0/go.mod h1:rJAWA0hLhtu94t6IRpotLUkXO1NWMASirywQYaGizJE=
|
github.com/casdoor/oss v1.6.0/go.mod h1:rJAWA0hLhtu94t6IRpotLUkXO1NWMASirywQYaGizJE=
|
||||||
github.com/casdoor/xorm-adapter/v3 v3.1.0 h1:NodWayRtSLVSeCvL9H3Hc61k0G17KhV9IymTCNfh3kk=
|
github.com/casdoor/xorm-adapter/v3 v3.1.0 h1:NodWayRtSLVSeCvL9H3Hc61k0G17KhV9IymTCNfh3kk=
|
||||||
github.com/casdoor/xorm-adapter/v3 v3.1.0/go.mod h1:4WTcUw+bTgBylGHeGHzTtBvuTXRS23dtwzFLl9tsgFM=
|
github.com/casdoor/xorm-adapter/v3 v3.1.0/go.mod h1:4WTcUw+bTgBylGHeGHzTtBvuTXRS23dtwzFLl9tsgFM=
|
||||||
github.com/casvisor/casvisor-go-sdk v1.3.0 h1:HVgm2g3lWpNX2wBNidzR743QY4O5kAjLUJ9tS2juO8g=
|
github.com/casvisor/casvisor-go-sdk v1.4.0 h1:hbZEGGJ1cwdHFAxeXrMoNw6yha6Oyg2F0qQhBNCN/dg=
|
||||||
github.com/casvisor/casvisor-go-sdk v1.3.0/go.mod h1:frnNtH5GA0wxzAQLyZxxfL0RSsSub9GQPi2Ybe86ocE=
|
github.com/casvisor/casvisor-go-sdk v1.4.0/go.mod h1:frnNtH5GA0wxzAQLyZxxfL0RSsSub9GQPi2Ybe86ocE=
|
||||||
github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
|
github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
|
||||||
github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
|
github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
|
||||||
github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4=
|
github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4=
|
||||||
|
@ -90,12 +90,18 @@ func NewRecord(ctx *context.Context) (*casvisorsdk.Record, error) {
|
|||||||
Action: action,
|
Action: action,
|
||||||
Language: languageCode,
|
Language: languageCode,
|
||||||
Object: object,
|
Object: object,
|
||||||
|
StatusCode: 200,
|
||||||
Response: fmt.Sprintf("{status:\"%s\", msg:\"%s\"}", resp.Status, resp.Msg),
|
Response: fmt.Sprintf("{status:\"%s\", msg:\"%s\"}", resp.Status, resp.Msg),
|
||||||
IsTriggered: false,
|
IsTriggered: false,
|
||||||
}
|
}
|
||||||
return &record, nil
|
return &record, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func addRecord(record *casvisorsdk.Record) (int64, error) {
|
||||||
|
affected, err := ormer.Engine.Insert(record)
|
||||||
|
return affected, err
|
||||||
|
}
|
||||||
|
|
||||||
func AddRecord(record *casvisorsdk.Record) bool {
|
func AddRecord(record *casvisorsdk.Record) bool {
|
||||||
if logPostOnly {
|
if logPostOnly {
|
||||||
if record.Method == "GET" {
|
if record.Method == "GET" {
|
||||||
@ -108,7 +114,6 @@ func AddRecord(record *casvisorsdk.Record) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
record.Owner = record.Organization
|
record.Owner = record.Organization
|
||||||
|
|
||||||
record.Object = maskPassword(record.Object)
|
record.Object = maskPassword(record.Object)
|
||||||
|
|
||||||
errWebhook := SendWebhooks(record)
|
errWebhook := SendWebhooks(record)
|
||||||
@ -119,7 +124,7 @@ func AddRecord(record *casvisorsdk.Record) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if casvisorsdk.GetClient() == nil {
|
if casvisorsdk.GetClient() == nil {
|
||||||
affected, err := ormer.Engine.Insert(record)
|
affected, err := addRecord(record)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
@ -224,6 +229,40 @@ func getFilteredWebhooks(webhooks []*Webhook, organization string, action string
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func addWebhookRecord(webhook *Webhook, record *casvisorsdk.Record, statusCode int, respBody string, sendError error) error {
|
||||||
|
if statusCode == 200 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(respBody) > 300 {
|
||||||
|
respBody = respBody[0:300]
|
||||||
|
}
|
||||||
|
|
||||||
|
webhookRecord := &casvisorsdk.Record{
|
||||||
|
Owner: record.Owner,
|
||||||
|
Name: util.GenerateId(),
|
||||||
|
CreatedTime: util.GetCurrentTime(),
|
||||||
|
Organization: record.Organization,
|
||||||
|
User: record.User,
|
||||||
|
|
||||||
|
Method: webhook.Method,
|
||||||
|
Action: "send-webhook",
|
||||||
|
RequestUri: webhook.Url,
|
||||||
|
StatusCode: statusCode,
|
||||||
|
Response: respBody,
|
||||||
|
Language: record.Language,
|
||||||
|
IsTriggered: false,
|
||||||
|
}
|
||||||
|
|
||||||
|
if sendError != nil {
|
||||||
|
webhookRecord.Response = sendError.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := addRecord(webhookRecord)
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
func SendWebhooks(record *casvisorsdk.Record) error {
|
func SendWebhooks(record *casvisorsdk.Record) error {
|
||||||
webhooks, err := getWebhooksByOrganization("")
|
webhooks, err := getWebhooksByOrganization("")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -248,11 +287,16 @@ func SendWebhooks(record *casvisorsdk.Record) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
err = sendWebhook(webhook, record, user)
|
statusCode, respBody, err := sendWebhook(webhook, record, user)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errs = append(errs, err)
|
errs = append(errs, err)
|
||||||
continue
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = addWebhookRecord(webhook, record, statusCode, respBody, err)
|
||||||
|
if err != nil {
|
||||||
|
errs = append(errs, err)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(errs) > 0 {
|
if len(errs) > 0 {
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
package object
|
package object
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
@ -22,7 +23,7 @@ import (
|
|||||||
"github.com/casvisor/casvisor-go-sdk/casvisorsdk"
|
"github.com/casvisor/casvisor-go-sdk/casvisorsdk"
|
||||||
)
|
)
|
||||||
|
|
||||||
func sendWebhook(webhook *Webhook, record *casvisorsdk.Record, extendedUser *User) error {
|
func sendWebhook(webhook *Webhook, record *casvisorsdk.Record, extendedUser *User) (int, string, error) {
|
||||||
client := &http.Client{}
|
client := &http.Client{}
|
||||||
|
|
||||||
type RecordEx struct {
|
type RecordEx struct {
|
||||||
@ -38,7 +39,7 @@ func sendWebhook(webhook *Webhook, record *casvisorsdk.Record, extendedUser *Use
|
|||||||
|
|
||||||
req, err := http.NewRequest(webhook.Method, webhook.Url, body)
|
req, err := http.NewRequest(webhook.Method, webhook.Url, body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return 0, "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
req.Header.Set("Content-Type", webhook.ContentType)
|
req.Header.Set("Content-Type", webhook.ContentType)
|
||||||
@ -47,6 +48,15 @@ func sendWebhook(webhook *Webhook, record *casvisorsdk.Record, extendedUser *Use
|
|||||||
req.Header.Set(header.Name, header.Value)
|
req.Header.Set(header.Name, header.Value)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = client.Do(req)
|
resp, err := client.Do(req)
|
||||||
return err
|
if err != nil {
|
||||||
|
return 0, "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
defer resp.Body.Close()
|
||||||
|
bodyBytes, err := io.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
return 0, "", err
|
||||||
|
}
|
||||||
|
return resp.StatusCode, string(bodyBytes), err
|
||||||
}
|
}
|
||||||
|
@ -151,6 +151,14 @@ class RecordListPage extends BaseListPage {
|
|||||||
sorter: true,
|
sorter: true,
|
||||||
...this.getColumnSearchProps("language"),
|
...this.getColumnSearchProps("language"),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: i18next.t("record:Status code"),
|
||||||
|
dataIndex: "statusCode",
|
||||||
|
key: "statusCode",
|
||||||
|
width: "90px",
|
||||||
|
sorter: true,
|
||||||
|
...this.getColumnSearchProps("statusCode"),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: i18next.t("record:Response"),
|
title: i18next.t("record:Response"),
|
||||||
dataIndex: "response",
|
dataIndex: "response",
|
||||||
|
@ -897,7 +897,8 @@
|
|||||||
"record": {
|
"record": {
|
||||||
"Is triggered": "Is triggered",
|
"Is triggered": "Is triggered",
|
||||||
"Object": "Object",
|
"Object": "Object",
|
||||||
"Response": "Response"
|
"Response": "Response",
|
||||||
|
"Status code": "Status code"
|
||||||
},
|
},
|
||||||
"resource": {
|
"resource": {
|
||||||
"Copy Link": "Copy Link",
|
"Copy Link": "Copy Link",
|
||||||
@ -1171,6 +1172,7 @@
|
|||||||
"input password": "input password"
|
"input password": "input password"
|
||||||
},
|
},
|
||||||
"verification": {
|
"verification": {
|
||||||
|
"Is used": "Is used",
|
||||||
"Receiver": "Receiver"
|
"Receiver": "Receiver"
|
||||||
},
|
},
|
||||||
"webhook": {
|
"webhook": {
|
||||||
|
@ -897,7 +897,8 @@
|
|||||||
"record": {
|
"record": {
|
||||||
"Is triggered": "Is triggered",
|
"Is triggered": "Is triggered",
|
||||||
"Object": "Object",
|
"Object": "Object",
|
||||||
"Response": "Response"
|
"Response": "Response",
|
||||||
|
"Status code": "Status code"
|
||||||
},
|
},
|
||||||
"resource": {
|
"resource": {
|
||||||
"Copy Link": "Kopiere den Link",
|
"Copy Link": "Kopiere den Link",
|
||||||
@ -1171,6 +1172,7 @@
|
|||||||
"input password": "Eingabe des Passworts"
|
"input password": "Eingabe des Passworts"
|
||||||
},
|
},
|
||||||
"verification": {
|
"verification": {
|
||||||
|
"Is used": "Is used",
|
||||||
"Receiver": "Receiver"
|
"Receiver": "Receiver"
|
||||||
},
|
},
|
||||||
"webhook": {
|
"webhook": {
|
||||||
|
@ -897,7 +897,8 @@
|
|||||||
"record": {
|
"record": {
|
||||||
"Is triggered": "Is triggered",
|
"Is triggered": "Is triggered",
|
||||||
"Object": "Object",
|
"Object": "Object",
|
||||||
"Response": "Response"
|
"Response": "Response",
|
||||||
|
"Status code": "Status code"
|
||||||
},
|
},
|
||||||
"resource": {
|
"resource": {
|
||||||
"Copy Link": "Copy Link",
|
"Copy Link": "Copy Link",
|
||||||
@ -1171,6 +1172,7 @@
|
|||||||
"input password": "input password"
|
"input password": "input password"
|
||||||
},
|
},
|
||||||
"verification": {
|
"verification": {
|
||||||
|
"Is used": "Is used",
|
||||||
"Receiver": "Receiver"
|
"Receiver": "Receiver"
|
||||||
},
|
},
|
||||||
"webhook": {
|
"webhook": {
|
||||||
|
@ -897,7 +897,8 @@
|
|||||||
"record": {
|
"record": {
|
||||||
"Is triggered": "Is triggered",
|
"Is triggered": "Is triggered",
|
||||||
"Object": "Object",
|
"Object": "Object",
|
||||||
"Response": "Response"
|
"Response": "Response",
|
||||||
|
"Status code": "Status code"
|
||||||
},
|
},
|
||||||
"resource": {
|
"resource": {
|
||||||
"Copy Link": "Copiar enlace",
|
"Copy Link": "Copiar enlace",
|
||||||
@ -1171,6 +1172,7 @@
|
|||||||
"input password": "Ingresar contraseña"
|
"input password": "Ingresar contraseña"
|
||||||
},
|
},
|
||||||
"verification": {
|
"verification": {
|
||||||
|
"Is used": "Is used",
|
||||||
"Receiver": "Receiver"
|
"Receiver": "Receiver"
|
||||||
},
|
},
|
||||||
"webhook": {
|
"webhook": {
|
||||||
|
@ -897,7 +897,8 @@
|
|||||||
"record": {
|
"record": {
|
||||||
"Is triggered": "Is triggered",
|
"Is triggered": "Is triggered",
|
||||||
"Object": "Object",
|
"Object": "Object",
|
||||||
"Response": "Response"
|
"Response": "Response",
|
||||||
|
"Status code": "Status code"
|
||||||
},
|
},
|
||||||
"resource": {
|
"resource": {
|
||||||
"Copy Link": "Copy Link",
|
"Copy Link": "Copy Link",
|
||||||
@ -1171,6 +1172,7 @@
|
|||||||
"input password": "input password"
|
"input password": "input password"
|
||||||
},
|
},
|
||||||
"verification": {
|
"verification": {
|
||||||
|
"Is used": "Is used",
|
||||||
"Receiver": "Receiver"
|
"Receiver": "Receiver"
|
||||||
},
|
},
|
||||||
"webhook": {
|
"webhook": {
|
||||||
|
@ -897,7 +897,8 @@
|
|||||||
"record": {
|
"record": {
|
||||||
"Is triggered": "Is triggered",
|
"Is triggered": "Is triggered",
|
||||||
"Object": "Object",
|
"Object": "Object",
|
||||||
"Response": "Response"
|
"Response": "Response",
|
||||||
|
"Status code": "Status code"
|
||||||
},
|
},
|
||||||
"resource": {
|
"resource": {
|
||||||
"Copy Link": "Copy Link",
|
"Copy Link": "Copy Link",
|
||||||
@ -1171,6 +1172,7 @@
|
|||||||
"input password": "input password"
|
"input password": "input password"
|
||||||
},
|
},
|
||||||
"verification": {
|
"verification": {
|
||||||
|
"Is used": "Is used",
|
||||||
"Receiver": "Receiver"
|
"Receiver": "Receiver"
|
||||||
},
|
},
|
||||||
"webhook": {
|
"webhook": {
|
||||||
|
@ -897,7 +897,8 @@
|
|||||||
"record": {
|
"record": {
|
||||||
"Is triggered": "Is triggered",
|
"Is triggered": "Is triggered",
|
||||||
"Object": "Object",
|
"Object": "Object",
|
||||||
"Response": "Response"
|
"Response": "Response",
|
||||||
|
"Status code": "Status code"
|
||||||
},
|
},
|
||||||
"resource": {
|
"resource": {
|
||||||
"Copy Link": "Copier le lien",
|
"Copy Link": "Copier le lien",
|
||||||
@ -1171,6 +1172,7 @@
|
|||||||
"input password": "saisir le mot de passe"
|
"input password": "saisir le mot de passe"
|
||||||
},
|
},
|
||||||
"verification": {
|
"verification": {
|
||||||
|
"Is used": "Is used",
|
||||||
"Receiver": "Receiver"
|
"Receiver": "Receiver"
|
||||||
},
|
},
|
||||||
"webhook": {
|
"webhook": {
|
||||||
|
@ -897,7 +897,8 @@
|
|||||||
"record": {
|
"record": {
|
||||||
"Is triggered": "Is triggered",
|
"Is triggered": "Is triggered",
|
||||||
"Object": "Object",
|
"Object": "Object",
|
||||||
"Response": "Response"
|
"Response": "Response",
|
||||||
|
"Status code": "Status code"
|
||||||
},
|
},
|
||||||
"resource": {
|
"resource": {
|
||||||
"Copy Link": "Copy Link",
|
"Copy Link": "Copy Link",
|
||||||
@ -1171,6 +1172,7 @@
|
|||||||
"input password": "input password"
|
"input password": "input password"
|
||||||
},
|
},
|
||||||
"verification": {
|
"verification": {
|
||||||
|
"Is used": "Is used",
|
||||||
"Receiver": "Receiver"
|
"Receiver": "Receiver"
|
||||||
},
|
},
|
||||||
"webhook": {
|
"webhook": {
|
||||||
|
@ -897,7 +897,8 @@
|
|||||||
"record": {
|
"record": {
|
||||||
"Is triggered": "Is triggered",
|
"Is triggered": "Is triggered",
|
||||||
"Object": "Object",
|
"Object": "Object",
|
||||||
"Response": "Response"
|
"Response": "Response",
|
||||||
|
"Status code": "Status code"
|
||||||
},
|
},
|
||||||
"resource": {
|
"resource": {
|
||||||
"Copy Link": "Salin Tautan",
|
"Copy Link": "Salin Tautan",
|
||||||
@ -1171,6 +1172,7 @@
|
|||||||
"input password": "masukkan kata sandi"
|
"input password": "masukkan kata sandi"
|
||||||
},
|
},
|
||||||
"verification": {
|
"verification": {
|
||||||
|
"Is used": "Is used",
|
||||||
"Receiver": "Receiver"
|
"Receiver": "Receiver"
|
||||||
},
|
},
|
||||||
"webhook": {
|
"webhook": {
|
||||||
|
@ -897,7 +897,8 @@
|
|||||||
"record": {
|
"record": {
|
||||||
"Is triggered": "Is triggered",
|
"Is triggered": "Is triggered",
|
||||||
"Object": "Object",
|
"Object": "Object",
|
||||||
"Response": "Response"
|
"Response": "Response",
|
||||||
|
"Status code": "Status code"
|
||||||
},
|
},
|
||||||
"resource": {
|
"resource": {
|
||||||
"Copy Link": "Copy Link",
|
"Copy Link": "Copy Link",
|
||||||
@ -1171,6 +1172,7 @@
|
|||||||
"input password": "input password"
|
"input password": "input password"
|
||||||
},
|
},
|
||||||
"verification": {
|
"verification": {
|
||||||
|
"Is used": "Is used",
|
||||||
"Receiver": "Receiver"
|
"Receiver": "Receiver"
|
||||||
},
|
},
|
||||||
"webhook": {
|
"webhook": {
|
||||||
|
@ -897,7 +897,8 @@
|
|||||||
"record": {
|
"record": {
|
||||||
"Is triggered": "Is triggered",
|
"Is triggered": "Is triggered",
|
||||||
"Object": "Object",
|
"Object": "Object",
|
||||||
"Response": "Response"
|
"Response": "Response",
|
||||||
|
"Status code": "Status code"
|
||||||
},
|
},
|
||||||
"resource": {
|
"resource": {
|
||||||
"Copy Link": "コピー リンク",
|
"Copy Link": "コピー リンク",
|
||||||
@ -1171,6 +1172,7 @@
|
|||||||
"input password": "パスワードを入力してください"
|
"input password": "パスワードを入力してください"
|
||||||
},
|
},
|
||||||
"verification": {
|
"verification": {
|
||||||
|
"Is used": "Is used",
|
||||||
"Receiver": "Receiver"
|
"Receiver": "Receiver"
|
||||||
},
|
},
|
||||||
"webhook": {
|
"webhook": {
|
||||||
|
@ -897,7 +897,8 @@
|
|||||||
"record": {
|
"record": {
|
||||||
"Is triggered": "Is triggered",
|
"Is triggered": "Is triggered",
|
||||||
"Object": "Object",
|
"Object": "Object",
|
||||||
"Response": "Response"
|
"Response": "Response",
|
||||||
|
"Status code": "Status code"
|
||||||
},
|
},
|
||||||
"resource": {
|
"resource": {
|
||||||
"Copy Link": "Copy Link",
|
"Copy Link": "Copy Link",
|
||||||
@ -1171,6 +1172,7 @@
|
|||||||
"input password": "input password"
|
"input password": "input password"
|
||||||
},
|
},
|
||||||
"verification": {
|
"verification": {
|
||||||
|
"Is used": "Is used",
|
||||||
"Receiver": "Receiver"
|
"Receiver": "Receiver"
|
||||||
},
|
},
|
||||||
"webhook": {
|
"webhook": {
|
||||||
|
@ -897,7 +897,8 @@
|
|||||||
"record": {
|
"record": {
|
||||||
"Is triggered": "Is triggered",
|
"Is triggered": "Is triggered",
|
||||||
"Object": "Object",
|
"Object": "Object",
|
||||||
"Response": "Response"
|
"Response": "Response",
|
||||||
|
"Status code": "Status code"
|
||||||
},
|
},
|
||||||
"resource": {
|
"resource": {
|
||||||
"Copy Link": "링크 복사하기",
|
"Copy Link": "링크 복사하기",
|
||||||
@ -1171,6 +1172,7 @@
|
|||||||
"input password": "비밀번호를 입력해주세요"
|
"input password": "비밀번호를 입력해주세요"
|
||||||
},
|
},
|
||||||
"verification": {
|
"verification": {
|
||||||
|
"Is used": "Is used",
|
||||||
"Receiver": "Receiver"
|
"Receiver": "Receiver"
|
||||||
},
|
},
|
||||||
"webhook": {
|
"webhook": {
|
||||||
|
@ -897,7 +897,8 @@
|
|||||||
"record": {
|
"record": {
|
||||||
"Is triggered": "Is triggered",
|
"Is triggered": "Is triggered",
|
||||||
"Object": "Object",
|
"Object": "Object",
|
||||||
"Response": "Response"
|
"Response": "Response",
|
||||||
|
"Status code": "Status code"
|
||||||
},
|
},
|
||||||
"resource": {
|
"resource": {
|
||||||
"Copy Link": "Copy Link",
|
"Copy Link": "Copy Link",
|
||||||
@ -1171,6 +1172,7 @@
|
|||||||
"input password": "input password"
|
"input password": "input password"
|
||||||
},
|
},
|
||||||
"verification": {
|
"verification": {
|
||||||
|
"Is used": "Is used",
|
||||||
"Receiver": "Receiver"
|
"Receiver": "Receiver"
|
||||||
},
|
},
|
||||||
"webhook": {
|
"webhook": {
|
||||||
|
@ -897,7 +897,8 @@
|
|||||||
"record": {
|
"record": {
|
||||||
"Is triggered": "Is triggered",
|
"Is triggered": "Is triggered",
|
||||||
"Object": "Object",
|
"Object": "Object",
|
||||||
"Response": "Response"
|
"Response": "Response",
|
||||||
|
"Status code": "Status code"
|
||||||
},
|
},
|
||||||
"resource": {
|
"resource": {
|
||||||
"Copy Link": "Copy Link",
|
"Copy Link": "Copy Link",
|
||||||
@ -1171,6 +1172,7 @@
|
|||||||
"input password": "input password"
|
"input password": "input password"
|
||||||
},
|
},
|
||||||
"verification": {
|
"verification": {
|
||||||
|
"Is used": "Is used",
|
||||||
"Receiver": "Receiver"
|
"Receiver": "Receiver"
|
||||||
},
|
},
|
||||||
"webhook": {
|
"webhook": {
|
||||||
|
@ -897,7 +897,8 @@
|
|||||||
"record": {
|
"record": {
|
||||||
"Is triggered": "Is triggered",
|
"Is triggered": "Is triggered",
|
||||||
"Object": "Object",
|
"Object": "Object",
|
||||||
"Response": "Response"
|
"Response": "Response",
|
||||||
|
"Status code": "Status code"
|
||||||
},
|
},
|
||||||
"resource": {
|
"resource": {
|
||||||
"Copy Link": "Copy Link",
|
"Copy Link": "Copy Link",
|
||||||
@ -1171,6 +1172,7 @@
|
|||||||
"input password": "input password"
|
"input password": "input password"
|
||||||
},
|
},
|
||||||
"verification": {
|
"verification": {
|
||||||
|
"Is used": "Is used",
|
||||||
"Receiver": "Receiver"
|
"Receiver": "Receiver"
|
||||||
},
|
},
|
||||||
"webhook": {
|
"webhook": {
|
||||||
|
@ -897,7 +897,8 @@
|
|||||||
"record": {
|
"record": {
|
||||||
"Is triggered": "Is triggered",
|
"Is triggered": "Is triggered",
|
||||||
"Object": "Object",
|
"Object": "Object",
|
||||||
"Response": "Response"
|
"Response": "Response",
|
||||||
|
"Status code": "Status code"
|
||||||
},
|
},
|
||||||
"resource": {
|
"resource": {
|
||||||
"Copy Link": "Copiar Link",
|
"Copy Link": "Copiar Link",
|
||||||
@ -1171,6 +1172,7 @@
|
|||||||
"input password": "Digite a senha"
|
"input password": "Digite a senha"
|
||||||
},
|
},
|
||||||
"verification": {
|
"verification": {
|
||||||
|
"Is used": "Is used",
|
||||||
"Receiver": "Receiver"
|
"Receiver": "Receiver"
|
||||||
},
|
},
|
||||||
"webhook": {
|
"webhook": {
|
||||||
|
@ -897,7 +897,8 @@
|
|||||||
"record": {
|
"record": {
|
||||||
"Is triggered": "Is triggered",
|
"Is triggered": "Is triggered",
|
||||||
"Object": "Object",
|
"Object": "Object",
|
||||||
"Response": "Response"
|
"Response": "Response",
|
||||||
|
"Status code": "Status code"
|
||||||
},
|
},
|
||||||
"resource": {
|
"resource": {
|
||||||
"Copy Link": "Копировать ссылку",
|
"Copy Link": "Копировать ссылку",
|
||||||
@ -1171,6 +1172,7 @@
|
|||||||
"input password": "введите пароль"
|
"input password": "введите пароль"
|
||||||
},
|
},
|
||||||
"verification": {
|
"verification": {
|
||||||
|
"Is used": "Is used",
|
||||||
"Receiver": "Receiver"
|
"Receiver": "Receiver"
|
||||||
},
|
},
|
||||||
"webhook": {
|
"webhook": {
|
||||||
|
@ -897,7 +897,8 @@
|
|||||||
"record": {
|
"record": {
|
||||||
"Is triggered": "Is triggered",
|
"Is triggered": "Is triggered",
|
||||||
"Object": "Object",
|
"Object": "Object",
|
||||||
"Response": "Response"
|
"Response": "Response",
|
||||||
|
"Status code": "Status code"
|
||||||
},
|
},
|
||||||
"resource": {
|
"resource": {
|
||||||
"Copy Link": "Copy Link",
|
"Copy Link": "Copy Link",
|
||||||
@ -1171,6 +1172,7 @@
|
|||||||
"input password": "input password"
|
"input password": "input password"
|
||||||
},
|
},
|
||||||
"verification": {
|
"verification": {
|
||||||
|
"Is used": "Is used",
|
||||||
"Receiver": "Receiver"
|
"Receiver": "Receiver"
|
||||||
},
|
},
|
||||||
"webhook": {
|
"webhook": {
|
||||||
|
@ -897,7 +897,8 @@
|
|||||||
"record": {
|
"record": {
|
||||||
"Is triggered": "Is triggered",
|
"Is triggered": "Is triggered",
|
||||||
"Object": "Object",
|
"Object": "Object",
|
||||||
"Response": "Response"
|
"Response": "Response",
|
||||||
|
"Status code": "Status code"
|
||||||
},
|
},
|
||||||
"resource": {
|
"resource": {
|
||||||
"Copy Link": "Copy Link",
|
"Copy Link": "Copy Link",
|
||||||
@ -1171,6 +1172,7 @@
|
|||||||
"input password": "şifreyi girin"
|
"input password": "şifreyi girin"
|
||||||
},
|
},
|
||||||
"verification": {
|
"verification": {
|
||||||
|
"Is used": "Is used",
|
||||||
"Receiver": "Receiver"
|
"Receiver": "Receiver"
|
||||||
},
|
},
|
||||||
"webhook": {
|
"webhook": {
|
||||||
|
@ -80,6 +80,7 @@
|
|||||||
"Only signup": "Тільки реєстрація",
|
"Only signup": "Тільки реєстрація",
|
||||||
"Org choice mode": "Режим вибору організації",
|
"Org choice mode": "Режим вибору організації",
|
||||||
"Org choice mode - Tooltip": "Режим вибору організації – підказка",
|
"Org choice mode - Tooltip": "Режим вибору організації – підказка",
|
||||||
|
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"",
|
||||||
"Please input your application!": "Будь ласка, введіть свою заявку!",
|
"Please input your application!": "Будь ласка, введіть свою заявку!",
|
||||||
"Please input your organization!": "Будь ласка, введіть вашу організацію!",
|
"Please input your organization!": "Будь ласка, введіть вашу організацію!",
|
||||||
"Please select a HTML file": "Виберіть файл HTML",
|
"Please select a HTML file": "Виберіть файл HTML",
|
||||||
@ -229,6 +230,7 @@
|
|||||||
"Email": "Електронна пошта",
|
"Email": "Електронна пошта",
|
||||||
"Email - Tooltip": "Дійсна електронна пошта",
|
"Email - Tooltip": "Дійсна електронна пошта",
|
||||||
"Email only": "Лише електронна пошта",
|
"Email only": "Лише електронна пошта",
|
||||||
|
"Email or Phone": "Email or Phone",
|
||||||
"Enable": "Увімкнути",
|
"Enable": "Увімкнути",
|
||||||
"Enable dark logo": "Увімкнути темний логотип",
|
"Enable dark logo": "Увімкнути темний логотип",
|
||||||
"Enable dark logo - Tooltip": "Увімкнути темний логотип",
|
"Enable dark logo - Tooltip": "Увімкнути темний логотип",
|
||||||
@ -311,6 +313,7 @@
|
|||||||
"Phone": "Телефон",
|
"Phone": "Телефон",
|
||||||
"Phone - Tooltip": "Номер телефону",
|
"Phone - Tooltip": "Номер телефону",
|
||||||
"Phone only": "Тільки телефон",
|
"Phone only": "Тільки телефон",
|
||||||
|
"Phone or Email": "Phone or Email",
|
||||||
"Plan": "План",
|
"Plan": "План",
|
||||||
"Plan - Tooltip": "План – підказка",
|
"Plan - Tooltip": "План – підказка",
|
||||||
"Plans": "Плани",
|
"Plans": "Плани",
|
||||||
@ -391,6 +394,7 @@
|
|||||||
"User type": "Тип користувача",
|
"User type": "Тип користувача",
|
||||||
"User type - Tooltip": "Теги, до яких належить користувач, за умовчанням \"звичайний користувач\"",
|
"User type - Tooltip": "Теги, до яких належить користувач, за умовчанням \"звичайний користувач\"",
|
||||||
"Users": "Користувачі",
|
"Users": "Користувачі",
|
||||||
|
"Users - Tooltip": "Users - Tooltip",
|
||||||
"Users under all organizations": "Користувачі в усіх організаціях",
|
"Users under all organizations": "Користувачі в усіх організаціях",
|
||||||
"Verifications": "Перевірки",
|
"Verifications": "Перевірки",
|
||||||
"Webhooks": "Веб-хуки",
|
"Webhooks": "Веб-хуки",
|
||||||
@ -473,7 +477,6 @@
|
|||||||
"LDAP username, Email or phone": "Ім’я користувача LDAP, електронна пошта або телефон",
|
"LDAP username, Email or phone": "Ім’я користувача LDAP, електронна пошта або телефон",
|
||||||
"Loading": "Завантаження",
|
"Loading": "Завантаження",
|
||||||
"Logging out...": "Вихід...",
|
"Logging out...": "Вихід...",
|
||||||
"Login button": "Кнопка входу",
|
|
||||||
"MetaMask plugin not detected": "Плагін MetaMask не виявлено",
|
"MetaMask plugin not detected": "Плагін MetaMask не виявлено",
|
||||||
"Model loading failure": "Помилка завантаження моделі",
|
"Model loading failure": "Помилка завантаження моделі",
|
||||||
"No account?": "Немає облікового запису?",
|
"No account?": "Немає облікового запису?",
|
||||||
@ -498,6 +501,7 @@
|
|||||||
"Sign in with Face ID": "Увійдіть за допомогою Face ID",
|
"Sign in with Face ID": "Увійдіть за допомогою Face ID",
|
||||||
"Sign in with WebAuthn": "Увійдіть за допомогою WebAuthn",
|
"Sign in with WebAuthn": "Увійдіть за допомогою WebAuthn",
|
||||||
"Sign in with {type}": "Увійдіть за допомогою {type}",
|
"Sign in with {type}": "Увійдіть за допомогою {type}",
|
||||||
|
"Signin button": "Signin button",
|
||||||
"Signing in...": "Вхід...",
|
"Signing in...": "Вхід...",
|
||||||
"Successfully logged in with WebAuthn credentials": "Успішно ввійшли за допомогою облікових даних WebAuthn",
|
"Successfully logged in with WebAuthn credentials": "Успішно ввійшли за допомогою облікових даних WebAuthn",
|
||||||
"The camera is currently in use by another webpage": "Камера зараз використовується іншою веб-сторінкою",
|
"The camera is currently in use by another webpage": "Камера зараз використовується іншою веб-сторінкою",
|
||||||
@ -893,7 +897,8 @@
|
|||||||
"record": {
|
"record": {
|
||||||
"Is triggered": "Спрацьовує",
|
"Is triggered": "Спрацьовує",
|
||||||
"Object": "Об'єкт",
|
"Object": "Об'єкт",
|
||||||
"Response": "Відповідь"
|
"Response": "Відповідь",
|
||||||
|
"Status code": "Status code"
|
||||||
},
|
},
|
||||||
"resource": {
|
"resource": {
|
||||||
"Copy Link": "Копіювати посилання",
|
"Copy Link": "Копіювати посилання",
|
||||||
@ -941,6 +946,7 @@
|
|||||||
"Please select your country code!": "Виберіть код країни!",
|
"Please select your country code!": "Виберіть код країни!",
|
||||||
"Please select your country/region!": "Виберіть свою країну/регіон!",
|
"Please select your country/region!": "Виберіть свою країну/регіон!",
|
||||||
"Regex": "Регулярний вираз",
|
"Regex": "Регулярний вираз",
|
||||||
|
"Signup button": "Signup button",
|
||||||
"Terms of Use": "Умови використання",
|
"Terms of Use": "Умови використання",
|
||||||
"Terms of Use - Tooltip": "Умови використання, з якими користувачі повинні ознайомитися та погодитися під час реєстрації",
|
"Terms of Use - Tooltip": "Умови використання, з якими користувачі повинні ознайомитися та погодитися під час реєстрації",
|
||||||
"Text 1": "Текст 1",
|
"Text 1": "Текст 1",
|
||||||
@ -1162,9 +1168,11 @@
|
|||||||
"Values": "Цінності",
|
"Values": "Цінності",
|
||||||
"Verification code sent": "Код підтвердження надіслано",
|
"Verification code sent": "Код підтвердження надіслано",
|
||||||
"WebAuthn credentials": "Облікові дані WebAuthn",
|
"WebAuthn credentials": "Облікові дані WebAuthn",
|
||||||
|
"You have changed the username, please save your change first before modifying the password": "You have changed the username, please save your change first before modifying the password",
|
||||||
"input password": "введіть пароль"
|
"input password": "введіть пароль"
|
||||||
},
|
},
|
||||||
"verification": {
|
"verification": {
|
||||||
|
"Is used": "Is used",
|
||||||
"Receiver": "Приймач"
|
"Receiver": "Приймач"
|
||||||
},
|
},
|
||||||
"webhook": {
|
"webhook": {
|
||||||
|
@ -897,7 +897,8 @@
|
|||||||
"record": {
|
"record": {
|
||||||
"Is triggered": "Is triggered",
|
"Is triggered": "Is triggered",
|
||||||
"Object": "Object",
|
"Object": "Object",
|
||||||
"Response": "Response"
|
"Response": "Response",
|
||||||
|
"Status code": "Status code"
|
||||||
},
|
},
|
||||||
"resource": {
|
"resource": {
|
||||||
"Copy Link": "Sao chép liên kết",
|
"Copy Link": "Sao chép liên kết",
|
||||||
@ -1171,6 +1172,7 @@
|
|||||||
"input password": "Nhập mật khẩu"
|
"input password": "Nhập mật khẩu"
|
||||||
},
|
},
|
||||||
"verification": {
|
"verification": {
|
||||||
|
"Is used": "Is used",
|
||||||
"Receiver": "Receiver"
|
"Receiver": "Receiver"
|
||||||
},
|
},
|
||||||
"webhook": {
|
"webhook": {
|
||||||
|
@ -897,7 +897,8 @@
|
|||||||
"record": {
|
"record": {
|
||||||
"Is triggered": "是否触发",
|
"Is triggered": "是否触发",
|
||||||
"Object": "实体",
|
"Object": "实体",
|
||||||
"Response": "响应"
|
"Response": "响应",
|
||||||
|
"Status code": "状态码"
|
||||||
},
|
},
|
||||||
"resource": {
|
"resource": {
|
||||||
"Copy Link": "复制链接",
|
"Copy Link": "复制链接",
|
||||||
@ -1171,6 +1172,7 @@
|
|||||||
"input password": "输入密码"
|
"input password": "输入密码"
|
||||||
},
|
},
|
||||||
"verification": {
|
"verification": {
|
||||||
|
"Is used": "已使用",
|
||||||
"Receiver": "接收者"
|
"Receiver": "接收者"
|
||||||
},
|
},
|
||||||
"webhook": {
|
"webhook": {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user