From b7828ff7586d604d4ead97243ae9d46a4ae7a395 Mon Sep 17 00:00:00 2001 From: manoj Date: Sat, 5 Nov 2022 16:45:43 +0530 Subject: [PATCH] update webhook chnages added via n1query --- server/db/providers/couchbase/webhook.go | 50 ++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/server/db/providers/couchbase/webhook.go b/server/db/providers/couchbase/webhook.go index 24e6abb..f13d6e8 100644 --- a/server/db/providers/couchbase/webhook.go +++ b/server/db/providers/couchbase/webhook.go @@ -2,8 +2,11 @@ package couchbase import ( "context" + "encoding/json" "fmt" "log" + "reflect" + "strings" "time" "github.com/authorizerdev/authorizer/server/db/models" @@ -35,6 +38,53 @@ func (p *provider) AddWebhook(ctx context.Context, webhook models.Webhook) (*mod // UpdateWebhook to update webhook func (p *provider) UpdateWebhook(ctx context.Context, webhook models.Webhook) (*model.Webhook, error) { webhook.UpdatedAt = time.Now().Unix() + scope := p.db.Scope("_default") + + bytes, err := json.Marshal(webhook) + if err != nil { + return nil, err + } + // use decoder instead of json.Unmarshall, because it converts int64 -> float64 after unmarshalling + decoder := json.NewDecoder(strings.NewReader(string(bytes))) + decoder.UseNumber() + webhookMap := map[string]interface{}{} + err = decoder.Decode(&webhookMap) + if err != nil { + return nil, err + } + + updateFields := "" + for key, value := range webhookMap { + if key == "_id" { + continue + } + + if key == "_key" { + continue + } + + if value == nil { + updateFields += fmt.Sprintf("%s = null,", key) + continue + } + + valueType := reflect.TypeOf(value) + if valueType.Name() == "string" { + updateFields += fmt.Sprintf("%s = '%s', ", key, value.(string)) + } else { + updateFields += fmt.Sprintf("%s = %v, ", key, value) + } + } + updateFields = strings.Trim(updateFields, " ") + updateFields = strings.TrimSuffix(updateFields, ",") + + query := fmt.Sprintf("UPDATE auth._default.%s SET %s WHERE _id = '%s'", models.Collections.Webhook, updateFields, webhook.ID) + _, err = scope.Query(query, &gocb.QueryOptions{}) + + if err != nil { + return nil, err + } + return webhook.AsAPIWebhook(), nil }