Skip to content

Commit

Permalink
Requested Changes
Browse files Browse the repository at this point in the history
  • Loading branch information
BrianMoyles committed Jan 27, 2025
1 parent 696c9cc commit b148018
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 50 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"context"
"fmt"
"log"
"net/http"
rc "terraform-provider-genesyscloud/genesyscloud/resource_cache"
"terraform-provider-genesyscloud/genesyscloud/util"

Expand Down Expand Up @@ -50,7 +51,7 @@ func newVariationRequestProxy(clientConfig *platformclientv2.Configuration) *var
deleteVariationRequestAttr: deleteVariationRequestFn,
getVariationRequestIdByNameAttr: getVariationRequestIdByNameFn,
createKnowledgeKnowledgebaseDocumentVersionsAttr: createKnowledgeKnowledgebaseDocumentVersionsFn,
GetAllKnowledgebaseEntitiesAttr: GetAllKnowledgebaseEntitiesFn,
GetAllKnowledgebaseEntitiesAttr: getAllKnowledgebaseEntitiesFn,
variationCache: variationCache,
}
}
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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 {
Expand All @@ -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...)
Expand All @@ -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 {
Expand All @@ -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 {
Expand All @@ -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)
Expand Down Expand Up @@ -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))
Expand All @@ -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 {
Expand Down Expand Up @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package knowledgedocumentvariation

import (
"fmt"
"log"
"strings"
lists "terraform-provider-genesyscloud/genesyscloud/util/lists"

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -808,16 +806,32 @@ 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 {
return nil, fmt.Errorf("invalid resource ID: %s", id)
}

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,
}
}

0 comments on commit b148018

Please sign in to comment.