Merge branch 'main' of https://github.com/authorizerdev/authorizer into feat/add-email-template-apis
This commit is contained in:
commit
aa12757155
|
@ -4,6 +4,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/authorizerdev/authorizer/server/graph/model"
|
"github.com/authorizerdev/authorizer/server/graph/model"
|
||||||
|
"github.com/authorizerdev/authorizer/server/refs"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Note: any change here should be reflected in providers/casandra/provider.go as it does not have model support in collection creation
|
// Note: any change here should be reflected in providers/casandra/provider.go as it does not have model support in collection creation
|
||||||
|
@ -35,9 +36,6 @@ type User struct {
|
||||||
func (user *User) AsAPIUser() *model.User {
|
func (user *User) AsAPIUser() *model.User {
|
||||||
isEmailVerified := user.EmailVerifiedAt != nil
|
isEmailVerified := user.EmailVerifiedAt != nil
|
||||||
isPhoneVerified := user.PhoneNumberVerifiedAt != nil
|
isPhoneVerified := user.PhoneNumberVerifiedAt != nil
|
||||||
email := user.Email
|
|
||||||
createdAt := user.CreatedAt
|
|
||||||
updatedAt := user.UpdatedAt
|
|
||||||
|
|
||||||
id := user.ID
|
id := user.ID
|
||||||
if strings.Contains(id, Collections.WebhookLog+"/") {
|
if strings.Contains(id, Collections.WebhookLog+"/") {
|
||||||
|
@ -52,7 +50,7 @@ func (user *User) AsAPIUser() *model.User {
|
||||||
FamilyName: user.FamilyName,
|
FamilyName: user.FamilyName,
|
||||||
MiddleName: user.MiddleName,
|
MiddleName: user.MiddleName,
|
||||||
Nickname: user.Nickname,
|
Nickname: user.Nickname,
|
||||||
PreferredUsername: &email,
|
PreferredUsername: refs.NewStringRef(user.Email),
|
||||||
Gender: user.Gender,
|
Gender: user.Gender,
|
||||||
Birthdate: user.Birthdate,
|
Birthdate: user.Birthdate,
|
||||||
PhoneNumber: user.PhoneNumber,
|
PhoneNumber: user.PhoneNumber,
|
||||||
|
@ -60,7 +58,7 @@ func (user *User) AsAPIUser() *model.User {
|
||||||
Picture: user.Picture,
|
Picture: user.Picture,
|
||||||
Roles: strings.Split(user.Roles, ","),
|
Roles: strings.Split(user.Roles, ","),
|
||||||
RevokedTimestamp: user.RevokedTimestamp,
|
RevokedTimestamp: user.RevokedTimestamp,
|
||||||
CreatedAt: &createdAt,
|
CreatedAt: refs.NewInt64Ref(user.CreatedAt),
|
||||||
UpdatedAt: &updatedAt,
|
UpdatedAt: refs.NewInt64Ref(user.UpdatedAt),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/authorizerdev/authorizer/server/graph/model"
|
"github.com/authorizerdev/authorizer/server/graph/model"
|
||||||
|
"github.com/authorizerdev/authorizer/server/refs"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Note: any change here should be reflected in providers/casandra/provider.go as it does not have model support in collection creation
|
// Note: any change here should be reflected in providers/casandra/provider.go as it does not have model support in collection creation
|
||||||
|
@ -23,28 +24,20 @@ type VerificationRequest struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *VerificationRequest) AsAPIVerificationRequest() *model.VerificationRequest {
|
func (v *VerificationRequest) AsAPIVerificationRequest() *model.VerificationRequest {
|
||||||
token := v.Token
|
|
||||||
createdAt := v.CreatedAt
|
|
||||||
updatedAt := v.UpdatedAt
|
|
||||||
email := v.Email
|
|
||||||
nonce := v.Nonce
|
|
||||||
redirectURI := v.RedirectURI
|
|
||||||
expires := v.ExpiresAt
|
|
||||||
identifier := v.Identifier
|
|
||||||
|
|
||||||
id := v.ID
|
id := v.ID
|
||||||
if strings.Contains(id, Collections.WebhookLog+"/") {
|
if strings.Contains(id, Collections.WebhookLog+"/") {
|
||||||
id = strings.TrimPrefix(id, Collections.WebhookLog+"/")
|
id = strings.TrimPrefix(id, Collections.WebhookLog+"/")
|
||||||
}
|
}
|
||||||
|
|
||||||
return &model.VerificationRequest{
|
return &model.VerificationRequest{
|
||||||
ID: id,
|
ID: id,
|
||||||
Token: &token,
|
Token: refs.NewStringRef(v.Token),
|
||||||
Identifier: &identifier,
|
Identifier: refs.NewStringRef(v.Identifier),
|
||||||
Expires: &expires,
|
Expires: refs.NewInt64Ref(v.ExpiresAt),
|
||||||
Email: &email,
|
Email: refs.NewStringRef(v.Email),
|
||||||
Nonce: &nonce,
|
Nonce: refs.NewStringRef(v.Nonce),
|
||||||
RedirectURI: &redirectURI,
|
RedirectURI: refs.NewStringRef(v.RedirectURI),
|
||||||
CreatedAt: &createdAt,
|
CreatedAt: refs.NewInt64Ref(v.CreatedAt),
|
||||||
UpdatedAt: &updatedAt,
|
UpdatedAt: refs.NewInt64Ref(v.UpdatedAt),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/authorizerdev/authorizer/server/graph/model"
|
"github.com/authorizerdev/authorizer/server/graph/model"
|
||||||
|
"github.com/authorizerdev/authorizer/server/refs"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Note: any change here should be reflected in providers/casandra/provider.go as it does not have model support in collection creation
|
// Note: any change here should be reflected in providers/casandra/provider.go as it does not have model support in collection creation
|
||||||
|
@ -30,13 +31,14 @@ func (w *Webhook) AsAPIWebhook() *model.Webhook {
|
||||||
if strings.Contains(id, Collections.Webhook+"/") {
|
if strings.Contains(id, Collections.Webhook+"/") {
|
||||||
id = strings.TrimPrefix(id, Collections.Webhook+"/")
|
id = strings.TrimPrefix(id, Collections.Webhook+"/")
|
||||||
}
|
}
|
||||||
|
|
||||||
return &model.Webhook{
|
return &model.Webhook{
|
||||||
ID: id,
|
ID: id,
|
||||||
EventName: &w.EventName,
|
EventName: refs.NewStringRef(w.EventName),
|
||||||
Endpoint: &w.EndPoint,
|
Endpoint: refs.NewStringRef(w.EndPoint),
|
||||||
Headers: headersMap,
|
Headers: headersMap,
|
||||||
Enabled: &w.Enabled,
|
Enabled: refs.NewBoolRef(w.Enabled),
|
||||||
CreatedAt: &w.CreatedAt,
|
CreatedAt: refs.NewInt64Ref(w.CreatedAt),
|
||||||
UpdatedAt: &w.UpdatedAt,
|
UpdatedAt: refs.NewInt64Ref(w.UpdatedAt),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/authorizerdev/authorizer/server/graph/model"
|
"github.com/authorizerdev/authorizer/server/graph/model"
|
||||||
|
"github.com/authorizerdev/authorizer/server/refs"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Note: any change here should be reflected in providers/casandra/provider.go as it does not have model support in collection creation
|
// Note: any change here should be reflected in providers/casandra/provider.go as it does not have model support in collection creation
|
||||||
|
@ -28,11 +29,11 @@ func (w *WebhookLog) AsAPIWebhookLog() *model.WebhookLog {
|
||||||
}
|
}
|
||||||
return &model.WebhookLog{
|
return &model.WebhookLog{
|
||||||
ID: id,
|
ID: id,
|
||||||
HTTPStatus: &w.HttpStatus,
|
HTTPStatus: refs.NewInt64Ref(w.HttpStatus),
|
||||||
Response: &w.Response,
|
Response: refs.NewStringRef(w.Response),
|
||||||
Request: &w.Request,
|
Request: refs.NewStringRef(w.Request),
|
||||||
WebhookID: &w.WebhookID,
|
WebhookID: refs.NewStringRef(w.WebhookID),
|
||||||
CreatedAt: &w.CreatedAt,
|
CreatedAt: refs.NewInt64Ref(w.CreatedAt),
|
||||||
UpdatedAt: &w.UpdatedAt,
|
UpdatedAt: refs.NewInt64Ref(w.UpdatedAt),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
14
server/refs/bool.go
Normal file
14
server/refs/bool.go
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
package refs
|
||||||
|
|
||||||
|
// NewBoolRef returns a reference to a bool with given value
|
||||||
|
func NewBoolRef(v bool) *bool {
|
||||||
|
return &v
|
||||||
|
}
|
||||||
|
|
||||||
|
// BoolValue returns the value of the given bool ref
|
||||||
|
func BoolValue(r *bool) bool {
|
||||||
|
if r == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return *r
|
||||||
|
}
|
14
server/refs/int.go
Normal file
14
server/refs/int.go
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
package refs
|
||||||
|
|
||||||
|
// NewInt64Ref returns a reference to a int64 with given value
|
||||||
|
func NewInt64Ref(v int64) *int64 {
|
||||||
|
return &v
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64Value returns the value of the given bool ref
|
||||||
|
func Int64Value(r *int64) int64 {
|
||||||
|
if r == nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return *r
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package utils
|
package refs
|
||||||
|
|
||||||
// NewStringRef returns a reference to a string with given value
|
// NewStringRef returns a reference to a string with given value
|
||||||
func NewStringRef(v string) *string {
|
func NewStringRef(v string) *string {
|
||||||
|
@ -16,15 +16,4 @@ func StringValue(r *string, defaultValue ...string) string {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewBoolRef returns a reference to a bool with given value
|
|
||||||
func NewBoolRef(v bool) *bool {
|
|
||||||
return &v
|
|
||||||
}
|
|
||||||
|
|
||||||
// BoolValue returns the value of the given bool ref
|
|
||||||
func BoolValue(r *bool) bool {
|
|
||||||
if r == nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return *r
|
|
||||||
}
|
|
|
@ -10,6 +10,7 @@ import (
|
||||||
"github.com/authorizerdev/authorizer/server/constants"
|
"github.com/authorizerdev/authorizer/server/constants"
|
||||||
"github.com/authorizerdev/authorizer/server/graph/model"
|
"github.com/authorizerdev/authorizer/server/graph/model"
|
||||||
"github.com/authorizerdev/authorizer/server/memorystore"
|
"github.com/authorizerdev/authorizer/server/memorystore"
|
||||||
|
"github.com/authorizerdev/authorizer/server/refs"
|
||||||
"github.com/authorizerdev/authorizer/server/token"
|
"github.com/authorizerdev/authorizer/server/token"
|
||||||
"github.com/authorizerdev/authorizer/server/utils"
|
"github.com/authorizerdev/authorizer/server/utils"
|
||||||
)
|
)
|
||||||
|
@ -38,10 +39,10 @@ func EnvResolver(ctx context.Context) (*model.Env, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if val, ok := store[constants.EnvKeyAccessTokenExpiryTime]; ok {
|
if val, ok := store[constants.EnvKeyAccessTokenExpiryTime]; ok {
|
||||||
res.AccessTokenExpiryTime = utils.NewStringRef(val.(string))
|
res.AccessTokenExpiryTime = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeyAdminSecret]; ok {
|
if val, ok := store[constants.EnvKeyAdminSecret]; ok {
|
||||||
res.AdminSecret = utils.NewStringRef(val.(string))
|
res.AdminSecret = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeyClientID]; ok {
|
if val, ok := store[constants.EnvKeyClientID]; ok {
|
||||||
res.ClientID = val.(string)
|
res.ClientID = val.(string)
|
||||||
|
@ -50,103 +51,103 @@ func EnvResolver(ctx context.Context) (*model.Env, error) {
|
||||||
res.ClientSecret = val.(string)
|
res.ClientSecret = val.(string)
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeyDatabaseURL]; ok {
|
if val, ok := store[constants.EnvKeyDatabaseURL]; ok {
|
||||||
res.DatabaseURL = utils.NewStringRef(val.(string))
|
res.DatabaseURL = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeyDatabaseName]; ok {
|
if val, ok := store[constants.EnvKeyDatabaseName]; ok {
|
||||||
res.DatabaseName = utils.NewStringRef(val.(string))
|
res.DatabaseName = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeyDatabaseType]; ok {
|
if val, ok := store[constants.EnvKeyDatabaseType]; ok {
|
||||||
res.DatabaseType = utils.NewStringRef(val.(string))
|
res.DatabaseType = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeyDatabaseUsername]; ok {
|
if val, ok := store[constants.EnvKeyDatabaseUsername]; ok {
|
||||||
res.DatabaseUsername = utils.NewStringRef(val.(string))
|
res.DatabaseUsername = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeyDatabasePassword]; ok {
|
if val, ok := store[constants.EnvKeyDatabasePassword]; ok {
|
||||||
res.DatabasePassword = utils.NewStringRef(val.(string))
|
res.DatabasePassword = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeyDatabaseHost]; ok {
|
if val, ok := store[constants.EnvKeyDatabaseHost]; ok {
|
||||||
res.DatabaseHost = utils.NewStringRef(val.(string))
|
res.DatabaseHost = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeyDatabasePort]; ok {
|
if val, ok := store[constants.EnvKeyDatabasePort]; ok {
|
||||||
res.DatabasePort = utils.NewStringRef(val.(string))
|
res.DatabasePort = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeyCustomAccessTokenScript]; ok {
|
if val, ok := store[constants.EnvKeyCustomAccessTokenScript]; ok {
|
||||||
res.CustomAccessTokenScript = utils.NewStringRef(val.(string))
|
res.CustomAccessTokenScript = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeySmtpHost]; ok {
|
if val, ok := store[constants.EnvKeySmtpHost]; ok {
|
||||||
res.SMTPHost = utils.NewStringRef(val.(string))
|
res.SMTPHost = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeySmtpPort]; ok {
|
if val, ok := store[constants.EnvKeySmtpPort]; ok {
|
||||||
res.SMTPPort = utils.NewStringRef(val.(string))
|
res.SMTPPort = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeySmtpUsername]; ok {
|
if val, ok := store[constants.EnvKeySmtpUsername]; ok {
|
||||||
res.SMTPUsername = utils.NewStringRef(val.(string))
|
res.SMTPUsername = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeySmtpPassword]; ok {
|
if val, ok := store[constants.EnvKeySmtpPassword]; ok {
|
||||||
res.SMTPPassword = utils.NewStringRef(val.(string))
|
res.SMTPPassword = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeySenderEmail]; ok {
|
if val, ok := store[constants.EnvKeySenderEmail]; ok {
|
||||||
res.SenderEmail = utils.NewStringRef(val.(string))
|
res.SenderEmail = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeyJwtType]; ok {
|
if val, ok := store[constants.EnvKeyJwtType]; ok {
|
||||||
res.JwtType = utils.NewStringRef(val.(string))
|
res.JwtType = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeyJwtSecret]; ok {
|
if val, ok := store[constants.EnvKeyJwtSecret]; ok {
|
||||||
res.JwtSecret = utils.NewStringRef(val.(string))
|
res.JwtSecret = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeyJwtRoleClaim]; ok {
|
if val, ok := store[constants.EnvKeyJwtRoleClaim]; ok {
|
||||||
res.JwtRoleClaim = utils.NewStringRef(val.(string))
|
res.JwtRoleClaim = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeyJwtPublicKey]; ok {
|
if val, ok := store[constants.EnvKeyJwtPublicKey]; ok {
|
||||||
res.JwtPublicKey = utils.NewStringRef(val.(string))
|
res.JwtPublicKey = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeyJwtPrivateKey]; ok {
|
if val, ok := store[constants.EnvKeyJwtPrivateKey]; ok {
|
||||||
res.JwtPrivateKey = utils.NewStringRef(val.(string))
|
res.JwtPrivateKey = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeyAppURL]; ok {
|
if val, ok := store[constants.EnvKeyAppURL]; ok {
|
||||||
res.AppURL = utils.NewStringRef(val.(string))
|
res.AppURL = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeyRedisURL]; ok {
|
if val, ok := store[constants.EnvKeyRedisURL]; ok {
|
||||||
res.RedisURL = utils.NewStringRef(val.(string))
|
res.RedisURL = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeyResetPasswordURL]; ok {
|
if val, ok := store[constants.EnvKeyResetPasswordURL]; ok {
|
||||||
res.ResetPasswordURL = utils.NewStringRef(val.(string))
|
res.ResetPasswordURL = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeyGoogleClientID]; ok {
|
if val, ok := store[constants.EnvKeyGoogleClientID]; ok {
|
||||||
res.GoogleClientID = utils.NewStringRef(val.(string))
|
res.GoogleClientID = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeyGoogleClientSecret]; ok {
|
if val, ok := store[constants.EnvKeyGoogleClientSecret]; ok {
|
||||||
res.GoogleClientSecret = utils.NewStringRef(val.(string))
|
res.GoogleClientSecret = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeyFacebookClientID]; ok {
|
if val, ok := store[constants.EnvKeyFacebookClientID]; ok {
|
||||||
res.FacebookClientID = utils.NewStringRef(val.(string))
|
res.FacebookClientID = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeyFacebookClientSecret]; ok {
|
if val, ok := store[constants.EnvKeyFacebookClientSecret]; ok {
|
||||||
res.FacebookClientSecret = utils.NewStringRef(val.(string))
|
res.FacebookClientSecret = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeyGithubClientID]; ok {
|
if val, ok := store[constants.EnvKeyGithubClientID]; ok {
|
||||||
res.GithubClientID = utils.NewStringRef(val.(string))
|
res.GithubClientID = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeyGithubClientSecret]; ok {
|
if val, ok := store[constants.EnvKeyGithubClientSecret]; ok {
|
||||||
res.GithubClientSecret = utils.NewStringRef(val.(string))
|
res.GithubClientSecret = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeyLinkedInClientID]; ok {
|
if val, ok := store[constants.EnvKeyLinkedInClientID]; ok {
|
||||||
res.LinkedinClientID = utils.NewStringRef(val.(string))
|
res.LinkedinClientID = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeyLinkedInClientSecret]; ok {
|
if val, ok := store[constants.EnvKeyLinkedInClientSecret]; ok {
|
||||||
res.LinkedinClientSecret = utils.NewStringRef(val.(string))
|
res.LinkedinClientSecret = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeyAppleClientID]; ok {
|
if val, ok := store[constants.EnvKeyAppleClientID]; ok {
|
||||||
res.AppleClientID = utils.NewStringRef(val.(string))
|
res.AppleClientID = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeyAppleClientSecret]; ok {
|
if val, ok := store[constants.EnvKeyAppleClientSecret]; ok {
|
||||||
res.AppleClientSecret = utils.NewStringRef(val.(string))
|
res.AppleClientSecret = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeyOrganizationName]; ok {
|
if val, ok := store[constants.EnvKeyOrganizationName]; ok {
|
||||||
res.OrganizationName = utils.NewStringRef(val.(string))
|
res.OrganizationName = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
if val, ok := store[constants.EnvKeyOrganizationLogo]; ok {
|
if val, ok := store[constants.EnvKeyOrganizationLogo]; ok {
|
||||||
res.OrganizationLogo = utils.NewStringRef(val.(string))
|
res.OrganizationLogo = refs.NewStringRef(val.(string))
|
||||||
}
|
}
|
||||||
|
|
||||||
// string slice vars
|
// string slice vars
|
||||||
|
|
|
@ -11,6 +11,7 @@ import (
|
||||||
|
|
||||||
"github.com/authorizerdev/authorizer/server/constants"
|
"github.com/authorizerdev/authorizer/server/constants"
|
||||||
"github.com/authorizerdev/authorizer/server/graph/model"
|
"github.com/authorizerdev/authorizer/server/graph/model"
|
||||||
|
"github.com/authorizerdev/authorizer/server/refs"
|
||||||
"github.com/authorizerdev/authorizer/server/token"
|
"github.com/authorizerdev/authorizer/server/token"
|
||||||
"github.com/authorizerdev/authorizer/server/utils"
|
"github.com/authorizerdev/authorizer/server/utils"
|
||||||
"github.com/authorizerdev/authorizer/server/validators"
|
"github.com/authorizerdev/authorizer/server/validators"
|
||||||
|
@ -41,8 +42,8 @@ func TestEndpointResolver(ctx context.Context, params model.TestEndpointRequest)
|
||||||
Email: "test_endpoint@foo.com",
|
Email: "test_endpoint@foo.com",
|
||||||
EmailVerified: true,
|
EmailVerified: true,
|
||||||
SignupMethods: constants.AuthRecipeMethodMagicLinkLogin,
|
SignupMethods: constants.AuthRecipeMethodMagicLinkLogin,
|
||||||
GivenName: utils.NewStringRef("Foo"),
|
GivenName: refs.NewStringRef("Foo"),
|
||||||
FamilyName: utils.NewStringRef("Bar"),
|
FamilyName: refs.NewStringRef("Bar"),
|
||||||
}
|
}
|
||||||
|
|
||||||
userBytes, err := json.Marshal(user)
|
userBytes, err := json.Marshal(user)
|
||||||
|
|
|
@ -17,6 +17,7 @@ import (
|
||||||
"github.com/authorizerdev/authorizer/server/graph/model"
|
"github.com/authorizerdev/authorizer/server/graph/model"
|
||||||
"github.com/authorizerdev/authorizer/server/memorystore"
|
"github.com/authorizerdev/authorizer/server/memorystore"
|
||||||
"github.com/authorizerdev/authorizer/server/parsers"
|
"github.com/authorizerdev/authorizer/server/parsers"
|
||||||
|
"github.com/authorizerdev/authorizer/server/refs"
|
||||||
"github.com/authorizerdev/authorizer/server/token"
|
"github.com/authorizerdev/authorizer/server/token"
|
||||||
"github.com/authorizerdev/authorizer/server/utils"
|
"github.com/authorizerdev/authorizer/server/utils"
|
||||||
"github.com/authorizerdev/authorizer/server/validators"
|
"github.com/authorizerdev/authorizer/server/validators"
|
||||||
|
@ -61,35 +62,35 @@ func UpdateProfileResolver(ctx context.Context, params model.UpdateProfileInput)
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if params.GivenName != nil && utils.StringValue(user.GivenName) != utils.StringValue(params.GivenName) {
|
if params.GivenName != nil && refs.StringValue(user.GivenName) != refs.StringValue(params.GivenName) {
|
||||||
user.GivenName = params.GivenName
|
user.GivenName = params.GivenName
|
||||||
}
|
}
|
||||||
|
|
||||||
if params.FamilyName != nil && utils.StringValue(user.FamilyName) != utils.StringValue(params.FamilyName) {
|
if params.FamilyName != nil && refs.StringValue(user.FamilyName) != refs.StringValue(params.FamilyName) {
|
||||||
user.FamilyName = params.FamilyName
|
user.FamilyName = params.FamilyName
|
||||||
}
|
}
|
||||||
|
|
||||||
if params.MiddleName != nil && utils.StringValue(user.MiddleName) != utils.StringValue(params.MiddleName) {
|
if params.MiddleName != nil && refs.StringValue(user.MiddleName) != refs.StringValue(params.MiddleName) {
|
||||||
user.MiddleName = params.MiddleName
|
user.MiddleName = params.MiddleName
|
||||||
}
|
}
|
||||||
|
|
||||||
if params.Nickname != nil && utils.StringValue(user.Nickname) != utils.StringValue(params.Nickname) {
|
if params.Nickname != nil && refs.StringValue(user.Nickname) != refs.StringValue(params.Nickname) {
|
||||||
user.Nickname = params.Nickname
|
user.Nickname = params.Nickname
|
||||||
}
|
}
|
||||||
|
|
||||||
if params.Birthdate != nil && utils.StringValue(user.Birthdate) != utils.StringValue(params.Birthdate) {
|
if params.Birthdate != nil && refs.StringValue(user.Birthdate) != refs.StringValue(params.Birthdate) {
|
||||||
user.Birthdate = params.Birthdate
|
user.Birthdate = params.Birthdate
|
||||||
}
|
}
|
||||||
|
|
||||||
if params.Gender != nil && utils.StringValue(user.Gender) != utils.StringValue(params.Gender) {
|
if params.Gender != nil && refs.StringValue(user.Gender) != refs.StringValue(params.Gender) {
|
||||||
user.Gender = params.Gender
|
user.Gender = params.Gender
|
||||||
}
|
}
|
||||||
|
|
||||||
if params.PhoneNumber != nil && utils.StringValue(user.PhoneNumber) != utils.StringValue(params.PhoneNumber) {
|
if params.PhoneNumber != nil && refs.StringValue(user.PhoneNumber) != refs.StringValue(params.PhoneNumber) {
|
||||||
user.PhoneNumber = params.PhoneNumber
|
user.PhoneNumber = params.PhoneNumber
|
||||||
}
|
}
|
||||||
|
|
||||||
if params.Picture != nil && utils.StringValue(user.Picture) != utils.StringValue(params.Picture) {
|
if params.Picture != nil && refs.StringValue(user.Picture) != refs.StringValue(params.Picture) {
|
||||||
user.Picture = params.Picture
|
user.Picture = params.Picture
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -116,7 +117,7 @@ func UpdateProfileResolver(ctx context.Context, params model.UpdateProfileInput)
|
||||||
}
|
}
|
||||||
|
|
||||||
if isPasswordChanging && user.Password != nil && params.OldPassword != nil {
|
if isPasswordChanging && user.Password != nil && params.OldPassword != nil {
|
||||||
if err = bcrypt.CompareHashAndPassword([]byte(utils.StringValue(user.Password)), []byte(utils.StringValue(params.OldPassword))); err != nil {
|
if err = bcrypt.CompareHashAndPassword([]byte(refs.StringValue(user.Password)), []byte(refs.StringValue(params.OldPassword))); err != nil {
|
||||||
log.Debug("Failed to compare hash and old password: ", err)
|
log.Debug("Failed to compare hash and old password: ", err)
|
||||||
return res, fmt.Errorf("incorrect old password")
|
return res, fmt.Errorf("incorrect old password")
|
||||||
}
|
}
|
||||||
|
@ -135,21 +136,21 @@ func UpdateProfileResolver(ctx context.Context, params model.UpdateProfileInput)
|
||||||
return res, fmt.Errorf(`basic authentication is disabled for this instance`)
|
return res, fmt.Errorf(`basic authentication is disabled for this instance`)
|
||||||
}
|
}
|
||||||
|
|
||||||
if utils.StringValue(params.ConfirmNewPassword) != utils.StringValue(params.NewPassword) {
|
if refs.StringValue(params.ConfirmNewPassword) != refs.StringValue(params.NewPassword) {
|
||||||
log.Debug("Failed to compare new password and confirm new password")
|
log.Debug("Failed to compare new password and confirm new password")
|
||||||
return res, fmt.Errorf(`password and confirm password does not match`)
|
return res, fmt.Errorf(`password and confirm password does not match`)
|
||||||
}
|
}
|
||||||
|
|
||||||
if user.Password == nil || utils.StringValue(user.Password) == "" {
|
if user.Password == nil || refs.StringValue(user.Password) == "" {
|
||||||
shouldAddBasicSignUpMethod = true
|
shouldAddBasicSignUpMethod = true
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := validators.IsValidPassword(utils.StringValue(params.NewPassword)); err != nil {
|
if err := validators.IsValidPassword(refs.StringValue(params.NewPassword)); err != nil {
|
||||||
log.Debug("Invalid password")
|
log.Debug("Invalid password")
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
|
||||||
password, _ := crypto.EncryptPassword(utils.StringValue(params.NewPassword))
|
password, _ := crypto.EncryptPassword(refs.StringValue(params.NewPassword))
|
||||||
user.Password = &password
|
user.Password = &password
|
||||||
|
|
||||||
if shouldAddBasicSignUpMethod {
|
if shouldAddBasicSignUpMethod {
|
||||||
|
@ -159,10 +160,10 @@ func UpdateProfileResolver(ctx context.Context, params model.UpdateProfileInput)
|
||||||
|
|
||||||
hasEmailChanged := false
|
hasEmailChanged := false
|
||||||
|
|
||||||
if params.Email != nil && user.Email != utils.StringValue(params.Email) {
|
if params.Email != nil && user.Email != refs.StringValue(params.Email) {
|
||||||
// check if valid email
|
// check if valid email
|
||||||
if !validators.IsValidEmail(*params.Email) {
|
if !validators.IsValidEmail(*params.Email) {
|
||||||
log.Debug("Failed to validate email: ", utils.StringValue(params.Email))
|
log.Debug("Failed to validate email: ", refs.StringValue(params.Email))
|
||||||
return res, fmt.Errorf("invalid email address")
|
return res, fmt.Errorf("invalid email address")
|
||||||
}
|
}
|
||||||
newEmail := strings.ToLower(*params.Email)
|
newEmail := strings.ToLower(*params.Email)
|
||||||
|
|
|
@ -8,6 +8,7 @@ import (
|
||||||
"github.com/authorizerdev/authorizer/server/db"
|
"github.com/authorizerdev/authorizer/server/db"
|
||||||
"github.com/authorizerdev/authorizer/server/db/models"
|
"github.com/authorizerdev/authorizer/server/db/models"
|
||||||
"github.com/authorizerdev/authorizer/server/graph/model"
|
"github.com/authorizerdev/authorizer/server/graph/model"
|
||||||
|
"github.com/authorizerdev/authorizer/server/refs"
|
||||||
"github.com/authorizerdev/authorizer/server/token"
|
"github.com/authorizerdev/authorizer/server/token"
|
||||||
"github.com/authorizerdev/authorizer/server/utils"
|
"github.com/authorizerdev/authorizer/server/utils"
|
||||||
"github.com/authorizerdev/authorizer/server/validators"
|
"github.com/authorizerdev/authorizer/server/validators"
|
||||||
|
@ -45,27 +46,27 @@ func UpdateWebhookResolver(ctx context.Context, params model.UpdateWebhookReques
|
||||||
webhookDetails := models.Webhook{
|
webhookDetails := models.Webhook{
|
||||||
ID: webhook.ID,
|
ID: webhook.ID,
|
||||||
Key: webhook.ID,
|
Key: webhook.ID,
|
||||||
EventName: utils.StringValue(webhook.EventName),
|
EventName: refs.StringValue(webhook.EventName),
|
||||||
EndPoint: utils.StringValue(webhook.Endpoint),
|
EndPoint: refs.StringValue(webhook.Endpoint),
|
||||||
Enabled: utils.BoolValue(webhook.Enabled),
|
Enabled: refs.BoolValue(webhook.Enabled),
|
||||||
Headers: headersString,
|
Headers: headersString,
|
||||||
CreatedAt: *webhook.CreatedAt,
|
CreatedAt: *webhook.CreatedAt,
|
||||||
}
|
}
|
||||||
|
|
||||||
if params.EventName != nil && webhookDetails.EventName != utils.StringValue(params.EventName) {
|
if params.EventName != nil && webhookDetails.EventName != refs.StringValue(params.EventName) {
|
||||||
if isValid := validators.IsValidWebhookEventName(utils.StringValue(params.EventName)); !isValid {
|
if isValid := validators.IsValidWebhookEventName(refs.StringValue(params.EventName)); !isValid {
|
||||||
log.Debug("invalid event name: ", utils.StringValue(params.EventName))
|
log.Debug("invalid event name: ", refs.StringValue(params.EventName))
|
||||||
return nil, fmt.Errorf("invalid event name %s", utils.StringValue(params.EventName))
|
return nil, fmt.Errorf("invalid event name %s", refs.StringValue(params.EventName))
|
||||||
}
|
}
|
||||||
webhookDetails.EventName = utils.StringValue(params.EventName)
|
webhookDetails.EventName = refs.StringValue(params.EventName)
|
||||||
}
|
}
|
||||||
|
|
||||||
if params.Endpoint != nil && webhookDetails.EndPoint != utils.StringValue(params.Endpoint) {
|
if params.Endpoint != nil && webhookDetails.EndPoint != refs.StringValue(params.Endpoint) {
|
||||||
webhookDetails.EventName = utils.StringValue(params.EventName)
|
webhookDetails.EventName = refs.StringValue(params.EventName)
|
||||||
}
|
}
|
||||||
|
|
||||||
if params.Enabled != nil && webhookDetails.Enabled != utils.BoolValue(params.Enabled) {
|
if params.Enabled != nil && webhookDetails.Enabled != refs.BoolValue(params.Enabled) {
|
||||||
webhookDetails.Enabled = utils.BoolValue(params.Enabled)
|
webhookDetails.Enabled = refs.BoolValue(params.Enabled)
|
||||||
}
|
}
|
||||||
|
|
||||||
if params.Headers != nil {
|
if params.Headers != nil {
|
||||||
|
|
|
@ -6,6 +6,7 @@ import (
|
||||||
|
|
||||||
"github.com/authorizerdev/authorizer/server/db"
|
"github.com/authorizerdev/authorizer/server/db"
|
||||||
"github.com/authorizerdev/authorizer/server/graph/model"
|
"github.com/authorizerdev/authorizer/server/graph/model"
|
||||||
|
"github.com/authorizerdev/authorizer/server/refs"
|
||||||
"github.com/authorizerdev/authorizer/server/token"
|
"github.com/authorizerdev/authorizer/server/token"
|
||||||
"github.com/authorizerdev/authorizer/server/utils"
|
"github.com/authorizerdev/authorizer/server/utils"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
|
@ -31,7 +32,7 @@ func WebhookLogsResolver(ctx context.Context, params *model.ListWebhookLogReques
|
||||||
pagination = utils.GetPagination(&model.PaginatedInput{
|
pagination = utils.GetPagination(&model.PaginatedInput{
|
||||||
Pagination: params.Pagination,
|
Pagination: params.Pagination,
|
||||||
})
|
})
|
||||||
webhookID = utils.StringValue(params.WebhookID)
|
webhookID = refs.StringValue(params.WebhookID)
|
||||||
} else {
|
} else {
|
||||||
pagination = utils.GetPagination(nil)
|
pagination = utils.GetPagination(nil)
|
||||||
webhookID = ""
|
webhookID = ""
|
||||||
|
|
|
@ -9,8 +9,8 @@ import (
|
||||||
"github.com/authorizerdev/authorizer/server/db"
|
"github.com/authorizerdev/authorizer/server/db"
|
||||||
"github.com/authorizerdev/authorizer/server/graph/model"
|
"github.com/authorizerdev/authorizer/server/graph/model"
|
||||||
"github.com/authorizerdev/authorizer/server/memorystore"
|
"github.com/authorizerdev/authorizer/server/memorystore"
|
||||||
|
"github.com/authorizerdev/authorizer/server/refs"
|
||||||
"github.com/authorizerdev/authorizer/server/resolvers"
|
"github.com/authorizerdev/authorizer/server/resolvers"
|
||||||
"github.com/authorizerdev/authorizer/server/utils"
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ func updateWebhookTest(t *testing.T, s TestSetup) {
|
||||||
res, err := resolvers.UpdateWebhookResolver(ctx, model.UpdateWebhookRequest{
|
res, err := resolvers.UpdateWebhookResolver(ctx, model.UpdateWebhookRequest{
|
||||||
ID: webhook.ID,
|
ID: webhook.ID,
|
||||||
Headers: webhook.Headers,
|
Headers: webhook.Headers,
|
||||||
Enabled: utils.NewBoolRef(false),
|
Enabled: refs.NewBoolRef(false),
|
||||||
})
|
})
|
||||||
|
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
@ -43,15 +43,15 @@ func updateWebhookTest(t *testing.T, s TestSetup) {
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.NotNil(t, updatedWebhook)
|
assert.NotNil(t, updatedWebhook)
|
||||||
assert.Equal(t, webhook.ID, updatedWebhook.ID)
|
assert.Equal(t, webhook.ID, updatedWebhook.ID)
|
||||||
assert.Equal(t, utils.StringValue(webhook.EventName), utils.StringValue(updatedWebhook.EventName))
|
assert.Equal(t, refs.StringValue(webhook.EventName), refs.StringValue(updatedWebhook.EventName))
|
||||||
assert.Equal(t, utils.StringValue(webhook.Endpoint), utils.StringValue(updatedWebhook.Endpoint))
|
assert.Equal(t, refs.StringValue(webhook.Endpoint), refs.StringValue(updatedWebhook.Endpoint))
|
||||||
assert.Len(t, updatedWebhook.Headers, 2)
|
assert.Len(t, updatedWebhook.Headers, 2)
|
||||||
assert.False(t, utils.BoolValue(updatedWebhook.Enabled))
|
assert.False(t, refs.BoolValue(updatedWebhook.Enabled))
|
||||||
|
|
||||||
res, err = resolvers.UpdateWebhookResolver(ctx, model.UpdateWebhookRequest{
|
res, err = resolvers.UpdateWebhookResolver(ctx, model.UpdateWebhookRequest{
|
||||||
ID: webhook.ID,
|
ID: webhook.ID,
|
||||||
Headers: webhook.Headers,
|
Headers: webhook.Headers,
|
||||||
Enabled: utils.NewBoolRef(true),
|
Enabled: refs.NewBoolRef(true),
|
||||||
})
|
})
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.NotEmpty(t, res)
|
assert.NotEmpty(t, res)
|
||||||
|
|
|
@ -9,8 +9,8 @@ import (
|
||||||
"github.com/authorizerdev/authorizer/server/crypto"
|
"github.com/authorizerdev/authorizer/server/crypto"
|
||||||
"github.com/authorizerdev/authorizer/server/graph/model"
|
"github.com/authorizerdev/authorizer/server/graph/model"
|
||||||
"github.com/authorizerdev/authorizer/server/memorystore"
|
"github.com/authorizerdev/authorizer/server/memorystore"
|
||||||
|
"github.com/authorizerdev/authorizer/server/refs"
|
||||||
"github.com/authorizerdev/authorizer/server/resolvers"
|
"github.com/authorizerdev/authorizer/server/resolvers"
|
||||||
"github.com/authorizerdev/authorizer/server/utils"
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ func webhookLogsTest(t *testing.T, s TestSetup) {
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.GreaterOrEqual(t, len(webhookLogs.WebhookLogs), 1)
|
assert.GreaterOrEqual(t, len(webhookLogs.WebhookLogs), 1)
|
||||||
for _, wl := range webhookLogs.WebhookLogs {
|
for _, wl := range webhookLogs.WebhookLogs {
|
||||||
assert.Equal(t, utils.StringValue(wl.WebhookID), w.ID)
|
assert.Equal(t, refs.StringValue(wl.WebhookID), w.ID)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,8 +9,8 @@ import (
|
||||||
"github.com/authorizerdev/authorizer/server/db"
|
"github.com/authorizerdev/authorizer/server/db"
|
||||||
"github.com/authorizerdev/authorizer/server/graph/model"
|
"github.com/authorizerdev/authorizer/server/graph/model"
|
||||||
"github.com/authorizerdev/authorizer/server/memorystore"
|
"github.com/authorizerdev/authorizer/server/memorystore"
|
||||||
|
"github.com/authorizerdev/authorizer/server/refs"
|
||||||
"github.com/authorizerdev/authorizer/server/resolvers"
|
"github.com/authorizerdev/authorizer/server/resolvers"
|
||||||
"github.com/authorizerdev/authorizer/server/utils"
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -34,9 +34,9 @@ func webhookTest(t *testing.T, s TestSetup) {
|
||||||
})
|
})
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, res.ID, webhook.ID)
|
assert.Equal(t, res.ID, webhook.ID)
|
||||||
assert.Equal(t, utils.StringValue(res.Endpoint), utils.StringValue(webhook.Endpoint))
|
assert.Equal(t, refs.StringValue(res.Endpoint), refs.StringValue(webhook.Endpoint))
|
||||||
assert.Equal(t, utils.StringValue(res.EventName), utils.StringValue(webhook.EventName))
|
assert.Equal(t, refs.StringValue(res.EventName), refs.StringValue(webhook.EventName))
|
||||||
assert.Equal(t, utils.BoolValue(res.Enabled), utils.BoolValue(webhook.Enabled))
|
assert.Equal(t, refs.BoolValue(res.Enabled), refs.BoolValue(webhook.Enabled))
|
||||||
assert.Len(t, res.Headers, len(webhook.Headers))
|
assert.Len(t, res.Headers, len(webhook.Headers))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@ import (
|
||||||
"github.com/authorizerdev/authorizer/server/constants"
|
"github.com/authorizerdev/authorizer/server/constants"
|
||||||
"github.com/authorizerdev/authorizer/server/db"
|
"github.com/authorizerdev/authorizer/server/db"
|
||||||
"github.com/authorizerdev/authorizer/server/db/models"
|
"github.com/authorizerdev/authorizer/server/db/models"
|
||||||
|
"github.com/authorizerdev/authorizer/server/refs"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -20,7 +21,7 @@ func RegisterEvent(ctx context.Context, eventName string, authRecipe string, use
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if !BoolValue(webhook.Enabled) {
|
if !refs.BoolValue(webhook.Enabled) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,7 +53,7 @@ func RegisterEvent(ctx context.Context, eventName string, authRecipe string, use
|
||||||
}
|
}
|
||||||
|
|
||||||
requestBytesBuffer := bytes.NewBuffer(requestBody)
|
requestBytesBuffer := bytes.NewBuffer(requestBody)
|
||||||
req, err := http.NewRequest("POST", StringValue(webhook.Endpoint), requestBytesBuffer)
|
req, err := http.NewRequest("POST", refs.StringValue(webhook.Endpoint), requestBytesBuffer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Debug("error creating webhook post request: ", err)
|
log.Debug("error creating webhook post request: ", err)
|
||||||
return err
|
return err
|
||||||
|
|
Loading…
Reference in New Issue
Block a user