From b1480181c1a1ad6881b2ececb4ab9b32feb104f7 Mon Sep 17 00:00:00 2001 From: BrianMoyles Date: Mon, 27 Jan 2025 11:51:44 +0000 Subject: [PATCH] Requested Changes --- ...nesyscloud_knowledge_document_variation.go | 18 +++----- ...loud_knowledge_document_variation_proxy.go | 45 ++++++++++++------- ...nesyscloud_knowledge_document_variation.go | 35 ++++++++------- ...loud_knowledge_document_variation_utils.go | 26 ++++++++--- 4 files changed, 74 insertions(+), 50 deletions(-) diff --git a/genesyscloud/knowledge_document_variation/data_source_genesyscloud_knowledge_document_variation.go b/genesyscloud/knowledge_document_variation/data_source_genesyscloud_knowledge_document_variation.go index 599e0a032..e99cb0127 100644 --- a/genesyscloud/knowledge_document_variation/data_source_genesyscloud_knowledge_document_variation.go +++ b/genesyscloud/knowledge_document_variation/data_source_genesyscloud_knowledge_document_variation.go @@ -6,7 +6,6 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/retry" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" - "strings" "terraform-provider-genesyscloud/genesyscloud/provider" "terraform-provider-genesyscloud/genesyscloud/util" "time" @@ -16,22 +15,19 @@ func dataSourceKnowledgeDocumentVariationRead(ctx context.Context, d *schema.Res sdkConfig := meta.(*provider.ProviderMeta).ClientConfig proxy := newVariationRequestProxy(sdkConfig) - name := d.Get("name").(string) - knowledgeBaseID := d.Get("knowledge_base_id").(string) - fullID := d.Get("knowledge_document_id").(string) - knowledgeDocumentId := strings.Split(fullID, ",")[0] + name, _ := d.Get("name").(string) + ids := getKnowledgeIdsFromResourceData(d) return util.WithRetries(ctx, 15*time.Second, func() *retry.RetryError { - documentVariationRequestId, resp, retryable, err := proxy.getVariationRequestIdByName(ctx, name, knowledgeBaseID, knowledgeDocumentId) + documentVariationRequestId, resp, retryable, err := proxy.getVariationRequestIdByName(ctx, name, ids.knowledgeBaseID, ids.knowledgeDocumentID) - if err != nil && !retryable { + if err != nil { + if retryable { + return retry.RetryableError(util.BuildWithRetriesApiDiagnosticError(ResourceType, fmt.Sprintf("No variation request found with name %s", name), resp)) + } return retry.NonRetryableError(util.BuildWithRetriesApiDiagnosticError(ResourceType, fmt.Sprintf("Error searching variation request %s | error: %s", name, err), resp)) } - if retryable { - return retry.RetryableError(util.BuildWithRetriesApiDiagnosticError(ResourceType, fmt.Sprintf("No variation request found with name %s", name), resp)) - } - d.SetId(documentVariationRequestId) return nil }) diff --git a/genesyscloud/knowledge_document_variation/genesyscloud_knowledge_document_variation_proxy.go b/genesyscloud/knowledge_document_variation/genesyscloud_knowledge_document_variation_proxy.go index 3b8f51426..b21510048 100644 --- a/genesyscloud/knowledge_document_variation/genesyscloud_knowledge_document_variation_proxy.go +++ b/genesyscloud/knowledge_document_variation/genesyscloud_knowledge_document_variation_proxy.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "log" + "net/http" rc "terraform-provider-genesyscloud/genesyscloud/resource_cache" "terraform-provider-genesyscloud/genesyscloud/util" @@ -50,7 +51,7 @@ func newVariationRequestProxy(clientConfig *platformclientv2.Configuration) *var deleteVariationRequestAttr: deleteVariationRequestFn, getVariationRequestIdByNameAttr: getVariationRequestIdByNameFn, createKnowledgeKnowledgebaseDocumentVersionsAttr: createKnowledgeKnowledgebaseDocumentVersionsFn, - GetAllKnowledgebaseEntitiesAttr: GetAllKnowledgebaseEntitiesFn, + GetAllKnowledgebaseEntitiesAttr: getAllKnowledgebaseEntitiesFn, variationCache: variationCache, } } @@ -158,25 +159,32 @@ func getVariationRequestByIdFn(ctx context.Context, p *variationRequestProxy, do // getVariationRequestIdByNameFn is an implementation of the function to get a Genesys Cloud variation request by name func getVariationRequestIdByNameFn(ctx context.Context, p *variationRequestProxy, name, knowledgeBaseID, knowledgeDocumentID string) (string, *platformclientv2.APIResponse, bool, error) { - - // Check first for published versions, if 404 - allVariations, resp, err := getAllVariationsFn(ctx, p, knowledgeBaseID, knowledgeDocumentID, "Published", []string{}) + var allVariations []platformclientv2.Documentvariationresponse + + // API throws a 404 if no variations of particular documentState are found + // Check for published state, ignore 404 and check for draft state + // Append the two lists together and proceed as normal provided there is at least 1 entity returned + allPublishedVariations, resp, err := getAllVariationsFn(ctx, p, knowledgeBaseID, knowledgeDocumentID, "Published", []string{}) + if err != nil && resp.StatusCode != http.StatusNotFound { + return "", resp, false, err + } + allDraftVariations, resp, err := getAllVariationsFn(ctx, p, knowledgeBaseID, knowledgeDocumentID, "Draft", []string{}) if err != nil { - if util.IsStatus404(resp) { - allVariations, resp, err = getAllVariationsFn(ctx, p, knowledgeBaseID, knowledgeDocumentID, "Draft", []string{}) - if err != nil { - return "", resp, false, err - } - } else { - return "", resp, false, err - } + return "", resp, false, err } - if allVariations == nil || len(*allVariations) == 0 { + if allPublishedVariations != nil { + allVariations = append(allVariations, *allPublishedVariations...) + } + if allDraftVariations != nil { + allVariations = append(allVariations, *allDraftVariations...) + } + + if allVariations == nil || len(allVariations) == 0 { return "", resp, true, err } - for _, variation := range *allVariations { + for _, variation := range allVariations { if *variation.Name == name { log.Printf("Retrieved the variation request id %s by name %s", *variation.Id, name) return *variation.Id, resp, false, nil @@ -193,14 +201,19 @@ func updateVariationRequestFn(ctx context.Context, p *variationRequestProxy, doc // deleteVariationRequestFn is an implementation function for deleting a Genesys Cloud variation request func deleteVariationRequestFn(ctx context.Context, p *variationRequestProxy, variationId, documentId, baseId string) (*platformclientv2.APIResponse, error) { - return p.knowledgeApi.DeleteKnowledgeKnowledgebaseDocumentVariation(variationId, documentId, baseId) + resp, err := p.knowledgeApi.DeleteKnowledgeKnowledgebaseDocumentVariation(variationId, documentId, baseId) + if err != nil { + return resp, err + } + rc.DeleteCacheItem(p.variationCache, variationId) + return nil, nil } func createKnowledgeKnowledgebaseDocumentVersionsFn(ctx context.Context, p *variationRequestProxy, knowledgeDocumentId, knowledgeBaseId string, version *platformclientv2.Knowledgedocumentversion) (*platformclientv2.Knowledgedocumentversion, *platformclientv2.APIResponse, error) { return p.knowledgeApi.PostKnowledgeKnowledgebaseDocumentVersions(knowledgeBaseId, knowledgeDocumentId, *version) } -func GetAllKnowledgebaseEntitiesFn(ctx context.Context, p *variationRequestProxy, published bool) (*[]platformclientv2.Knowledgebase, *platformclientv2.APIResponse, error) { +func getAllKnowledgebaseEntitiesFn(ctx context.Context, p *variationRequestProxy, published bool) (*[]platformclientv2.Knowledgebase, *platformclientv2.APIResponse, error) { var ( after string err error diff --git a/genesyscloud/knowledge_document_variation/resource_genesyscloud_knowledge_document_variation.go b/genesyscloud/knowledge_document_variation/resource_genesyscloud_knowledge_document_variation.go index c529098c2..37c534951 100644 --- a/genesyscloud/knowledge_document_variation/resource_genesyscloud_knowledge_document_variation.go +++ b/genesyscloud/knowledge_document_variation/resource_genesyscloud_knowledge_document_variation.go @@ -43,7 +43,7 @@ func getAllKnowledgeDocumentVariations(ctx context.Context, clientConfig *platfo for _, knowledgeBase := range knowledgeBaseList { variationEntities, response, err := knowledgeDocumentProxy.GetAllKnowledgeDocumentEntities(ctx, &knowledgeBase) if err != nil { - return nil, util.BuildAPIDiagnosticError(ResourceType, fmt.Sprintf("%v", err), response) + return nil, util.BuildAPIDiagnosticError(ResourceType, err.Error(), response) } // Retrieve the documents for each knowledge base @@ -69,8 +69,10 @@ func getAllKnowledgeDocumentVariations(ctx context.Context, clientConfig *platfo } for _, knowledgeDocumentVariation := range *knowledgeDocumentVariations { - id := fmt.Sprintf("%s %s %s", *knowledgeDocumentVariation.Id, *knowledgeDoc.KnowledgeBase.Id, *knowledgeDoc.Id) - blockLabel := *knowledgeBase.Name + "_" + *knowledgeDoc.Title + id := buildVariationId(*knowledgeBase.Id, *knowledgeDoc.Id, *knowledgeDocumentVariation.Id) + + blockLabel := util.StringOrNil(knowledgeBase.Name) + "_" + util.StringOrNil(knowledgeDoc.Title) + if knowledgeDocumentVariation.Name != nil && *knowledgeDocumentVariation.Name != "" { blockLabel = blockLabel + "_" + *knowledgeDocumentVariation.Name } else { @@ -90,7 +92,7 @@ func getAllKnowledgeBases(ctx context.Context, proxy *variationRequestProxy) ([] // get published knowledge bases publishedEntities, response, err := proxy.GetAllKnowledgebaseEntities(ctx, true) if err != nil { - return nil, util.BuildAPIDiagnosticError(ResourceType, fmt.Sprintf("%v", err), response) + return nil, util.BuildAPIDiagnosticError(ResourceType, err.Error(), response) } if publishedEntities != nil { knowledgeBaseList = append(knowledgeBaseList, *publishedEntities...) @@ -99,7 +101,7 @@ func getAllKnowledgeBases(ctx context.Context, proxy *variationRequestProxy) ([] // get unpublished knowledge bases unpublishedEntities, response, err := proxy.GetAllKnowledgebaseEntities(ctx, false) if err != nil { - return nil, util.BuildAPIDiagnosticError(ResourceType, fmt.Sprintf("%v", err), response) + return nil, util.BuildAPIDiagnosticError(ResourceType, err.Error(), response) } if unpublishedEntities != nil { @@ -113,10 +115,8 @@ func createKnowledgeDocumentVariation(ctx context.Context, d *schema.ResourceDat sdkConfig := meta.(*provider.ProviderMeta).ClientConfig variationProxy := getVariationRequestProxy(sdkConfig) - knowledgeBaseID := d.Get("knowledge_base_id").(string) - documentResourceId := d.Get("knowledge_document_id").(string) - knowledgeDocumentId := strings.Split(documentResourceId, ",")[0] - knowledgeDocumentVariation := d.Get("knowledge_document_variation").([]interface{})[0].(map[string]interface{}) + ids := getKnowledgeIdsFromResourceData(d) + knowledgeDocumentVariation, _ := d.Get("knowledge_document_variation").([]interface{})[0].(map[string]interface{}) published := false if publishedIn, ok := d.GetOk("published"); ok { @@ -125,21 +125,21 @@ func createKnowledgeDocumentVariation(ctx context.Context, d *schema.ResourceDat knowledgeDocumentVariationRequest := buildKnowledgeDocumentVariation(knowledgeDocumentVariation) - log.Printf("Creating knowledge document variation for document %s", knowledgeDocumentId) + log.Printf("Creating knowledge document variation for document %s", ids.knowledgeDocumentID) - knowledgeDocumentVariationResponse, resp, err := variationProxy.CreateVariation(ctx, knowledgeDocumentVariationRequest, knowledgeDocumentId, knowledgeBaseID) + knowledgeDocumentVariationResponse, resp, err := variationProxy.CreateVariation(ctx, knowledgeDocumentVariationRequest, ids.knowledgeDocumentID, ids.knowledgeBaseID) if err != nil { - return util.BuildAPIDiagnosticError(ResourceType, fmt.Sprintf("Failed to create variation for knowledge document %s error: %s", d.Id(), err), resp) + return util.BuildAPIDiagnosticError(ResourceType, fmt.Sprintf("Failed to create variation for knowledge document (%s) error: %s", ids.knowledgeDocumentID, err), resp) } if published == true { - _, resp, versionErr := variationProxy.createKnowledgeKnowledgebaseDocumentVersions(ctx, knowledgeDocumentId, knowledgeBaseID, &platformclientv2.Knowledgedocumentversion{}) + _, resp, versionErr := variationProxy.createKnowledgeKnowledgebaseDocumentVersions(ctx, ids.knowledgeDocumentID, ids.knowledgeBaseID, &platformclientv2.Knowledgedocumentversion{}) if versionErr != nil { return util.BuildAPIDiagnosticError(ResourceType, fmt.Sprintf("Failed to publish knowledge document error: %s", err), resp) } } - id := fmt.Sprintf("%s %s %s", *knowledgeDocumentVariationResponse.Id, knowledgeBaseID, documentResourceId) + id := buildVariationId(ids.knowledgeBaseID, ids.documentID, *knowledgeDocumentVariationResponse.Id) d.SetId(id) log.Printf("Created knowledge document variation %s", *knowledgeDocumentVariationResponse.Id) @@ -228,8 +228,9 @@ func readKnowledgeDocumentVariation(ctx context.Context, d *schema.ResourceData, knowledgeDocumentVariation = variation } - newId := fmt.Sprintf("%s %s %s", *knowledgeDocumentVariation.Id, *knowledgeDocumentVariation.Document.KnowledgeBase.Id, ids.documentID) + newId := buildVariationId(*knowledgeDocumentVariation.Document.KnowledgeBase.Id, ids.documentID, *knowledgeDocumentVariation.Id) d.SetId(newId) + _ = d.Set("knowledge_base_id", *knowledgeDocumentVariation.Document.KnowledgeBase.Id) _ = d.Set("knowledge_document_id", ids.documentID) _ = d.Set("knowledge_document_variation", flattenKnowledgeDocumentVariation(*knowledgeDocumentVariation)) @@ -253,7 +254,7 @@ func updateKnowledgeDocumentVariation(ctx context.Context, d *schema.ResourceDat if err != nil { return diag.FromErr(err) } - knowledgeDocumentVariation := d.Get("knowledge_document_variation").([]interface{})[0].(map[string]interface{}) + knowledgeDocumentVariation, _ := d.Get("knowledge_document_variation").([]interface{})[0].(map[string]interface{}) published := false if publishedIn, ok := d.GetOk("published"); ok { @@ -325,7 +326,7 @@ func deleteKnowledgeDocumentVariation(ctx context.Context, d *schema.ResourceDat return util.BuildAPIDiagnosticError(ResourceType, fmt.Sprintf("Failed to retrieve knowledge document variations error: %s", err), resp) } - if len(*variations) > 0 { + if variations != nil && len(*variations) > 0 { _, resp, versionErr := variationProxy.createKnowledgeKnowledgebaseDocumentVersions(ctx, ids.knowledgeBaseID, ids.knowledgeDocumentID, &platformclientv2.Knowledgedocumentversion{}) if versionErr != nil { diff --git a/genesyscloud/knowledge_document_variation/resource_genesyscloud_knowledge_document_variation_utils.go b/genesyscloud/knowledge_document_variation/resource_genesyscloud_knowledge_document_variation_utils.go index 4b2af2c3c..1a708e099 100644 --- a/genesyscloud/knowledge_document_variation/resource_genesyscloud_knowledge_document_variation_utils.go +++ b/genesyscloud/knowledge_document_variation/resource_genesyscloud_knowledge_document_variation_utils.go @@ -2,7 +2,6 @@ package knowledgedocumentvariation import ( "fmt" - "log" "strings" lists "terraform-provider-genesyscloud/genesyscloud/util/lists" @@ -759,7 +758,6 @@ func flattenDocumentBodyBlocks(blocksIn []platformclientv2.Documentbodyblock) [] blockOutMap["video"] = flattenDocumentVideo(*block.Video) } if block.List != nil { - log.Println("HERE", block.List) blockOutMap["list"] = flattenDocumentList(*block.List) } blocksOut = append(blocksOut, blockOutMap) @@ -808,6 +806,10 @@ func flattenKnowledgeDocumentVariation(variationIn platformclientv2.Documentvari // Utils +func buildVariationId(baseID, documentID, variationID string) string { + return fmt.Sprintf("%s %s %s", baseID, documentID, variationID) +} + func parseResourceIDs(id string) (*resourceIDs, error) { parts := strings.Split(id, " ") if len(parts) != 3 { @@ -815,9 +817,21 @@ func parseResourceIDs(id string) (*resourceIDs, error) { } return &resourceIDs{ - variationID: parts[0], - knowledgeBaseID: parts[1], - documentID: parts[2], - knowledgeDocumentID: strings.Split(parts[2], ",")[0], + variationID: parts[2], + knowledgeBaseID: parts[0], + documentID: parts[1], + knowledgeDocumentID: strings.Split(parts[1], ",")[0], }, nil } + +func getKnowledgeIdsFromResourceData(d *schema.ResourceData) resourceIDs { + knowledgeBaseID, _ := d.Get("knowledge_base_id").(string) + documentResourceId, _ := d.Get("knowledge_document_id").(string) + knowledgeDocumentId := strings.Split(documentResourceId, ",")[0] + + return resourceIDs{ + knowledgeBaseID: knowledgeBaseID, + documentID: documentResourceId, + knowledgeDocumentID: knowledgeDocumentId, + } +}