From 8c0e19a7bd9e947e8ec61f0c2741beb50ac60b30 Mon Sep 17 00:00:00 2001 From: shohamroditimemphis Date: Tue, 29 Aug 2023 11:52:37 +0300 Subject: [PATCH 1/2] fix code example rest gw + remove tenant resources --- db/db.go | 57 +++++++++++++--- server/memphis_cloud.go | 76 ++++++++++++++++++++++ server/memphis_handlers.go | 4 +- server/memphis_handlers_schemas.go | 2 +- server/memphis_handlers_stations.go | 2 +- server/memphis_handlers_tags.go | 9 ++- server/memphis_handlers_user_mgmt.go | 76 ---------------------- ui_src/src/components/sdkExsample/index.js | 2 + ui_src/src/const/codeExample.js | 23 ++++--- 9 files changed, 146 insertions(+), 105 deletions(-) diff --git a/db/db.go b/db/db.go index eecd9d1b9..b6e4af8e4 100644 --- a/db/db.go +++ b/db/db.go @@ -4127,7 +4127,7 @@ func UpdateIntegration(tenantName string, name string, keys map[string]interface } // User Functions -func UpdtaePendingUser(tenantName, username string, pending bool) error { +func UpdatePendingUser(tenantName, username string, pending bool) error { ctx, cancelfunc := context.WithTimeout(context.Background(), DbOperationTimeout*time.Second) defer cancelfunc() conn, err := MetadataDbClient.Client.Acquire(ctx) @@ -4929,7 +4929,7 @@ func InsertNewTag(name string, color string, stationArr []int, schemaArr []int, return newTag, nil } -func InsertEntityToTag(tagName string, entity string, entity_id int, tenantName string) error { +func InsertEntityToTag(tagName string, entity string, entity_id int, tenantName, color string) error { var entityDBList string switch entity { case "station": @@ -4946,14 +4946,26 @@ func InsertEntityToTag(tagName string, entity string, entity_id int, tenantName return err } defer conn.Release() - query := `UPDATE tags SET ` + entityDBList + ` = ARRAY_APPEND(` + entityDBList + `, $1) WHERE name = $2 AND tenant_name = $3` - stmt, err := conn.Conn().Prepare(ctx, "insert_entity_to_tag", query) - if err != nil { - return err - } - _, err = conn.Conn().Query(ctx, stmt.Name, entity_id, tagName, tenantName) - if err != nil { - return err + if color == "" { + query := `UPDATE tags SET ` + entityDBList + ` = ARRAY_APPEND(` + entityDBList + `, $1) WHERE name = $2 AND tenant_name = $3` + stmt, err := conn.Conn().Prepare(ctx, "insert_entity_to_tag", query) + if err != nil { + return err + } + _, err = conn.Conn().Query(ctx, stmt.Name, entity_id, tagName, tenantName) + if err != nil { + return err + } + } else { + query := `UPDATE tags SET ` + entityDBList + ` = ARRAY_APPEND(` + entityDBList + `, $1) , color = $4 WHERE name = $2 AND tenant_name = $3` + stmt, err := conn.Conn().Prepare(ctx, "insert_entity_to_tag", query) + if err != nil { + return err + } + _, err = conn.Conn().Query(ctx, stmt.Name, entity_id, tagName, tenantName, color) + if err != nil { + return err + } } return nil } @@ -6557,6 +6569,31 @@ func DeleteConfByTenantName(tenantName string) error { return nil } +func DeleteIntegrationsByTenantName(tenantName string) error { + ctx, cancelfunc := context.WithTimeout(context.Background(), DbOperationTimeout*time.Second) + defer cancelfunc() + + conn, err := MetadataDbClient.Client.Acquire(ctx) + if err != nil { + return err + } + defer conn.Release() + + query := `DELETE FROM integrations + WHERE tenant_name=$1` + + stmt, err := conn.Conn().Prepare(ctx, "remove_integrations_by_tenant_name", query) + if err != nil { + return err + } + tenantName = strings.ToLower(tenantName) + _, err = conn.Conn().Exec(ctx, stmt.Name, tenantName) + if err != nil { + return err + } + return nil +} + // Async tasks functions func UpsertAsyncTask(task, brokerInCharge string, createdAt time.Time, tenantName string, stationId int, username string) (models.AsyncTask, error) { ctx, cancelfunc := context.WithTimeout(context.Background(), DbOperationTimeout*time.Second) diff --git a/server/memphis_cloud.go b/server/memphis_cloud.go index 2435c5115..9aea59a27 100644 --- a/server/memphis_cloud.go +++ b/server/memphis_cloud.go @@ -88,6 +88,82 @@ type ProduceSchema struct { DataFormat string `json:"data_format"` } +func removeTenantResources(tenantName string, user models.User) error { + err := db.RemoveProducersByTenant(tenantName) + if err != nil { + return err + } + + err = db.RemoveConsumersByTenant(tenantName) + if err != nil { + return err + } + + err = db.RemoveSchemaVersionsByTenant(tenantName) + if err != nil { + return err + } + + err = db.RemoveSchemasByTenant(tenantName) + if err != nil { + return err + } + + err = db.RemoveTagsResourcesByTenant(tenantName) + if err != nil { + return err + } + + err = db.RemoveAuditLogsByTenant(tenantName) + if err != nil { + return err + } + + err = db.DeleteDlsMsgsByTenant(tenantName) + if err != nil { + return err + } + + err = db.RemoveStationsByTenant(tenantName) + if err != nil { + return err + } + + users_list, err := db.DeleteUsersByTenant(tenantName) + if err != nil { + return err + } + + SendUserDeleteCacheUpdate(users_list, tenantName) + + err = db.DeleteConfByTenantName(tenantName) + if err != nil { + return err + } + + err = db.DeleteIntegrationsByTenantName(tenantName) + if err != nil { + return err + } + + err = serv.memphisPurgeResourcesAccount(tenantName) + if err != nil { + if err != nil && !IsNatsErr(err, JSStreamNotFoundErr) { + return err + } + } + + if configuration.USER_PASS_BASED_AUTH { + // send signal to reload config + err = serv.sendInternalAccountMsgWithReply(serv.MemphisGlobalAccount(), CONFIGURATIONS_RELOAD_SIGNAL_SUBJ, _EMPTY_, nil, _EMPTY_, true) + if err != nil { + return err + } + } + + return nil +} + func InitializeBillingRoutes(router *gin.RouterGroup, h *Handlers) { } diff --git a/server/memphis_handlers.go b/server/memphis_handlers.go index b0dbfa4b8..00e9384d6 100644 --- a/server/memphis_handlers.go +++ b/server/memphis_handlers.go @@ -158,8 +158,8 @@ func CreateDefaultSchema(username, tenantName string, userId int) (string, error func CreateDefaultTags(tagType string, id int, tenantName string) error { defaultTags := models.CreateTag{Name: "default"} - - err := AddTagsToEntity([]models.CreateTag{defaultTags}, tagType, id, tenantName) + color := "0, 165, 255" + err := AddTagsToEntity([]models.CreateTag{defaultTags}, tagType, id, tenantName, color) if err != nil { return err } diff --git a/server/memphis_handlers_schemas.go b/server/memphis_handlers_schemas.go index 15011d724..bdee5b550 100644 --- a/server/memphis_handlers_schemas.go +++ b/server/memphis_handlers_schemas.go @@ -481,7 +481,7 @@ func (sh SchemasHandler) CreateNewSchema(c *gin.Context) { } if len(body.Tags) > 0 { - err = AddTagsToEntity(body.Tags, "schema", newSchema.ID, tenantName) + err = AddTagsToEntity(body.Tags, "schema", newSchema.ID, tenantName, "") if err != nil { serv.Errorf("[tenant: %v][user: %v]CreateNewSchema at AddTagsToEntity: Failed creating tag at schema %v: %v", user.TenantName, user.Username, schemaName, err.Error()) c.AbortWithStatusJSON(500, gin.H{"message": "Server error"}) diff --git a/server/memphis_handlers_stations.go b/server/memphis_handlers_stations.go index 368823b6f..24c7d5026 100644 --- a/server/memphis_handlers_stations.go +++ b/server/memphis_handlers_stations.go @@ -998,7 +998,7 @@ func (sh StationsHandler) CreateStation(c *gin.Context) { } if len(body.Tags) > 0 { - err = AddTagsToEntity(body.Tags, "station", newStation.ID, newStation.TenantName) + err = AddTagsToEntity(body.Tags, "station", newStation.ID, newStation.TenantName, "") if err != nil { serv.Errorf("[tenant: %v][user: %v]CreateStation: : Station %v Failed adding tags: %v", user.TenantName, user.Username, body.Name, err.Error()) c.AbortWithStatusJSON(500, gin.H{"message": "Server error"}) diff --git a/server/memphis_handlers_tags.go b/server/memphis_handlers_tags.go index 8fc2ea6ff..ff3235163 100644 --- a/server/memphis_handlers_tags.go +++ b/server/memphis_handlers_tags.go @@ -58,7 +58,7 @@ func CreateTag(name string, entity_type string, entity_id int, color string, ten return nil } -func AddTagsToEntity(tags []models.CreateTag, entity_type string, entity_id int, tenantName string) error { +func AddTagsToEntity(tags []models.CreateTag, entity_type string, entity_id int, tenantName, color string) error { if len(tags) == 0 { return nil } @@ -78,12 +78,11 @@ func AddTagsToEntity(tags []models.CreateTag, entity_type string, entity_id int, return err } } else { - err = db.InsertEntityToTag(tagToCreate.Name, entity_type, entity_id, tenantName) + err = db.InsertEntityToTag(tagToCreate.Name, entity_type, entity_id, tenantName, color) if err != nil { return err } } - } return nil @@ -371,7 +370,7 @@ func (th TagsHandler) UpdateTagsForEntity(c *gin.Context) { return } } else { - err = db.InsertEntityToTag(tag.Name, entity, entity_id, tenantName) + err = db.InsertEntityToTag(tag.Name, entity, entity_id, tenantName, "") if err != nil { serv.Errorf("[tenant: %v][user: %v]UpdateTagsForEntity at db.InsertEntityToTag: %v %v: %v", user.TenantName, user.Username, body.EntityType, body.EntityName, err.Error()) c.AbortWithStatusJSON(500, gin.H{"message": "Server error"}) @@ -443,7 +442,7 @@ func (th TagsHandler) UpdateTagsForEntity(c *gin.Context) { return } if exist { - err = db.InsertEntityToTag(tag.Name, entity, entity_id, tenantName) + err = db.InsertEntityToTag(tag.Name, entity, entity_id, tenantName, "") if err != nil { serv.Errorf("[tenant: %v][user: %v]UpdateTagsForEntity at InsertEntityToTag: %v %v: %v", user.TenantName, user.Username, body.EntityType, body.EntityName, err.Error()) c.AbortWithStatusJSON(500, gin.H{"message": "Server error"}) diff --git a/server/memphis_handlers_user_mgmt.go b/server/memphis_handlers_user_mgmt.go index be5d9efae..5d35329c5 100644 --- a/server/memphis_handlers_user_mgmt.go +++ b/server/memphis_handlers_user_mgmt.go @@ -115,82 +115,6 @@ func updateDeletedUserResources(user models.User) error { return nil } -func removeTenantResources(tenantName string, user models.User) error { - err := db.RemoveProducersByTenant(tenantName) - if err != nil { - return err - } - - err = db.RemoveConsumersByTenant(tenantName) - if err != nil { - return err - } - - err = db.RemoveSchemaVersionsByTenant(tenantName) - if err != nil { - return err - } - - err = db.RemoveSchemasByTenant(tenantName) - if err != nil { - return err - } - - err = db.RemoveTagsResourcesByTenant(tenantName) - if err != nil { - return err - } - - err = db.RemoveAuditLogsByTenant(tenantName) - if err != nil { - return err - } - - err = db.DeleteDlsMsgsByTenant(tenantName) - if err != nil { - return err - } - - err = db.RemoveStationsByTenant(tenantName) - if err != nil { - return err - } - - users_list, err := db.DeleteUsersByTenant(tenantName) - if err != nil { - return err - } - - SendUserDeleteCacheUpdate(users_list, tenantName) - - err = db.DeleteConfByTenantName(tenantName) - if err != nil { - return err - } - - err = db.RemoveTenant(tenantName) - if err != nil { - return err - } - - err = serv.memphisPurgeResourcesAccount(tenantName) - if err != nil { - if err != nil && !IsNatsErr(err, JSStreamNotFoundErr) { - return err - } - } - - if configuration.USER_PASS_BASED_AUTH { - // send signal to reload config - err = serv.sendInternalAccountMsgWithReply(serv.MemphisGlobalAccount(), CONFIGURATIONS_RELOAD_SIGNAL_SUBJ, _EMPTY_, nil, _EMPTY_, true) - if err != nil { - return err - } - } - - return nil -} - func validateEmail(email string) error { re := regexp.MustCompile("^[a-z0-9._%+-]+@[a-z0-9_.-]+.[a-z]{2,4}$") validateEmail := re.MatchString(email) diff --git a/ui_src/src/components/sdkExsample/index.js b/ui_src/src/components/sdkExsample/index.js index 7619f6ce4..1cebb5cff 100644 --- a/ui_src/src/components/sdkExsample/index.js +++ b/ui_src/src/components/sdkExsample/index.js @@ -135,6 +135,8 @@ const SdkExample = ({ consumer, showTabs = true, stationName, username, connecti codeEx.tokenGenerate = codeEx.tokenGenerate?.replaceAll('connection_token', 'password'); codeEx.tokenGenerate = codeEx.tokenGenerate?.replaceAll('', ''); codeEx.tokenGenerate = codeEx.tokenGenerate?.replaceAll('memphis.ConnectionToken', 'memphis.Password'); + codeEx.tokenGenerate = codeEx.tokenGenerate?.replaceAll("strings.NewReader('{", "strings.NewReader(`{"); + codeEx.tokenGenerate = codeEx.tokenGenerate?.replaceAll("}')", " }`)"); } setCodeExample(codeEx); }; diff --git a/ui_src/src/const/codeExample.js b/ui_src/src/const/codeExample.js index 6b1cd3a40..d1b4d4fcd 100644 --- a/ui_src/src/const/codeExample.js +++ b/ui_src/src/const/codeExample.js @@ -444,7 +444,7 @@ export const PROTOCOL_CODE_EXAMPLE = { --data-raw '{ "username": "", "connection_token": "", - "accountId": "", + "account_id": "", "token_expiry_in_minutes": 123, "refresh_token_expiry_in_minutes": 10000092\n}'` }, @@ -503,13 +503,13 @@ export const PROTOCOL_CODE_EXAMPLE = { url := "localhost/auth/authenticate" method := "POST" - payload := strings.NewReader({ + payload := strings.NewReader('{ "username": "", "connection_token": "", - "accountId": "", + "account_id": "", "token_expiry_in_minutes": 123, "refresh_token_expiry_in_minutes": 10000092 - }) + }') client := &http.Client { } @@ -565,7 +565,7 @@ axios(config) var data = JSON.stringify({ "username": "", "connection_token": "", - "accountId": "", + "account_id": "", "token_expiry_in_minutes": 123, "refresh_token_expiry_in_minutes": 10000092 }); @@ -615,7 +615,7 @@ url = "localhost/auth/authenticate" payload = json.dumps({ "username": "", "connection_token": "", - "accountId": "", + "account_id": "", "token_expiry_in_minutes": 123, "refresh_token_expiry_in_minutes": 10000092 }) @@ -644,7 +644,7 @@ Response response = client.newCall(request).execute();`, tokenGenerate: `OkHttpClient client = new OkHttpClient().newBuilder() .build(); MediaType mediaType = MediaType.parse("application/json"); -RequestBody body = RequestBody.create(mediaType, "{\n \"username\": \"\",\n\t\"connection_token\": \"\",\n \"token_expiry_in_minutes\": 123,\n \"refresh_token_expiry_in_minutes\": 10000092\n}"); +RequestBody body = RequestBody.create(mediaType, "{\n \"username\": \"\",\n\t\"connection_token\": \"\",\n \"token_expiry_in_minutes\": 123,\n \"refresh_token_expiry_in_minutes\": 10000092\n \"account_id\": \"\"\n}"); Request request = new Request.Builder() .url("localhost/auth/authenticate") .method("POST", body) @@ -654,7 +654,8 @@ Response response = client.newCall(request).execute();` }, 'JavaScript - Fetch': { langCode: 'javascript', - producer: `var myHeaders = new Headers(); + producer: `const fetch = require('node-fetch'); +const myHeaders = new fetch.Headers(); myHeaders.append("Authorization", "Bearer "); myHeaders.append("Content-Type", "application/json"); @@ -673,13 +674,14 @@ fetch("localhost/stations//produce/single", requestOptions) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.log('error', error));`, - tokenGenerate: `var myHeaders = new Headers(); + tokenGenerate: `const fetch = require('node-fetch'); +const myHeaders = new fetch.Headers(); myHeaders.append("Content-Type", "application/json"); var raw = JSON.stringify({ "username": "", "connection_token": "", - "accountId": "", + "account_id": "", "token_expiry_in_minutes": 123, "refresh_token_expiry_in_minutes": 10000092 }); @@ -724,6 +726,7 @@ console.log(response); "data": JSON.stringify({ "username": "", "connection_token": "", + "account_id": "", "token_expiry_in_minutes": 123, "refresh_token_expiry_in_minutes": 10000092 }), From e13b08525945de1d9fb567967c8a69c957607dd2 Mon Sep 17 00:00:00 2001 From: shohamroditimemphis Date: Tue, 29 Aug 2023 15:46:57 +0300 Subject: [PATCH 2/2] fix --- server/memphis_cloud.go | 76 ------------------------- server/memphis_handlers_user_mgmt.go | 83 ++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 76 deletions(-) diff --git a/server/memphis_cloud.go b/server/memphis_cloud.go index 9aea59a27..2435c5115 100644 --- a/server/memphis_cloud.go +++ b/server/memphis_cloud.go @@ -88,82 +88,6 @@ type ProduceSchema struct { DataFormat string `json:"data_format"` } -func removeTenantResources(tenantName string, user models.User) error { - err := db.RemoveProducersByTenant(tenantName) - if err != nil { - return err - } - - err = db.RemoveConsumersByTenant(tenantName) - if err != nil { - return err - } - - err = db.RemoveSchemaVersionsByTenant(tenantName) - if err != nil { - return err - } - - err = db.RemoveSchemasByTenant(tenantName) - if err != nil { - return err - } - - err = db.RemoveTagsResourcesByTenant(tenantName) - if err != nil { - return err - } - - err = db.RemoveAuditLogsByTenant(tenantName) - if err != nil { - return err - } - - err = db.DeleteDlsMsgsByTenant(tenantName) - if err != nil { - return err - } - - err = db.RemoveStationsByTenant(tenantName) - if err != nil { - return err - } - - users_list, err := db.DeleteUsersByTenant(tenantName) - if err != nil { - return err - } - - SendUserDeleteCacheUpdate(users_list, tenantName) - - err = db.DeleteConfByTenantName(tenantName) - if err != nil { - return err - } - - err = db.DeleteIntegrationsByTenantName(tenantName) - if err != nil { - return err - } - - err = serv.memphisPurgeResourcesAccount(tenantName) - if err != nil { - if err != nil && !IsNatsErr(err, JSStreamNotFoundErr) { - return err - } - } - - if configuration.USER_PASS_BASED_AUTH { - // send signal to reload config - err = serv.sendInternalAccountMsgWithReply(serv.MemphisGlobalAccount(), CONFIGURATIONS_RELOAD_SIGNAL_SUBJ, _EMPTY_, nil, _EMPTY_, true) - if err != nil { - return err - } - } - - return nil -} - func InitializeBillingRoutes(router *gin.RouterGroup, h *Handlers) { } diff --git a/server/memphis_handlers_user_mgmt.go b/server/memphis_handlers_user_mgmt.go index 5d35329c5..75a6589ba 100644 --- a/server/memphis_handlers_user_mgmt.go +++ b/server/memphis_handlers_user_mgmt.go @@ -115,6 +115,89 @@ func updateDeletedUserResources(user models.User) error { return nil } +func removeTenantResources(tenantName string, user models.User) error { + err := db.RemoveProducersByTenant(tenantName) + if err != nil { + return err + } + + err = db.RemoveConsumersByTenant(tenantName) + if err != nil { + return err + } + + err = db.RemoveSchemaVersionsByTenant(tenantName) + if err != nil { + return err + } + + err = db.RemoveSchemasByTenant(tenantName) + if err != nil { + return err + } + + err = db.RemoveTagsResourcesByTenant(tenantName) + if err != nil { + return err + } + + err = db.RemoveAuditLogsByTenant(tenantName) + if err != nil { + return err + } + + err = db.DeleteDlsMsgsByTenant(tenantName) + if err != nil { + return err + } + + err = db.RemoveStationsByTenant(tenantName) + if err != nil { + return err + } + + users_list, err := db.DeleteUsersByTenant(tenantName) + if err != nil { + return err + } + + SendUserDeleteCacheUpdate(users_list, tenantName) + + err = db.DeleteConfByTenantName(tenantName) + if err != nil { + return err + } + + err = db.DeleteIntegrationsByTenantName(tenantName) + if err != nil { + return err + } + + if tenantName != MEMPHIS_GLOBAL_ACCOUNT { + err = db.RemoveTenant(tenantName) + if err != nil { + return err + } + } + + err = serv.memphisPurgeResourcesAccount(tenantName) + if err != nil { + if err != nil && !IsNatsErr(err, JSStreamNotFoundErr) { + return err + } + } + + if configuration.USER_PASS_BASED_AUTH { + // send signal to reload config + err = serv.sendInternalAccountMsgWithReply(serv.MemphisGlobalAccount(), CONFIGURATIONS_RELOAD_SIGNAL_SUBJ, _EMPTY_, nil, _EMPTY_, true) + if err != nil { + return err + } + } + + return nil +} + func validateEmail(email string) error { re := regexp.MustCompile("^[a-z0-9._%+-]+@[a-z0-9_.-]+.[a-z]{2,4}$") validateEmail := re.MatchString(email)