Skip to content

Commit

Permalink
implementation of facebook resource
Browse files Browse the repository at this point in the history
  • Loading branch information
shrutisuryawanshigenesys committed Jul 7, 2024
1 parent 2a3b411 commit 244aa77
Show file tree
Hide file tree
Showing 15 changed files with 1,057 additions and 0 deletions.
30 changes: 30 additions & 0 deletions docs/data-sources/integration_facebook.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
---
# generated by https://github.com/hashicorp/terraform-plugin-docs
page_title: "genesyscloud_integration_facebook Data Source - terraform-provider-genesyscloud"
subcategory: ""
description: |-
Genesys Cloud integration facebook data source. Select an integration facebook by name
---

# genesyscloud_integration_facebook (Data Source)

Genesys Cloud integration facebook data source. Select an integration facebook by name

## Example Usage

```terraform
data "genesyscloud_integration_facebook" "example_integrationfacebook" {
name = "example_integrationfacebook data"
}
```

<!-- schema generated by tfplugindocs -->
## Schema

### Required

- `name` (String) integration facebook name

### Read-Only

- `id` (String) The ID of this resource.
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
data "genesyscloud_integration_facebook" "example_integrationfacebook" {
name = "example_integrationfacebook data"
}
6 changes: 6 additions & 0 deletions examples/resources/genesyscloud_integration_facebook/apis.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
* [POST /api/v2/conversations/messaging/integrations/facebook](https://developer.genesys.cloud/devapps/api-explorer#post-api-v2-conversations-messaging-integrations-facebook)
* [GET /api/v2/conversations/messaging/integrations/facebook/{integrationId}](https://developer.genesys.cloud/devapps/api-explorer#get-api-v2-conversations-messaging-integrations-facebook--integrationId-)
* [PATCH /api/v2/conversations/messaging/integrations/facebook/{integrationId}](https://developer.genesys.cloud/devapps/api-explorer#patch-api-v2-conversations-messaging-integrations-facebook--integrationId-)
* [DELETE /api/v2/conversations/messaging/integrations/facebook/{integrationId}](https://developer.genesys.cloud/devapps/api-explorer#delete-api-v2-conversations-messaging-integrations-facebook--integrationId-)
* [GET /api/v2/conversations/messaging/integrations/facebook](https://developer.genesys.cloud/devapps/api-explorer#get-api-v2-conversations-messaging-integrations-facebook)

Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package integration_facebook

import (
"context"
"fmt"
"time"

"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/retry"

"terraform-provider-genesyscloud/genesyscloud/provider"
"terraform-provider-genesyscloud/genesyscloud/util"
)

/*
The data_source_genesyscloud_integration_facebook.go contains the data source implementation
for the resource.
*/

// dataSourceIntegrationFacebookRead retrieves by name the id in question
func dataSourceIntegrationFacebookRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
sdkConfig := meta.(*provider.ProviderMeta).ClientConfig
proxy := newIntegrationFacebookProxy(sdkConfig)

name := d.Get("name").(string)

return util.WithRetries(ctx, 30*time.Second, func() *retry.RetryError {
facebookIntegrationRequestId, retryable, resp, err := proxy.getIntegrationFacebookIdByName(ctx, name)

if err != nil && !retryable {
return retry.NonRetryableError(util.BuildWithRetriesApiDiagnosticError(resourceName, fmt.Sprintf("Error searching integration facebook %s: %s", name, err), resp))
}

if retryable {
return retry.RetryableError(util.BuildWithRetriesApiDiagnosticError(resourceName, fmt.Sprintf("No integration facebook found with name %s", name), resp))
}

d.SetId(facebookIntegrationRequestId)
return nil
})
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package integration_facebook

import (
"fmt"
"terraform-provider-genesyscloud/genesyscloud/provider"
"terraform-provider-genesyscloud/genesyscloud/util"
"testing"

"github.com/google/uuid"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
)

/*
Test Class for the integration facebook Data Source
*/

func TestAccDataSourceIntegrationFacebook(t *testing.T) {
t.Parallel()
var (
testResource1 = "test_sample"
testResource2 = "test_sample"
name1 = "test_sample"
supportedContentId1 = "6b3d7fb2-c276-415c-a5c7-d18eba936c68"
pageAccessToken1 = uuid.NewString()
messagingSettingId1 = "2c4e3b8e-3c9f-45c9-82cd-4bb54c8f18f0"
appId = ""
appSecret = ""
)
resource.Test(t, resource.TestCase{
PreCheck: func() { util.TestAccPreCheck(t) },
ProviderFactories: provider.GetProviderFactories(providerResources, providerDataSources),
Steps: []resource.TestStep{
{
Config: generateFacebookIntegrationResource(
testResource1,
name1,
supportedContentId1,
messagingSettingId1,
pageAccessToken1,
"",
"",
appId,
appSecret,
) + generateIntegrationFacebookDataSource(
testResource2,
name1,
"genesyscloud_integration_facebook."+testResource1,
),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrPair("data.genesyscloud_integration_facebook."+testResource2, "id", "genesyscloud_integration_facebook."+testResource1, "id"),
),
},
},
})
}

func generateIntegrationFacebookDataSource(
resourceId string,
name string,
dependsOnResource string) string {
return fmt.Sprintf(`data "genesyscloud_integration_facebook" "%s" {
name = "%s"
depends_on = [%s]
}
`, resourceId, name, dependsOnResource)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package integration_facebook

import (
"sync"
"testing"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)

/*
The genesyscloud_integration_facebook_init_test.go file is used to initialize the data sources and resources
used in testing the integration_facebook resource.
*/

// providerDataSources holds a map of all registered datasources
var providerDataSources map[string]*schema.Resource

// providerResources holds a map of all registered resources
var providerResources map[string]*schema.Resource

type registerTestInstance struct {
resourceMapMutex sync.RWMutex
datasourceMapMutex sync.RWMutex
}

// registerTestResources registers all resources used in the tests
func (r *registerTestInstance) registerTestResources() {
r.resourceMapMutex.Lock()
defer r.resourceMapMutex.Unlock()

providerResources[resourceName] = ResourceIntegrationFacebook()
}

// registerTestDataSources registers all data sources used in the tests.
func (r *registerTestInstance) registerTestDataSources() {
r.datasourceMapMutex.Lock()
defer r.datasourceMapMutex.Unlock()

providerDataSources[resourceName] = DataSourceIntegrationFacebook()
}

// initTestResources initializes all test resources and data sources.
func initTestResources() {
providerDataSources = make(map[string]*schema.Resource)
providerResources = make(map[string]*schema.Resource)

regInstance := &registerTestInstance{}

regInstance.registerTestResources()
regInstance.registerTestDataSources()
}

// TestMain is a "setup" function called by the testing framework when run the test
func TestMain(m *testing.M) {
// Run setup function before starting the test suite for the integration_facebook package
initTestResources()

// Run the test suite for the integration_facebook package
m.Run()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
package integration_facebook

import (
"context"
"fmt"
"log"

"github.com/mypurecloud/platform-client-sdk-go/v133/platformclientv2"
)

/*
The genesyscloud_integration_facebook_proxy.go file contains the proxy structures and methods that interact
with the Genesys Cloud SDK. We use composition here for each function on the proxy so individual functions can be stubbed
out during testing.
*/

// internalProxy holds a proxy instance that can be used throughout the package
var internalProxy *integrationFacebookProxy

// Type definitions for each func on our proxy so we can easily mock them out later
type createIntegrationFacebookFunc func(ctx context.Context, p *integrationFacebookProxy, facebookIntegrationRequest *platformclientv2.Facebookintegrationrequest) (*platformclientv2.Facebookintegration, *platformclientv2.APIResponse, error)
type getAllIntegrationFacebookFunc func(ctx context.Context, p *integrationFacebookProxy) (*[]platformclientv2.Facebookintegration, *platformclientv2.APIResponse, error)
type getIntegrationFacebookIdByNameFunc func(ctx context.Context, p *integrationFacebookProxy, name string) (id string, retryable bool, resp *platformclientv2.APIResponse, err error)
type getIntegrationFacebookByIdFunc func(ctx context.Context, p *integrationFacebookProxy, id string) (facebookIntegrationRequest *platformclientv2.Facebookintegration, response *platformclientv2.APIResponse, err error)
type updateIntegrationFacebookFunc func(ctx context.Context, p *integrationFacebookProxy, id string, facebookIntegrationRequest *platformclientv2.Facebookintegrationupdaterequest) (*platformclientv2.Facebookintegration, *platformclientv2.APIResponse, error)
type deleteIntegrationFacebookFunc func(ctx context.Context, p *integrationFacebookProxy, id string) (response *platformclientv2.APIResponse, err error)

// integrationFacebookProxy contains all of the methods that call genesys cloud APIs.
type integrationFacebookProxy struct {
clientConfig *platformclientv2.Configuration
conversationsApi *platformclientv2.ConversationsApi
createIntegrationFacebookAttr createIntegrationFacebookFunc
getAllIntegrationFacebookAttr getAllIntegrationFacebookFunc
getIntegrationFacebookIdByNameAttr getIntegrationFacebookIdByNameFunc
getIntegrationFacebookByIdAttr getIntegrationFacebookByIdFunc
updateIntegrationFacebookAttr updateIntegrationFacebookFunc
deleteIntegrationFacebookAttr deleteIntegrationFacebookFunc
}

// newIntegrationFacebookProxy initializes the integration facebook proxy with all of the data needed to communicate with Genesys Cloud
func newIntegrationFacebookProxy(clientConfig *platformclientv2.Configuration) *integrationFacebookProxy {
api := platformclientv2.NewConversationsApiWithConfig(clientConfig)
return &integrationFacebookProxy{
clientConfig: clientConfig,
conversationsApi: api,
createIntegrationFacebookAttr: createIntegrationFacebookFn,
getAllIntegrationFacebookAttr: getAllIntegrationFacebookFn,
getIntegrationFacebookIdByNameAttr: getIntegrationFacebookIdByNameFn,
getIntegrationFacebookByIdAttr: getIntegrationFacebookByIdFn,
updateIntegrationFacebookAttr: updateIntegrationFacebookFn,
deleteIntegrationFacebookAttr: deleteIntegrationFacebookFn,
}
}

// getIntegrationFacebookProxy acts as a singleton to for the internalProxy. It also ensures
// that we can still proxy our tests by directly setting internalProxy package variable
func getIntegrationFacebookProxy(clientConfig *platformclientv2.Configuration) *integrationFacebookProxy {
if internalProxy == nil {
internalProxy = newIntegrationFacebookProxy(clientConfig)
}

return internalProxy
}

// createIntegrationFacebook creates a Genesys Cloud integration facebook
func (p *integrationFacebookProxy) createIntegrationFacebook(ctx context.Context, integrationFacebook *platformclientv2.Facebookintegrationrequest) (*platformclientv2.Facebookintegration, *platformclientv2.APIResponse, error) {
return p.createIntegrationFacebookAttr(ctx, p, integrationFacebook)
}

// getIntegrationFacebook retrieves all Genesys Cloud integration facebook
func (p *integrationFacebookProxy) getAllIntegrationFacebook(ctx context.Context) (*[]platformclientv2.Facebookintegration, *platformclientv2.APIResponse, error) {
return p.getAllIntegrationFacebookAttr(ctx, p)
}

// getIntegrationFacebookIdByName returns a single Genesys Cloud integration facebook by a name
func (p *integrationFacebookProxy) getIntegrationFacebookIdByName(ctx context.Context, name string) (id string, retryable bool, resp *platformclientv2.APIResponse, err error) {
return p.getIntegrationFacebookIdByNameAttr(ctx, p, name)
}

// getIntegrationFacebookById returns a single Genesys Cloud integration facebook by Id
func (p *integrationFacebookProxy) getIntegrationFacebookById(ctx context.Context, id string) (integrationFacebook *platformclientv2.Facebookintegration, response *platformclientv2.APIResponse, err error) {
return p.getIntegrationFacebookByIdAttr(ctx, p, id)
}

// updateIntegrationFacebook updates a Genesys Cloud integration facebook
func (p *integrationFacebookProxy) updateIntegrationFacebook(ctx context.Context, id string, integrationFacebook *platformclientv2.Facebookintegrationupdaterequest) (*platformclientv2.Facebookintegration, *platformclientv2.APIResponse, error) {
return p.updateIntegrationFacebookAttr(ctx, p, id, integrationFacebook)
}

// deleteIntegrationFacebook deletes a Genesys Cloud integration facebook by Id
func (p *integrationFacebookProxy) deleteIntegrationFacebook(ctx context.Context, id string) (response *platformclientv2.APIResponse, err error) {
return p.deleteIntegrationFacebookAttr(ctx, p, id)
}

// createIntegrationFacebookFn is an implementation function for creating a Genesys Cloud integration facebook
func createIntegrationFacebookFn(ctx context.Context, p *integrationFacebookProxy, integrationFacebook *platformclientv2.Facebookintegrationrequest) (*platformclientv2.Facebookintegration, *platformclientv2.APIResponse, error) {
return p.conversationsApi.PostConversationsMessagingIntegrationsFacebook(*integrationFacebook)
}

// getAllIntegrationFacebookFn is the implementation for retrieving all integration facebook in Genesys Cloud
func getAllIntegrationFacebookFn(ctx context.Context, p *integrationFacebookProxy) (*[]platformclientv2.Facebookintegration, *platformclientv2.APIResponse, error) {
var allFacebookIntegrationRequests []platformclientv2.Facebookintegration

facebookIntegrationRequests, resp, err := p.conversationsApi.GetConversationsMessagingIntegrationsFacebook(1, 100, "", "", "")
if err != nil {
return nil, resp, fmt.Errorf("Failed to get facebook integration request: %v %v", err, resp)
}
if facebookIntegrationRequests.Entities == nil || len(*facebookIntegrationRequests.Entities) == 0 {
return &allFacebookIntegrationRequests, resp, nil
}
for _, facebookIntegrationRequest := range *facebookIntegrationRequests.Entities {
allFacebookIntegrationRequests = append(allFacebookIntegrationRequests, facebookIntegrationRequest)
}

for pageNum := 2; pageNum <= *facebookIntegrationRequests.PageCount; pageNum++ {
const pageSize = 100

facebookIntegrationRequests, resp, err := p.conversationsApi.GetConversationsMessagingIntegrationsFacebook(pageNum, pageSize, "", "", "")
if err != nil {
return nil, resp, fmt.Errorf("Failed to get facebook integration request: %v %v", err, resp)
}

if facebookIntegrationRequests.Entities == nil || len(*facebookIntegrationRequests.Entities) == 0 {
break
}

for _, facebookIntegrationRequest := range *facebookIntegrationRequests.Entities {
allFacebookIntegrationRequests = append(allFacebookIntegrationRequests, facebookIntegrationRequest)
}
}

return &allFacebookIntegrationRequests, resp, err
}

// getIntegrationFacebookIdByNameFn is an implementation of the function to get a Genesys Cloud integration facebook by name
func getIntegrationFacebookIdByNameFn(ctx context.Context, p *integrationFacebookProxy, name string) (string, bool, *platformclientv2.APIResponse, error) {
facebookIntegrationRequests, resp, err := getAllIntegrationFacebookFn(ctx, p)
if err != nil {
return "", false, resp, err
}

if facebookIntegrationRequests == nil || len(*facebookIntegrationRequests) == 0 {
return "", true, resp, fmt.Errorf("No integration facebook found with name %s", name)
}

var facebookIntegration platformclientv2.Facebookintegration
for _, facebookIntegrationRequest := range *facebookIntegrationRequests {
if *facebookIntegrationRequest.Name == name {
log.Printf("Retrieved the integration facebook id %s by name %s", *facebookIntegrationRequest.Id, name)
facebookIntegration = facebookIntegrationRequest
return *facebookIntegration.Id, false, resp, nil
}
}

return "", true, resp, fmt.Errorf("Unable to find integration facebook with name %s", name)
}

// getIntegrationFacebookByIdFn is an implementation of the function to get a Genesys Cloud integration facebook by Id
func getIntegrationFacebookByIdFn(ctx context.Context, p *integrationFacebookProxy, id string) (integrationFacebook *platformclientv2.Facebookintegration, response *platformclientv2.APIResponse, err error) {
return p.conversationsApi.GetConversationsMessagingIntegrationsFacebookIntegrationId(id, "")
}

// updateIntegrationFacebookFn is an implementation of the function to update a Genesys Cloud integration facebook
func updateIntegrationFacebookFn(ctx context.Context, p *integrationFacebookProxy, id string, integrationFacebook *platformclientv2.Facebookintegrationupdaterequest) (*platformclientv2.Facebookintegration, *platformclientv2.APIResponse, error) {
return p.conversationsApi.PatchConversationsMessagingIntegrationsFacebookIntegrationId(id, *integrationFacebook)
}

// deleteIntegrationFacebookFn is an implementation function for deleting a Genesys Cloud integration facebook
func deleteIntegrationFacebookFn(ctx context.Context, p *integrationFacebookProxy, id string) (response *platformclientv2.APIResponse, err error) {
resp, err := p.conversationsApi.DeleteConversationsMessagingIntegrationsFacebookIntegrationId(id)
if err != nil {
return resp, err
}

return resp, err
}
Loading

0 comments on commit 244aa77

Please sign in to comment.