From f24d6652e340ea65d46cf5ccbba11f31004dd639 Mon Sep 17 00:00:00 2001 From: maikow-genesys Date: Fri, 24 Jan 2025 12:33:34 +0000 Subject: [PATCH] WORKITEMS-3562 Add Task Management Rules resources (#1451) * Add task management oncreate rule resource * WORKITEMS-3562 Add onattributechange rules resource * WORKITEMS-3562 Fix names in docs * WORKITEMS-3562 Add docs * WORKITEMS-3562 Add Task management datebased rules * WORKITEMS-3562 Fix datebased Rules and other fixes * WORKITEMS-3562 Add docs for datebased Rules * WORKITEMS-3562 Fix PR comments * WORKITEMS-3562 Update docs * WORKITEMS-3562 Change resource names * WORKITEMS-3562 Format source code --- ...management_worktype_flow_datebased_rule.md | 32 +++ ...nt_worktype_flow_onattributechange_rule.md | 32 +++ ..._management_worktype_flow_oncreate_rule.md | 32 +++ docs/resources/task_management_worktype.md | 2 +- ...management_worktype_flow_datebased_rule.md | 54 +++++ ...nt_worktype_flow_onattributechange_rule.md | 60 ++++++ ..._management_worktype_flow_oncreate_rule.md | 42 ++++ .../data-source.tf | 4 + .../data-source.tf | 4 + .../data-source.tf | 4 + .../apis.md | 5 + .../resource.tf | 8 + .../apis.md | 6 + .../resource.tf | 9 + .../apis.md | 6 + .../resource.tf | 4 + ...esyscloud_task_management_workitem_test.go | 1 - ...esyscloud_task_management_workitem_test.go | 4 +- ...esyscloud_task_management_worktype_test.go | 3 +- ...yscloud_task_management_worktype_schema.go | 2 +- ...esyscloud_task_management_worktype_test.go | 3 +- ...syscloud_task_management_worktype_utils.go | 7 +- ...syscloud_task_management_datebased_rule.go | 43 ++++ ...oud_task_management_datebased_rule_test.go | 91 +++++++++ ...ask_management_datebased_rule_init_test.go | 64 ++++++ ...ud_task_management_datebased_rule_proxy.go | 187 ++++++++++++++++++ ...syscloud_task_management_datebased_rule.go | 147 ++++++++++++++ ...d_task_management_datebased_rule_schema.go | 110 +++++++++++ ...oud_task_management_datebased_rule_test.go | 127 ++++++++++++ ...ud_task_management_datebased_rule_utils.go | 137 +++++++++++++ ..._task_management_onattributechange_rule.go | 43 ++++ ..._management_onattributechange_rule_test.go | 104 ++++++++++ ...gement_onattributechange_rule_init_test.go | 66 +++++++ ...management_onattributechange_rule_proxy.go | 187 ++++++++++++++++++ ..._task_management_onattributechange_rule.go | 147 ++++++++++++++ ...anagement_onattributechange_rule_schema.go | 117 +++++++++++ ..._management_onattributechange_rule_test.go | 171 ++++++++++++++++ ...management_onattributechange_rule_utils.go | 179 +++++++++++++++++ ...esyscloud_task_management_oncreate_rule.go | 43 ++++ ...loud_task_management_oncreate_rule_test.go | 88 +++++++++ ...task_management_oncreate_rule_init_test.go | 64 ++++++ ...oud_task_management_oncreate_rule_proxy.go | 187 ++++++++++++++++++ ...esyscloud_task_management_oncreate_rule.go | 146 ++++++++++++++ ...ud_task_management_oncreate_rule_schema.go | 88 +++++++++ ...loud_task_management_oncreate_rule_test.go | 119 +++++++++++ ...oud_task_management_oncreate_rule_utils.go | 100 ++++++++++ ...ud_task_management_worktype_status_test.go | 1 - ...ud_task_management_worktype_status_test.go | 2 - main.go | 6 + 49 files changed, 3071 insertions(+), 17 deletions(-) create mode 100644 docs/data-sources/task_management_worktype_flow_datebased_rule.md create mode 100644 docs/data-sources/task_management_worktype_flow_onattributechange_rule.md create mode 100644 docs/data-sources/task_management_worktype_flow_oncreate_rule.md create mode 100644 docs/resources/task_management_worktype_flow_datebased_rule.md create mode 100644 docs/resources/task_management_worktype_flow_onattributechange_rule.md create mode 100644 docs/resources/task_management_worktype_flow_oncreate_rule.md create mode 100644 examples/data-sources/genesyscloud_task_management_worktype_flow_datebased_rule/data-source.tf create mode 100644 examples/data-sources/genesyscloud_task_management_worktype_flow_onattributechange_rule/data-source.tf create mode 100644 examples/data-sources/genesyscloud_task_management_worktype_flow_oncreate_rule/data-source.tf create mode 100644 examples/resources/genesyscloud_task_management_worktype_flow_datebased_rule/apis.md create mode 100644 examples/resources/genesyscloud_task_management_worktype_flow_datebased_rule/resource.tf create mode 100644 examples/resources/genesyscloud_task_management_worktype_flow_onattributechange_rule/apis.md create mode 100644 examples/resources/genesyscloud_task_management_worktype_flow_onattributechange_rule/resource.tf create mode 100644 examples/resources/genesyscloud_task_management_worktype_flow_oncreate_rule/apis.md create mode 100644 examples/resources/genesyscloud_task_management_worktype_flow_oncreate_rule/resource.tf create mode 100644 genesyscloud/task_management_worktype_flow_datebased_rule/data_source_genesyscloud_task_management_datebased_rule.go create mode 100644 genesyscloud/task_management_worktype_flow_datebased_rule/data_source_genesyscloud_task_management_datebased_rule_test.go create mode 100644 genesyscloud/task_management_worktype_flow_datebased_rule/genesyscloud_task_management_datebased_rule_init_test.go create mode 100644 genesyscloud/task_management_worktype_flow_datebased_rule/genesyscloud_task_management_datebased_rule_proxy.go create mode 100644 genesyscloud/task_management_worktype_flow_datebased_rule/resource_genesyscloud_task_management_datebased_rule.go create mode 100644 genesyscloud/task_management_worktype_flow_datebased_rule/resource_genesyscloud_task_management_datebased_rule_schema.go create mode 100644 genesyscloud/task_management_worktype_flow_datebased_rule/resource_genesyscloud_task_management_datebased_rule_test.go create mode 100644 genesyscloud/task_management_worktype_flow_datebased_rule/resource_genesyscloud_task_management_datebased_rule_utils.go create mode 100644 genesyscloud/task_management_worktype_flow_onattributechange_rule/data_source_genesyscloud_task_management_onattributechange_rule.go create mode 100644 genesyscloud/task_management_worktype_flow_onattributechange_rule/data_source_genesyscloud_task_management_onattributechange_rule_test.go create mode 100644 genesyscloud/task_management_worktype_flow_onattributechange_rule/genesyscloud_task_management_onattributechange_rule_init_test.go create mode 100644 genesyscloud/task_management_worktype_flow_onattributechange_rule/genesyscloud_task_management_onattributechange_rule_proxy.go create mode 100644 genesyscloud/task_management_worktype_flow_onattributechange_rule/resource_genesyscloud_task_management_onattributechange_rule.go create mode 100644 genesyscloud/task_management_worktype_flow_onattributechange_rule/resource_genesyscloud_task_management_onattributechange_rule_schema.go create mode 100644 genesyscloud/task_management_worktype_flow_onattributechange_rule/resource_genesyscloud_task_management_onattributechange_rule_test.go create mode 100644 genesyscloud/task_management_worktype_flow_onattributechange_rule/resource_genesyscloud_task_management_onattributechange_rule_utils.go create mode 100644 genesyscloud/task_management_worktype_flow_oncreate_rule/data_source_genesyscloud_task_management_oncreate_rule.go create mode 100644 genesyscloud/task_management_worktype_flow_oncreate_rule/data_source_genesyscloud_task_management_oncreate_rule_test.go create mode 100644 genesyscloud/task_management_worktype_flow_oncreate_rule/genesyscloud_task_management_oncreate_rule_init_test.go create mode 100644 genesyscloud/task_management_worktype_flow_oncreate_rule/genesyscloud_task_management_oncreate_rule_proxy.go create mode 100644 genesyscloud/task_management_worktype_flow_oncreate_rule/resource_genesyscloud_task_management_oncreate_rule.go create mode 100644 genesyscloud/task_management_worktype_flow_oncreate_rule/resource_genesyscloud_task_management_oncreate_rule_schema.go create mode 100644 genesyscloud/task_management_worktype_flow_oncreate_rule/resource_genesyscloud_task_management_oncreate_rule_test.go create mode 100644 genesyscloud/task_management_worktype_flow_oncreate_rule/resource_genesyscloud_task_management_oncreate_rule_utils.go diff --git a/docs/data-sources/task_management_worktype_flow_datebased_rule.md b/docs/data-sources/task_management_worktype_flow_datebased_rule.md new file mode 100644 index 000000000..c90c4b7fb --- /dev/null +++ b/docs/data-sources/task_management_worktype_flow_datebased_rule.md @@ -0,0 +1,32 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "genesyscloud_task_management_worktype_flow_datebased_rule Data Source - terraform-provider-genesyscloud" +subcategory: "" +description: |- + Genesys Cloud task management datebased rule data source. Select a task management datebased rule by name +--- + +# genesyscloud_task_management_worktype_flow_datebased_rule (Data Source) + +Genesys Cloud task management datebased rule data source. Select a task management datebased rule by name + +## Example Usage + +```terraform +data "genesyscloud_task_management_worktype_flow_datebased_rule" "datebased_rule_data" { + worktype_id = genesyscloud_task_management_worktype.example.id + name = "DateBased Rule" +} +``` + + +## Schema + +### Required + +- `name` (String) The name of the Rule. +- `worktype_id` (String) The Worktype ID of the Rule. + +### Read-Only + +- `id` (String) The ID of this resource. diff --git a/docs/data-sources/task_management_worktype_flow_onattributechange_rule.md b/docs/data-sources/task_management_worktype_flow_onattributechange_rule.md new file mode 100644 index 000000000..9d728e673 --- /dev/null +++ b/docs/data-sources/task_management_worktype_flow_onattributechange_rule.md @@ -0,0 +1,32 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "genesyscloud_task_management_worktype_flow_onattributechange_rule Data Source - terraform-provider-genesyscloud" +subcategory: "" +description: |- + Genesys Cloud task management onattributechange rule data source. Select a task management onattributechange rule by name +--- + +# genesyscloud_task_management_worktype_flow_onattributechange_rule (Data Source) + +Genesys Cloud task management onattributechange rule data source. Select a task management onattributechange rule by name + +## Example Usage + +```terraform +data "genesyscloud_task_management_worktype_flow_onattributechange_rule" "onattributechange_rule_data" { + worktype_id = genesyscloud_task_management_worktype.example.id + name = "OnAttributeChange Rule" +} +``` + + +## Schema + +### Required + +- `name` (String) The name of the Rule. +- `worktype_id` (String) The Worktype ID of the Rule. + +### Read-Only + +- `id` (String) The ID of this resource. diff --git a/docs/data-sources/task_management_worktype_flow_oncreate_rule.md b/docs/data-sources/task_management_worktype_flow_oncreate_rule.md new file mode 100644 index 000000000..3d2964397 --- /dev/null +++ b/docs/data-sources/task_management_worktype_flow_oncreate_rule.md @@ -0,0 +1,32 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "genesyscloud_task_management_worktype_flow_oncreate_rule Data Source - terraform-provider-genesyscloud" +subcategory: "" +description: |- + Genesys Cloud task management oncreate rule data source. Select a task management oncreate rule by name +--- + +# genesyscloud_task_management_worktype_flow_oncreate_rule (Data Source) + +Genesys Cloud task management oncreate rule data source. Select a task management oncreate rule by name + +## Example Usage + +```terraform +data "genesyscloud_task_management_worktype_flow_oncreate_rule" "oncreate_rule_data" { + worktype_id = genesyscloud_task_management_worktype.example.id + name = "OnCreate Rule" +} +``` + + +## Schema + +### Required + +- `name` (String) Task management oncreate rule name +- `worktype_id` (String) The Worktype ID of the Rule. + +### Read-Only + +- `id` (String) The ID of this resource. diff --git a/docs/resources/task_management_worktype.md b/docs/resources/task_management_worktype.md index 12b026ac7..26a30d522 100644 --- a/docs/resources/task_management_worktype.md +++ b/docs/resources/task_management_worktype.md @@ -49,7 +49,6 @@ resource "genesyscloud_task_management_worktype" "worktype_1" { - `default_workbin_id` (String) The default Workbin for Workitems created from the Worktype. - `name` (String) The name of the Worktype. -- `schema_id` (String) Id of the workitem schema. ### Optional @@ -64,6 +63,7 @@ resource "genesyscloud_task_management_worktype" "worktype_1" { - `default_ttl_seconds` (Number) The default time to time to live in seconds for Workitems created from the Worktype. - `description` (String) The description of the Worktype. - `division_id` (String) The division to which this entity belongs. +- `schema_id` (String) Id of the workitem schema. - `schema_version` (Number) Version of the workitem schema to use. If not provided, the worktype will use the latest version. ### Read-Only diff --git a/docs/resources/task_management_worktype_flow_datebased_rule.md b/docs/resources/task_management_worktype_flow_datebased_rule.md new file mode 100644 index 000000000..5d1fcb803 --- /dev/null +++ b/docs/resources/task_management_worktype_flow_datebased_rule.md @@ -0,0 +1,54 @@ +--- +page_title: "genesyscloud_task_management_worktype_flow_datebased_rule Resource - terraform-provider-genesyscloud" +subcategory: "" +description: |- + Genesys Cloud task management onattributeChange Rule +--- +# genesyscloud_task_management_worktype_flow_datebased_rule (Resource) + +Genesys Cloud task management onattributeChange Rule + +## API Usage +The following Genesys Cloud APIs are used by this resource. Ensure your OAuth Client has been granted the necessary scopes and permissions to perform these operations: + +* [GET /api/v2/taskmanagement/worktypes/{worktypeId}/flows/datebased/rules](https://developer.genesys.cloud/devapps/api-explorer#get-api-v2-taskmanagement-worktypes--worktypeId--flows-datebased-rules) +* [POST /api/v2/taskmanagement/worktypes/{worktypeId}/flows/datebased/rules](https://developer.genesys.cloud/devapps/api-explorer#post-api-v2-taskmanagement-worktypes--worktypeId--flows-datebased-rules) +* [GET /api/v2/taskmanagement/worktypes/{worktypeId}/flows/datebased/rules/{ruleId}](https://developer.genesys.cloud/devapps/api-explorer#get-api-v2-taskmanagement-worktypes--worktypeId--flows-datebased-rules--ruleId-) +* [PATCH /api/v2/taskmanagement/worktypes/{worktypeId}/flows/datebased/rules/{ruleId}](https://developer.genesys.cloud/devapps/api-explorer#patch-api-v2-taskmanagement-worktypes--worktypeId--flows-datebased-rules--ruleId-) +* [DELETE /api/v2/taskmanagement/worktypes/{worktypeId}/flows/datebased/rules/{ruleId}](https://developer.genesys.cloud/devapps/api-explorer#delete-api-v2-taskmanagement-worktypes--worktypeId--flows-datebased-rules--ruleId-) + + +## Example Usage + +```terraform +resource "genesyscloud_task_management_worktype_flow_datebased_rule" "datebased_rule" { + worktype_id = genesyscloud_task_management_worktype.example.id + name = "DateBased Rule" + condition { + attribute = "dateDue" + relative_minutes_to_invocation = -10 + } +} +``` + + +## Schema + +### Required + +- `condition` (Block List, Min: 1, Max: 1) Condition for this Rule. (see [below for nested schema](#nestedblock--condition)) +- `name` (String) The name of the Rule. +- `worktype_id` (String) The Worktype ID of the Rule. + +### Read-Only + +- `id` (String) The ID of this resource. + + +### Nested Schema for `condition` + +Required: + +- `attribute` (String) The name of the workitem date attribute. +- `relative_minutes_to_invocation` (Number) The time in minutes before or after the date attribute. + diff --git a/docs/resources/task_management_worktype_flow_onattributechange_rule.md b/docs/resources/task_management_worktype_flow_onattributechange_rule.md new file mode 100644 index 000000000..545a3a8c2 --- /dev/null +++ b/docs/resources/task_management_worktype_flow_onattributechange_rule.md @@ -0,0 +1,60 @@ +--- +page_title: "genesyscloud_task_management_worktype_flow_onattributechange_rule Resource - terraform-provider-genesyscloud" +subcategory: "" +description: |- + Genesys Cloud task management onattributeChange Rule +--- +# genesyscloud_task_management_worktype_flow_onattributechange_rule (Resource) + +Genesys Cloud task management onattributeChange Rule + +## API Usage +The following Genesys Cloud APIs are used by this resource. Ensure your OAuth Client has been granted the necessary scopes and permissions to perform these operations: + +* [GET /api/v2/taskmanagement/worktypes/{worktypeId}/flows/onattributechange/rules](https://developer.genesys.cloud/devapps/api-explorer#get-api-v2-taskmanagement-worktypes--worktypeId--flows-onattributechange-rules) +* [POST /api/v2/taskmanagement/worktypes/{worktypeId}/flows/onattributechange/rules](https://developer.genesys.cloud/devapps/api-explorer#post-api-v2-taskmanagement-worktypes--worktypeId--flows-onattributechange-rules) +* [GET /api/v2/taskmanagement/worktypes/{worktypeId}/flows/onattributechange/rules/{ruleId}](https://developer.genesys.cloud/devapps/api-explorer#get-api-v2-taskmanagement-worktypes--worktypeId--flows-onattributechange-rules--ruleId-) +* [PATCH /api/v2/taskmanagement/worktypes/{worktypeId}/flows/onattributechange/rules/{ruleId}](https://developer.genesys.cloud/devapps/api-explorer#patch-api-v2-taskmanagement-worktypes--worktypeId--flows-onattributechange-rules--ruleId-) +* [DELETE /api/v2/taskmanagement/worktypes/{worktypeId}/flows/onattributechange/rules/{ruleId}](https://developer.genesys.cloud/devapps/api-explorer#delete-api-v2-taskmanagement-worktypes--worktypeId--flows-onattributechange-rules--ruleId-) + + + +## Example Usage + +```terraform +resource "genesyscloud_task_management_worktype_flow_onattributechange_rule" "onattributechange_rule_data" { + worktype_id = genesyscloud_task_management_worktype.example.id + name = "OnAttributeChange Rule" + condition { + attribute = "statusId" + new_value = genesyscloud_task_management_worktype_status.example_status_1.id + old_value = genesyscloud_task_management_worktype_status.example_status_2.id + } +} +``` + + +## Schema + +### Required + +- `condition` (Block List, Min: 1, Max: 1) Condition for this Rule. (see [below for nested schema](#nestedblock--condition)) +- `name` (String) The name of the Rule. +- `worktype_id` (String) The Worktype ID of the Rule. + +### Read-Only + +- `id` (String) The ID of this resource. + + +### Nested Schema for `condition` + +Required: + +- `attribute` (String) The name of the workitem attribute whose change will be evaluated as part of the rule. +- `new_value` (String) The new value of the attribute. If the attribute is updated to this value this part of the condition will be met. + +Optional: + +- `old_value` (String) The old value of the attribute. If the attribute was updated from this value this part of the condition will be met. + diff --git a/docs/resources/task_management_worktype_flow_oncreate_rule.md b/docs/resources/task_management_worktype_flow_oncreate_rule.md new file mode 100644 index 000000000..92044da29 --- /dev/null +++ b/docs/resources/task_management_worktype_flow_oncreate_rule.md @@ -0,0 +1,42 @@ +--- +page_title: "genesyscloud_task_management_worktype_flow_oncreate_rule Resource - terraform-provider-genesyscloud" +subcategory: "" +description: |- + Genesys Cloud task management oncreate Rule +--- +# genesyscloud_task_management_worktype_flow_oncreate_rule (Resource) + +Genesys Cloud task management oncreate Rule + +## API Usage +The following Genesys Cloud APIs are used by this resource. Ensure your OAuth Client has been granted the necessary scopes and permissions to perform these operations: + +* [GET /api/v2/taskmanagement/worktypes/{worktypeId}/flows/oncreate/rules](https://developer.genesys.cloud/devapps/api-explorer#get-api-v2-taskmanagement-worktypes--worktypeId--flows-oncreate-rules) +* [POST /api/v2/taskmanagement/worktypes/{worktypeId}/flows/oncreate/rules](https://developer.genesys.cloud/devapps/api-explorer#post-api-v2-taskmanagement-worktypes--worktypeId--flows-oncreate-rules) +* [GET /api/v2/taskmanagement/worktypes/{worktypeId}/flows/oncreate/rules/{ruleId}](https://developer.genesys.cloud/devapps/api-explorer#get-api-v2-taskmanagement-worktypes--worktypeId--flows-oncreate-rules--ruleId-) +* [PATCH /api/v2/taskmanagement/worktypes/{worktypeId}/flows/oncreate/rules/{ruleId}](https://developer.genesys.cloud/devapps/api-explorer#patch-api-v2-taskmanagement-worktypes--worktypeId--flows-oncreate-rules--ruleId-) +* [DELETE /api/v2/taskmanagement/worktypes/{worktypeId}/flows/oncreate/rules/{ruleId}](https://developer.genesys.cloud/devapps/api-explorer#delete-api-v2-taskmanagement-worktypes--worktypeId--flows-oncreate-rules--ruleId-) + + + +## Example Usage + +```terraform +resource "genesyscloud_task_management_worktype_flow_oncreate_rule" "oncreate_rule" { + worktype_id = genesyscloud_task_management_worktype.example.id + name = "OnCreate Rule" +} +``` + + +## Schema + +### Required + +- `name` (String) The name of the Rule. +- `worktype_id` (String) The Worktype ID of the Rule. + +### Read-Only + +- `id` (String) The ID of this resource. + diff --git a/examples/data-sources/genesyscloud_task_management_worktype_flow_datebased_rule/data-source.tf b/examples/data-sources/genesyscloud_task_management_worktype_flow_datebased_rule/data-source.tf new file mode 100644 index 000000000..7a26631f8 --- /dev/null +++ b/examples/data-sources/genesyscloud_task_management_worktype_flow_datebased_rule/data-source.tf @@ -0,0 +1,4 @@ +data "genesyscloud_task_management_worktype_flow_datebased_rule" "datebased_rule_data" { + worktype_id = genesyscloud_task_management_worktype.example.id + name = "DateBased Rule" +} \ No newline at end of file diff --git a/examples/data-sources/genesyscloud_task_management_worktype_flow_onattributechange_rule/data-source.tf b/examples/data-sources/genesyscloud_task_management_worktype_flow_onattributechange_rule/data-source.tf new file mode 100644 index 000000000..a7c6e7b21 --- /dev/null +++ b/examples/data-sources/genesyscloud_task_management_worktype_flow_onattributechange_rule/data-source.tf @@ -0,0 +1,4 @@ +data "genesyscloud_task_management_worktype_flow_onattributechange_rule" "onattributechange_rule_data" { + worktype_id = genesyscloud_task_management_worktype.example.id + name = "OnAttributeChange Rule" +} \ No newline at end of file diff --git a/examples/data-sources/genesyscloud_task_management_worktype_flow_oncreate_rule/data-source.tf b/examples/data-sources/genesyscloud_task_management_worktype_flow_oncreate_rule/data-source.tf new file mode 100644 index 000000000..c7f3b83f3 --- /dev/null +++ b/examples/data-sources/genesyscloud_task_management_worktype_flow_oncreate_rule/data-source.tf @@ -0,0 +1,4 @@ +data "genesyscloud_task_management_worktype_flow_oncreate_rule" "oncreate_rule_data" { + worktype_id = genesyscloud_task_management_worktype.example.id + name = "OnCreate Rule" +} \ No newline at end of file diff --git a/examples/resources/genesyscloud_task_management_worktype_flow_datebased_rule/apis.md b/examples/resources/genesyscloud_task_management_worktype_flow_datebased_rule/apis.md new file mode 100644 index 000000000..433bd8441 --- /dev/null +++ b/examples/resources/genesyscloud_task_management_worktype_flow_datebased_rule/apis.md @@ -0,0 +1,5 @@ +* [GET /api/v2/taskmanagement/worktypes/{worktypeId}/flows/datebased/rules](https://developer.genesys.cloud/devapps/api-explorer#get-api-v2-taskmanagement-worktypes--worktypeId--flows-datebased-rules) +* [POST /api/v2/taskmanagement/worktypes/{worktypeId}/flows/datebased/rules](https://developer.genesys.cloud/devapps/api-explorer#post-api-v2-taskmanagement-worktypes--worktypeId--flows-datebased-rules) +* [GET /api/v2/taskmanagement/worktypes/{worktypeId}/flows/datebased/rules/{ruleId}](https://developer.genesys.cloud/devapps/api-explorer#get-api-v2-taskmanagement-worktypes--worktypeId--flows-datebased-rules--ruleId-) +* [PATCH /api/v2/taskmanagement/worktypes/{worktypeId}/flows/datebased/rules/{ruleId}](https://developer.genesys.cloud/devapps/api-explorer#patch-api-v2-taskmanagement-worktypes--worktypeId--flows-datebased-rules--ruleId-) +* [DELETE /api/v2/taskmanagement/worktypes/{worktypeId}/flows/datebased/rules/{ruleId}](https://developer.genesys.cloud/devapps/api-explorer#delete-api-v2-taskmanagement-worktypes--worktypeId--flows-datebased-rules--ruleId-) diff --git a/examples/resources/genesyscloud_task_management_worktype_flow_datebased_rule/resource.tf b/examples/resources/genesyscloud_task_management_worktype_flow_datebased_rule/resource.tf new file mode 100644 index 000000000..d210bd088 --- /dev/null +++ b/examples/resources/genesyscloud_task_management_worktype_flow_datebased_rule/resource.tf @@ -0,0 +1,8 @@ +resource "genesyscloud_task_management_worktype_flow_datebased_rule" "datebased_rule" { + worktype_id = genesyscloud_task_management_worktype.example.id + name = "DateBased Rule" + condition { + attribute = "dateDue" + relative_minutes_to_invocation = -10 + } +} diff --git a/examples/resources/genesyscloud_task_management_worktype_flow_onattributechange_rule/apis.md b/examples/resources/genesyscloud_task_management_worktype_flow_onattributechange_rule/apis.md new file mode 100644 index 000000000..57b66aa6e --- /dev/null +++ b/examples/resources/genesyscloud_task_management_worktype_flow_onattributechange_rule/apis.md @@ -0,0 +1,6 @@ +* [GET /api/v2/taskmanagement/worktypes/{worktypeId}/flows/onattributechange/rules](https://developer.genesys.cloud/devapps/api-explorer#get-api-v2-taskmanagement-worktypes--worktypeId--flows-onattributechange-rules) +* [POST /api/v2/taskmanagement/worktypes/{worktypeId}/flows/onattributechange/rules](https://developer.genesys.cloud/devapps/api-explorer#post-api-v2-taskmanagement-worktypes--worktypeId--flows-onattributechange-rules) +* [GET /api/v2/taskmanagement/worktypes/{worktypeId}/flows/onattributechange/rules/{ruleId}](https://developer.genesys.cloud/devapps/api-explorer#get-api-v2-taskmanagement-worktypes--worktypeId--flows-onattributechange-rules--ruleId-) +* [PATCH /api/v2/taskmanagement/worktypes/{worktypeId}/flows/onattributechange/rules/{ruleId}](https://developer.genesys.cloud/devapps/api-explorer#patch-api-v2-taskmanagement-worktypes--worktypeId--flows-onattributechange-rules--ruleId-) +* [DELETE /api/v2/taskmanagement/worktypes/{worktypeId}/flows/onattributechange/rules/{ruleId}](https://developer.genesys.cloud/devapps/api-explorer#delete-api-v2-taskmanagement-worktypes--worktypeId--flows-onattributechange-rules--ruleId-) + diff --git a/examples/resources/genesyscloud_task_management_worktype_flow_onattributechange_rule/resource.tf b/examples/resources/genesyscloud_task_management_worktype_flow_onattributechange_rule/resource.tf new file mode 100644 index 000000000..93352f227 --- /dev/null +++ b/examples/resources/genesyscloud_task_management_worktype_flow_onattributechange_rule/resource.tf @@ -0,0 +1,9 @@ +resource "genesyscloud_task_management_worktype_flow_onattributechange_rule" "onattributechange_rule_data" { + worktype_id = genesyscloud_task_management_worktype.example.id + name = "OnAttributeChange Rule" + condition { + attribute = "statusId" + new_value = genesyscloud_task_management_worktype_status.example_status_1.id + old_value = genesyscloud_task_management_worktype_status.example_status_2.id + } +} diff --git a/examples/resources/genesyscloud_task_management_worktype_flow_oncreate_rule/apis.md b/examples/resources/genesyscloud_task_management_worktype_flow_oncreate_rule/apis.md new file mode 100644 index 000000000..ae3ee38a0 --- /dev/null +++ b/examples/resources/genesyscloud_task_management_worktype_flow_oncreate_rule/apis.md @@ -0,0 +1,6 @@ +* [GET /api/v2/taskmanagement/worktypes/{worktypeId}/flows/oncreate/rules](https://developer.genesys.cloud/devapps/api-explorer#get-api-v2-taskmanagement-worktypes--worktypeId--flows-oncreate-rules) +* [POST /api/v2/taskmanagement/worktypes/{worktypeId}/flows/oncreate/rules](https://developer.genesys.cloud/devapps/api-explorer#post-api-v2-taskmanagement-worktypes--worktypeId--flows-oncreate-rules) +* [GET /api/v2/taskmanagement/worktypes/{worktypeId}/flows/oncreate/rules/{ruleId}](https://developer.genesys.cloud/devapps/api-explorer#get-api-v2-taskmanagement-worktypes--worktypeId--flows-oncreate-rules--ruleId-) +* [PATCH /api/v2/taskmanagement/worktypes/{worktypeId}/flows/oncreate/rules/{ruleId}](https://developer.genesys.cloud/devapps/api-explorer#patch-api-v2-taskmanagement-worktypes--worktypeId--flows-oncreate-rules--ruleId-) +* [DELETE /api/v2/taskmanagement/worktypes/{worktypeId}/flows/oncreate/rules/{ruleId}](https://developer.genesys.cloud/devapps/api-explorer#delete-api-v2-taskmanagement-worktypes--worktypeId--flows-oncreate-rules--ruleId-) + diff --git a/examples/resources/genesyscloud_task_management_worktype_flow_oncreate_rule/resource.tf b/examples/resources/genesyscloud_task_management_worktype_flow_oncreate_rule/resource.tf new file mode 100644 index 000000000..9da3d5f44 --- /dev/null +++ b/examples/resources/genesyscloud_task_management_worktype_flow_oncreate_rule/resource.tf @@ -0,0 +1,4 @@ +resource "genesyscloud_task_management_worktype_flow_oncreate_rule" "oncreate_rule" { + worktype_id = genesyscloud_task_management_worktype.example.id + name = "OnCreate Rule" +} diff --git a/genesyscloud/task_management_workitem/data_source_genesyscloud_task_management_workitem_test.go b/genesyscloud/task_management_workitem/data_source_genesyscloud_task_management_workitem_test.go index 144dee842..68c666441 100644 --- a/genesyscloud/task_management_workitem/data_source_genesyscloud_task_management_workitem_test.go +++ b/genesyscloud/task_management_workitem/data_source_genesyscloud_task_management_workitem_test.go @@ -68,7 +68,6 @@ func TestAccDataSourceTaskManagementWorkitem(t *testing.T) { wtName, wtDescription, fmt.Sprintf("genesyscloud_task_management_workbin.%s.id", wbResourceLabel), - fmt.Sprintf("genesyscloud_task_management_workitem_schema.%s.id", wsResourceLabel), "", ) + worktypeStatus.GenerateWorktypeStatusResource( diff --git a/genesyscloud/task_management_workitem/resource_genesyscloud_task_management_workitem_test.go b/genesyscloud/task_management_workitem/resource_genesyscloud_task_management_workitem_test.go index 243f8841b..5578dac98 100644 --- a/genesyscloud/task_management_workitem/resource_genesyscloud_task_management_workitem_test.go +++ b/genesyscloud/task_management_workitem/resource_genesyscloud_task_management_workitem_test.go @@ -166,7 +166,6 @@ func TestAccResourceTaskManagementWorkitem(t *testing.T) { wtName, wtDescription, fmt.Sprintf("genesyscloud_task_management_workbin.%s.id", wbResourceLabel), - fmt.Sprintf("genesyscloud_task_management_workitem_schema.%s.id", wsResourceLabel), "", ) + worktypeStatus.GenerateWorktypeStatusResource( @@ -496,8 +495,7 @@ func TestAccResourceTaskManagementWorkitemCustomFields(t *testing.T) { wtName, wtDescription, fmt.Sprintf("genesyscloud_task_management_workbin.%s.id", wbResourceLabel), - fmt.Sprintf("genesyscloud_task_management_workitem_schema.%s.id", wsResourceLabel), - "", + "schema_id = "+fmt.Sprintf("genesyscloud_task_management_workitem_schema.%s.id", wsResourceLabel), ) + worktypeStatus.GenerateWorktypeStatusResource( statusResourceLabelOpen, diff --git a/genesyscloud/task_management_worktype/data_source_genesyscloud_task_management_worktype_test.go b/genesyscloud/task_management_worktype/data_source_genesyscloud_task_management_worktype_test.go index fa1e61062..7784c8ed7 100644 --- a/genesyscloud/task_management_worktype/data_source_genesyscloud_task_management_worktype_test.go +++ b/genesyscloud/task_management_worktype/data_source_genesyscloud_task_management_worktype_test.go @@ -36,7 +36,6 @@ func TestAccDataSourceTaskManagementWorktype(t *testing.T) { name: "tf_worktype_" + uuid.NewString(), description: "worktype created for CX as Code test case", defaultWorkbinId: fmt.Sprintf("genesyscloud_task_management_workbin.%s.id", wbResourceLabel), - schemaId: fmt.Sprintf("genesyscloud_task_management_workitem_schema.%s.id", wsResourceLabel), } dataSourceLabel = "data_worktype_1" @@ -49,7 +48,7 @@ func TestAccDataSourceTaskManagementWorktype(t *testing.T) { { Config: workbin.GenerateWorkbinResource(wbResourceLabel, wbName, wbDescription, util.NullValue) + workitemSchema.GenerateWorkitemSchemaResourceBasic(wsResourceLabel, wsName, wsDescription) + - GenerateWorktypeResourceBasic(wtRes.resourceLabel, wtRes.name, wtRes.description, wtRes.defaultWorkbinId, wtRes.schemaId, "") + + GenerateWorktypeResourceBasic(wtRes.resourceLabel, wtRes.name, wtRes.description, wtRes.defaultWorkbinId, "") + generateWorktypeDataSource(dataSourceLabel, wtRes.name, ResourceType+"."+wtRes.resourceLabel), Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttrPair("data."+ResourceType+"."+dataSourceLabel, "id", ResourceType+"."+wtRes.resourceLabel, "id"), diff --git a/genesyscloud/task_management_worktype/resource_genesyscloud_task_management_worktype_schema.go b/genesyscloud/task_management_worktype/resource_genesyscloud_task_management_worktype_schema.go index fd033e196..ec0286606 100644 --- a/genesyscloud/task_management_worktype/resource_genesyscloud_task_management_worktype_schema.go +++ b/genesyscloud/task_management_worktype/resource_genesyscloud_task_management_worktype_schema.go @@ -116,7 +116,7 @@ func ResourceTaskManagementWorktype() *schema.Resource { }, `schema_id`: { Description: `Id of the workitem schema.`, - Required: true, + Optional: true, Type: schema.TypeString, }, `schema_version`: { diff --git a/genesyscloud/task_management_worktype/resource_genesyscloud_task_management_worktype_test.go b/genesyscloud/task_management_worktype/resource_genesyscloud_task_management_worktype_test.go index ab3b45e37..c70553e32 100644 --- a/genesyscloud/task_management_worktype/resource_genesyscloud_task_management_worktype_test.go +++ b/genesyscloud/task_management_worktype/resource_genesyscloud_task_management_worktype_test.go @@ -91,12 +91,11 @@ func TestAccResourceTaskManagementWorktype(t *testing.T) { { Config: workbin.GenerateWorkbinResource(wbResourceLabel, wbName, wbDescription, util.NullValue) + workitemSchema.GenerateWorkitemSchemaResourceBasic(wsResourceLabel, wsName, wsDescription) + - GenerateWorktypeResourceBasic(wtRes.resourceLabel, wtRes.name, wtRes.description, wtRes.defaultWorkbinId, wtRes.schemaId, ""), + GenerateWorktypeResourceBasic(wtRes.resourceLabel, wtRes.name, wtRes.description, wtRes.defaultWorkbinId, ""), Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttr(ResourceType+"."+wtRes.resourceLabel, "name", wtRes.name), resource.TestCheckResourceAttr(ResourceType+"."+wtRes.resourceLabel, "description", wtRes.description), resource.TestCheckResourceAttrPair(ResourceType+"."+wtRes.resourceLabel, "default_workbin_id", fmt.Sprintf("genesyscloud_task_management_workbin.%s", wbResourceLabel), "id"), - resource.TestCheckResourceAttrPair(ResourceType+"."+wtRes.resourceLabel, "schema_id", fmt.Sprintf("genesyscloud_task_management_workitem_schema.%s", wsResourceLabel), "id"), ), }, // All optional properties update diff --git a/genesyscloud/task_management_worktype/resource_genesyscloud_task_management_worktype_utils.go b/genesyscloud/task_management_worktype/resource_genesyscloud_task_management_worktype_utils.go index d0f6d4782..f989efefc 100644 --- a/genesyscloud/task_management_worktype/resource_genesyscloud_task_management_worktype_utils.go +++ b/genesyscloud/task_management_worktype/resource_genesyscloud_task_management_worktype_utils.go @@ -44,7 +44,7 @@ func getWorktypecreateFromResourceData(d *schema.ResourceData) platformclientv2. Description: platformclientv2.String(d.Get("description").(string)), DisableDefaultStatusCreation: platformclientv2.Bool(false), DefaultWorkbinId: platformclientv2.String(d.Get("default_workbin_id").(string)), - SchemaId: platformclientv2.String(d.Get("schema_id").(string)), + SchemaId: resourcedata.GetNillableValue[string](d, "schema_id"), SchemaVersion: resourcedata.GetNillableValue[int](d, "schema_version"), DefaultPriority: platformclientv2.Int(d.Get("default_priority").(int)), @@ -133,13 +133,12 @@ func flattenRoutingSkillReferences(routingSkillReferences *[]platformclientv2.Ro } // GenerateWorktypeResourceBasic generates a terraform config string for a basic worktype -func GenerateWorktypeResourceBasic(resourceLabel, name, description, workbinResourceId, schemaResourceId, attrs string) string { +func GenerateWorktypeResourceBasic(resourceLabel, name, description, workbinResourceId, attrs string) string { return fmt.Sprintf(`resource "%s" "%s" { name = "%s" description = "%s" default_workbin_id = %s - schema_id = %s %s } - `, ResourceType, resourceLabel, name, description, workbinResourceId, schemaResourceId, attrs) + `, ResourceType, resourceLabel, name, description, workbinResourceId, attrs) } diff --git a/genesyscloud/task_management_worktype_flow_datebased_rule/data_source_genesyscloud_task_management_datebased_rule.go b/genesyscloud/task_management_worktype_flow_datebased_rule/data_source_genesyscloud_task_management_datebased_rule.go new file mode 100644 index 000000000..f3b8ee6e0 --- /dev/null +++ b/genesyscloud/task_management_worktype_flow_datebased_rule/data_source_genesyscloud_task_management_datebased_rule.go @@ -0,0 +1,43 @@ +package task_management_worktype_flow_datebased_rule + +import ( + "context" + "fmt" + "terraform-provider-genesyscloud/genesyscloud/provider" + "terraform-provider-genesyscloud/genesyscloud/util" + "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" +) + +/* + The data_source_genesyscloud_task_management_datebased_rule.go contains the data source implementation + for the resource. +*/ + +// dataSourceTaskManagementDateBasedRuleRead retrieves by name the id in question +func dataSourceTaskManagementDateBasedRuleRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + sdkConfig := meta.(*provider.ProviderMeta).ClientConfig + proxy := getTaskManagementDateBasedRuleProxy(sdkConfig) + + name := d.Get("name").(string) + typeId := d.Get("worktype_id").(string) + + return util.WithRetries(ctx, 15*time.Second, func() *retry.RetryError { + dateBasedRuleId, retryable, resp, err := proxy.getTaskManagementDateBasedRuleIdByName(ctx, typeId, name) + + if err != nil { + if retryable { + return retry.RetryableError(util.BuildWithRetriesApiDiagnosticError(ResourceType, fmt.Sprintf("no task management datebased rule found with name %s", name), resp)) + } else { + return retry.NonRetryableError(util.BuildWithRetriesApiDiagnosticError(ResourceType, fmt.Sprintf("error searching task management datebased rule %s | error: %s", name, err), resp)) + } + } + + d.SetId(dateBasedRuleId) + return nil + }) +} diff --git a/genesyscloud/task_management_worktype_flow_datebased_rule/data_source_genesyscloud_task_management_datebased_rule_test.go b/genesyscloud/task_management_worktype_flow_datebased_rule/data_source_genesyscloud_task_management_datebased_rule_test.go new file mode 100644 index 000000000..a810de2da --- /dev/null +++ b/genesyscloud/task_management_worktype_flow_datebased_rule/data_source_genesyscloud_task_management_datebased_rule_test.go @@ -0,0 +1,91 @@ +package task_management_worktype_flow_datebased_rule + +import ( + "fmt" + "terraform-provider-genesyscloud/genesyscloud/provider" + workbin "terraform-provider-genesyscloud/genesyscloud/task_management_workbin" + workType "terraform-provider-genesyscloud/genesyscloud/task_management_worktype" + "terraform-provider-genesyscloud/genesyscloud/util" + "testing" + + "github.com/google/uuid" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" +) + +/* +Test Class for the task management datebased rule Data Source +*/ + +func TestAccDataSourceTaskManagementDateBasedRule(t *testing.T) { + t.Parallel() + var ( + // Workbin + wbResourceLabel = "workbin_1" + wbName = "wb_" + uuid.NewString() + wbDescription = "workbin created for CX as Code test case" + + // Worktype + wtResourceLabel = "worktype_1" + wtName = "wt_" + uuid.NewString() + wtDescription = "test worktype description" + + // DateBased Rule Resource + dateBasedRuleResourceLabel = "datebased_rule_resource" + dateBasedRuleName = "datebased-" + uuid.NewString() + dateBasedRuleAttribute = "dateDue" + relativeMinutesToInvocation = 30 + + // DateBased Data Source + dateBasedRuleDataSourceLabel = "datebased_rule_data" + ) + + resource.Test(t, resource.TestCase{ + PreCheck: func() { util.TestAccPreCheck(t) }, + ProviderFactories: provider.GetProviderFactories(providerResources, providerDataSources), + Steps: []resource.TestStep{ + { + Config: workbin.GenerateWorkbinResource(wbResourceLabel, wbName, wbDescription, util.NullValue) + + workType.GenerateWorktypeResourceBasic( + wtResourceLabel, + wtName, + wtDescription, + fmt.Sprintf("genesyscloud_task_management_workbin.%s.id", wbResourceLabel), + "", + ) + + GenerateDateBasedRuleResource( + dateBasedRuleResourceLabel, + fmt.Sprintf("genesyscloud_task_management_worktype.%s.id", wtResourceLabel), + dateBasedRuleName, + dateBasedRuleAttribute, + relativeMinutesToInvocation, + ) + + generateDateBasedRuleDataSource( + dateBasedRuleDataSourceLabel, + fmt.Sprintf("genesyscloud_task_management_worktype.%s.id", wtResourceLabel), + dateBasedRuleName, + ResourceType+"."+dateBasedRuleResourceLabel, + ), + Check: resource.ComposeTestCheckFunc( + validateRuleIds( + "data."+ResourceType+"."+dateBasedRuleDataSourceLabel, "id", ResourceType+"."+dateBasedRuleResourceLabel, "id", + ), + ), + }, + { + ResourceName: ResourceType + "." + dateBasedRuleResourceLabel, + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +func generateDateBasedRuleDataSource(dataSourceLabel string, worktypeId string, name string, dependsOnResource string) string { + return fmt.Sprintf(`data "%s" "%s" { + worktype_id = %s + name = "%s" + depends_on=[%s] + } + `, ResourceType, dataSourceLabel, worktypeId, name, dependsOnResource) +} diff --git a/genesyscloud/task_management_worktype_flow_datebased_rule/genesyscloud_task_management_datebased_rule_init_test.go b/genesyscloud/task_management_worktype_flow_datebased_rule/genesyscloud_task_management_datebased_rule_init_test.go new file mode 100644 index 000000000..ffbf57c2a --- /dev/null +++ b/genesyscloud/task_management_worktype_flow_datebased_rule/genesyscloud_task_management_datebased_rule_init_test.go @@ -0,0 +1,64 @@ +package task_management_worktype_flow_datebased_rule + +import ( + "sync" + workbin "terraform-provider-genesyscloud/genesyscloud/task_management_workbin" + worktype "terraform-provider-genesyscloud/genesyscloud/task_management_worktype" + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +/* + The genesyscloud_task_management_datebased_rule_init_test.go file is used to initialize the data sources and resources + used in testing the task_management_worktype_flow_datebased_rule 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[ResourceType] = ResourceTaskManagementDateBasedRule() + providerResources[worktype.ResourceType] = worktype.ResourceTaskManagementWorktype() + providerResources[workbin.ResourceType] = workbin.ResourceTaskManagementWorkbin() +} + +// registerTestDataSources registers all data sources used in the tests. +func (r *registerTestInstance) registerTestDataSources() { + r.datasourceMapMutex.Lock() + defer r.datasourceMapMutex.Unlock() + + providerDataSources[ResourceType] = DataSourceTaskManagementDateBasedRule() +} + +// initTestResources initializes all test resources and data sources. +func initTestResources() { + providerDataSources = make(map[string]*schema.Resource) + providerResources = make(map[string]*schema.Resource) + + regInstance := ®isterTestInstance{} + + 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 task_management_worktype_flow_datebased_rule package + initTestResources() + + // Run the test suite for the task_management_datebased_rule package + m.Run() +} diff --git a/genesyscloud/task_management_worktype_flow_datebased_rule/genesyscloud_task_management_datebased_rule_proxy.go b/genesyscloud/task_management_worktype_flow_datebased_rule/genesyscloud_task_management_datebased_rule_proxy.go new file mode 100644 index 000000000..308d6de2c --- /dev/null +++ b/genesyscloud/task_management_worktype_flow_datebased_rule/genesyscloud_task_management_datebased_rule_proxy.go @@ -0,0 +1,187 @@ +package task_management_worktype_flow_datebased_rule + +import ( + "context" + "fmt" + rc "terraform-provider-genesyscloud/genesyscloud/resource_cache" + taskManagementWorktype "terraform-provider-genesyscloud/genesyscloud/task_management_worktype" + + "github.com/mypurecloud/platform-client-sdk-go/v150/platformclientv2" +) + +/* +The genesyscloud_task_management_datebased_rule_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 *taskManagementDateBasedRuleProxy + +// Type definitions for each func on our proxy so we can easily mock them out later +type createTaskManagementDateBasedRuleFunc func(ctx context.Context, p *taskManagementDateBasedRuleProxy, worktypeId string, dateBasedRuleCreate *platformclientv2.Workitemdatebasedrulecreate) (*platformclientv2.Workitemdatebasedrule, *platformclientv2.APIResponse, error) +type getAllTaskManagementDateBasedRuleFunc func(ctx context.Context, p *taskManagementDateBasedRuleProxy, worktypeId string) (*[]platformclientv2.Workitemdatebasedrule, *platformclientv2.APIResponse, error) +type getTaskManagementDateBasedRuleIdByNameFunc func(ctx context.Context, p *taskManagementDateBasedRuleProxy, worktypeId string, name string) (id string, retryable bool, resp *platformclientv2.APIResponse, err error) +type getTaskManagementDateBasedRuleByIdFunc func(ctx context.Context, p *taskManagementDateBasedRuleProxy, worktypeId string, id string) (worktype *platformclientv2.Workitemdatebasedrule, response *platformclientv2.APIResponse, err error) +type updateTaskManagementDateBasedRuleFunc func(ctx context.Context, p *taskManagementDateBasedRuleProxy, worktypeId string, id string, dateBasedRuleUpdate *platformclientv2.Workitemdatebasedruleupdate) (*platformclientv2.Workitemdatebasedrule, *platformclientv2.APIResponse, error) +type deleteTaskManagementDateBasedRuleFunc func(ctx context.Context, p *taskManagementDateBasedRuleProxy, worktypeId string, id string) (response *platformclientv2.APIResponse, err error) + +// taskManagementDateBasedRuleProxy contains all the methods that call genesys cloud APIs. +type taskManagementDateBasedRuleProxy struct { + clientConfig *platformclientv2.Configuration + taskManagementApi *platformclientv2.TaskManagementApi + worktypeProxy *taskManagementWorktype.TaskManagementWorktypeProxy + createTaskManagementDateBasedRuleAttr createTaskManagementDateBasedRuleFunc + getAllTaskManagementDateBasedRuleAttr getAllTaskManagementDateBasedRuleFunc + getTaskManagementDateBasedRuleIdByNameAttr getTaskManagementDateBasedRuleIdByNameFunc + getTaskManagementDateBasedRuleByIdAttr getTaskManagementDateBasedRuleByIdFunc + updateTaskManagementDateBasedRuleAttr updateTaskManagementDateBasedRuleFunc + deleteTaskManagementDateBasedRuleAttr deleteTaskManagementDateBasedRuleFunc + dateBasedRuleCache rc.CacheInterface[platformclientv2.Workitemdatebasedrule] +} + +// newTaskManagementDateBasedRuleProxy initializes the task management worktype proxy with all the data needed to communicate with Genesys Cloud +func newTaskManagementDateBasedRuleProxy(clientConfig *platformclientv2.Configuration) *taskManagementDateBasedRuleProxy { + api := platformclientv2.NewTaskManagementApiWithConfig(clientConfig) + dateBasedRuleCache := rc.NewResourceCache[platformclientv2.Workitemdatebasedrule]() + taskmanagementProxy := taskManagementWorktype.GetTaskManagementWorktypeProxy(clientConfig) + return &taskManagementDateBasedRuleProxy{ + clientConfig: clientConfig, + taskManagementApi: api, + worktypeProxy: taskmanagementProxy, + createTaskManagementDateBasedRuleAttr: createTaskManagementDateBasedRuleFn, + getAllTaskManagementDateBasedRuleAttr: getAllTaskManagementDateBasedRuleFn, + getTaskManagementDateBasedRuleIdByNameAttr: getTaskManagementDateBasedRuleIdByNameFn, + getTaskManagementDateBasedRuleByIdAttr: getTaskManagementDateBasedRuleByIdFn, + updateTaskManagementDateBasedRuleAttr: updateTaskManagementDateBasedRuleFn, + deleteTaskManagementDateBasedRuleAttr: deleteTaskManagementDateBasedRuleFn, + dateBasedRuleCache: dateBasedRuleCache, + } +} + +// getTaskManagementDateBasedRuleProxy 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 getTaskManagementDateBasedRuleProxy(clientConfig *platformclientv2.Configuration) *taskManagementDateBasedRuleProxy { + if internalProxy == nil { + internalProxy = newTaskManagementDateBasedRuleProxy(clientConfig) + } + return internalProxy +} + +// createTaskManagementDateBasedRule creates a Genesys Cloud task management datebased rule +func (p *taskManagementDateBasedRuleProxy) createTaskManagementDateBasedRule(ctx context.Context, worktypeId string, dateBasedRuleCreate *platformclientv2.Workitemdatebasedrulecreate) (*platformclientv2.Workitemdatebasedrule, *platformclientv2.APIResponse, error) { + return p.createTaskManagementDateBasedRuleAttr(ctx, p, worktypeId, dateBasedRuleCreate) +} + +// GetAllTaskManagementDateBasedRule retrieves all Genesys Cloud task management datebased rule +func (p *taskManagementDateBasedRuleProxy) getAllTaskManagementDateBasedRule(ctx context.Context, worktypeId string) (*[]platformclientv2.Workitemdatebasedrule, *platformclientv2.APIResponse, error) { + return p.getAllTaskManagementDateBasedRuleAttr(ctx, p, worktypeId) +} + +// getTaskManagementDateBasedRuleIdByName returns a single Genesys Cloud task management datebased rule by a name +func (p *taskManagementDateBasedRuleProxy) getTaskManagementDateBasedRuleIdByName(ctx context.Context, worktypeId string, name string) (id string, retryable bool, resp *platformclientv2.APIResponse, err error) { + return p.getTaskManagementDateBasedRuleIdByNameAttr(ctx, p, worktypeId, name) +} + +// GetTaskManagementDateBasedRuleById returns a single Genesys Cloud task management datebased rule by Id +func (p *taskManagementDateBasedRuleProxy) getTaskManagementDateBasedRuleById(ctx context.Context, worktypeId string, id string) (taskManagementDateBasedRule *platformclientv2.Workitemdatebasedrule, resp *platformclientv2.APIResponse, err error) { + return p.getTaskManagementDateBasedRuleByIdAttr(ctx, p, worktypeId, id) +} + +// UpdateTaskManagementDateBasedRule updates a Genesys Cloud task management datebased rule +func (p *taskManagementDateBasedRuleProxy) updateTaskManagementDateBasedRule(ctx context.Context, worktypeId string, id string, dateBasedRuleUpdate *platformclientv2.Workitemdatebasedruleupdate) (*platformclientv2.Workitemdatebasedrule, *platformclientv2.APIResponse, error) { + return p.updateTaskManagementDateBasedRuleAttr(ctx, p, worktypeId, id, dateBasedRuleUpdate) +} + +// deleteTaskManagementDateBasedRule deletes a Genesys Cloud task management datebased rule by Id +func (p *taskManagementDateBasedRuleProxy) deleteTaskManagementDateBasedRule(ctx context.Context, worktypeId string, id string) (resp *platformclientv2.APIResponse, err error) { + return p.deleteTaskManagementDateBasedRuleAttr(ctx, p, worktypeId, id) +} + +// createTaskManagementDateBasedRuleFn is an implementation function for creating a Genesys Cloud task management datebased rule +func createTaskManagementDateBasedRuleFn(ctx context.Context, p *taskManagementDateBasedRuleProxy, worktypeId string, dateBasedRuleCreate *platformclientv2.Workitemdatebasedrulecreate) (*platformclientv2.Workitemdatebasedrule, *platformclientv2.APIResponse, error) { + return p.taskManagementApi.PostTaskmanagementWorktypeFlowsDatebasedRules(worktypeId, *dateBasedRuleCreate) +} + +// getAllTaskManagementDateBasedRuleFn is the implementation for retrieving all task management datebased rules in Genesys Cloud +func getAllTaskManagementDateBasedRuleFn(ctx context.Context, p *taskManagementDateBasedRuleProxy, worktypeId string) (*[]platformclientv2.Workitemdatebasedrule, *platformclientv2.APIResponse, error) { + const pageSize = 200 + var ( + allDateBasedRules []platformclientv2.Workitemdatebasedrule + after = "" + response *platformclientv2.APIResponse + ) + for { + dateBasedRules, resp, err := p.taskManagementApi.GetTaskmanagementWorktypeFlowsDatebasedRules(worktypeId, after, pageSize) + response = resp + if err != nil { + return nil, resp, fmt.Errorf("failed to get datebased rules: %v", err) + } + if dateBasedRules.Entities != nil && len(*dateBasedRules.Entities) > 0 { + allDateBasedRules = append(allDateBasedRules, *dateBasedRules.Entities...) + } + + // Exit loop if there are no more 'pages' + if dateBasedRules.After == nil || *dateBasedRules.After == "" { + break + } + after = *dateBasedRules.After + } + return &allDateBasedRules, response, nil +} + +// getTaskManagementDateBasedRuleIdByNameFn is an implementation of the function to get a Genesys Cloud task management datebased rule by name +func getTaskManagementDateBasedRuleIdByNameFn(ctx context.Context, p *taskManagementDateBasedRuleProxy, worktypeId string, name string) (id string, retryable bool, resp *platformclientv2.APIResponse, err error) { + const pageSize = 200 + var ( + after = "" + response *platformclientv2.APIResponse + ) + for { + dateBasedRules, resp, err := p.taskManagementApi.GetTaskmanagementWorktypeFlowsDatebasedRules(worktypeId, after, pageSize) + response = resp + if err != nil { + return "", false, resp, fmt.Errorf("failed to get datebased rules: %v", err) + } + + if dateBasedRules.Entities != nil && len(*dateBasedRules.Entities) > 0 { + for i := 0; i < len(*dateBasedRules.Entities); i++ { + dateBasedRule := (*dateBasedRules.Entities)[i] + if *dateBasedRule.Name == name { + return *dateBasedRule.Id, false, resp, nil + } + } + } + + // Exit loop if there are no more 'pages' + if dateBasedRules.After == nil || *dateBasedRules.After == "" { + break + } + after = *dateBasedRules.After + } + return "", true, response, fmt.Errorf("no task management datebased rules found with name %s", name) +} + +// getTaskManagementDateBasedRuleByIdFn is an implementation of the function to get a Genesys Cloud task management datebased rule by Id +func getTaskManagementDateBasedRuleByIdFn(ctx context.Context, p *taskManagementDateBasedRuleProxy, worktypeId string, id string) (taskManagementDateBasedRule *platformclientv2.Workitemdatebasedrule, resp *platformclientv2.APIResponse, err error) { + dateBasedRule := rc.GetCacheItem(p.dateBasedRuleCache, id) + if dateBasedRule != nil { + return dateBasedRule, nil, nil + } + + return p.taskManagementApi.GetTaskmanagementWorktypeFlowsDatebasedRule(worktypeId, id) +} + +// updateTaskManagementDateBasedRuleFn is an implementation of the function to update a Genesys Cloud task management datebased rule +func updateTaskManagementDateBasedRuleFn(ctx context.Context, p *taskManagementDateBasedRuleProxy, worktypeId string, id string, dateBasedRuleUpdate *platformclientv2.Workitemdatebasedruleupdate) (*platformclientv2.Workitemdatebasedrule, *platformclientv2.APIResponse, error) { + return p.taskManagementApi.PatchTaskmanagementWorktypeFlowsDatebasedRule(worktypeId, id, *dateBasedRuleUpdate) +} + +// deleteTaskManagementDateBasedRuleFn is an implementation function for deleting a Genesys Cloud task management datebased rule +func deleteTaskManagementDateBasedRuleFn(ctx context.Context, p *taskManagementDateBasedRuleProxy, worktypeId string, id string) (resp *platformclientv2.APIResponse, err error) { + resp, err = p.taskManagementApi.DeleteTaskmanagementWorktypeFlowsDatebasedRule(worktypeId, id) + if err == nil { + rc.DeleteCacheItem(p.dateBasedRuleCache, id) + } + return resp, err +} diff --git a/genesyscloud/task_management_worktype_flow_datebased_rule/resource_genesyscloud_task_management_datebased_rule.go b/genesyscloud/task_management_worktype_flow_datebased_rule/resource_genesyscloud_task_management_datebased_rule.go new file mode 100644 index 000000000..d6163f595 --- /dev/null +++ b/genesyscloud/task_management_worktype_flow_datebased_rule/resource_genesyscloud_task_management_datebased_rule.go @@ -0,0 +1,147 @@ +package task_management_worktype_flow_datebased_rule + +import ( + "context" + "fmt" + "log" + "terraform-provider-genesyscloud/genesyscloud/provider" + resourceExporter "terraform-provider-genesyscloud/genesyscloud/resource_exporter" + "terraform-provider-genesyscloud/genesyscloud/util" + "terraform-provider-genesyscloud/genesyscloud/util/constants" + "time" + + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/mypurecloud/platform-client-sdk-go/v150/platformclientv2" + + "terraform-provider-genesyscloud/genesyscloud/consistency_checker" + + "terraform-provider-genesyscloud/genesyscloud/util/resourcedata" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/retry" +) + +/* +The resource_genesyscloud_task_management_datebased_rule.go contains all of the methods that perform the core logic for a resource. +*/ + +// getAllAuthTaskManagementDateBasedRule retrieves all of the task management datebased Rules via Terraform in the Genesys Cloud and is used for the exporter +func getAllAuthTaskManagementDateBasedRule(ctx context.Context, clientConfig *platformclientv2.Configuration) (resourceExporter.ResourceIDMetaMap, diag.Diagnostics) { + proxy := getTaskManagementDateBasedRuleProxy(clientConfig) + resources := make(resourceExporter.ResourceIDMetaMap) + + worktypes, resp, err := proxy.worktypeProxy.GetAllTaskManagementWorktype(ctx) + if err != nil { + return nil, util.BuildAPIDiagnosticError(ResourceType, fmt.Sprintf("Failed to get task management worktypes: %v", err), resp) + } + if worktypes == nil { + return resources, nil + } + + for _, worktype := range *worktypes { + dateBasedRules, resp, err := proxy.getAllTaskManagementDateBasedRule(ctx, *worktype.Id) + if err != nil { + return nil, util.BuildAPIDiagnosticError(ResourceType, fmt.Sprintf("Failed to get task management datebased rules error: %s", err), resp) + } + if dateBasedRules == nil { + continue + } + + for _, dateBasedRule := range *dateBasedRules { + resources[composeWorktypeBasedTerraformId(*worktype.Id, *dateBasedRule.Id)] = &resourceExporter.ResourceMeta{BlockLabel: *dateBasedRule.Name} + } + } + return resources, nil +} + +// createTaskManagementDateBasedRule is used by the task_management_worktype_flow_datebased_rule resource to create Genesys cloud task management datebased rule +func createTaskManagementDateBasedRule(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + sdkConfig := meta.(*provider.ProviderMeta).ClientConfig + proxy := getTaskManagementDateBasedRuleProxy(sdkConfig) + + worktypeId := d.Get("worktype_id").(string) + dateBasedRuleCreate := getWorkitemdatebasedrulecreateFromResourceData(d) + + log.Printf("Creating task management datebased rule %s for worktype %s", *dateBasedRuleCreate.Name, worktypeId) + dateBasedRule, resp, err := proxy.createTaskManagementDateBasedRule(ctx, worktypeId, &dateBasedRuleCreate) + if err != nil { + return util.BuildAPIDiagnosticError(ResourceType, fmt.Sprintf("Failed to create task management datebased rule %s error: %s", *dateBasedRuleCreate.Name, err), resp) + } + log.Printf("Created the base task management datebased rule %s for worktype %s", *dateBasedRule.Id, worktypeId) + + d.SetId(composeWorktypeBasedTerraformId(worktypeId, *dateBasedRule.Id)) + + return readTaskManagementDateBasedRule(ctx, d, meta) +} + +// readTaskManagementDateBasedRule is used by the task_management_worktype_flow_datebased_rule resource to read a task management datebased rule from genesys cloud +func readTaskManagementDateBasedRule(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + sdkConfig := meta.(*provider.ProviderMeta).ClientConfig + proxy := getTaskManagementDateBasedRuleProxy(sdkConfig) + cc := consistency_checker.NewConsistencyCheck(ctx, d, meta, ResourceTaskManagementDateBasedRule(), constants.ConsistencyChecks(), ResourceType) + + worktypeId, id := splitWorktypeBasedTerraformId(d.Id()) + + log.Printf("Reading task management datebased rule %s for worktype %s", id, worktypeId) + return util.WithRetriesForRead(ctx, d, func() *retry.RetryError { + dateBasedRule, resp, getErr := proxy.getTaskManagementDateBasedRuleById(ctx, worktypeId, id) + if getErr != nil { + if util.IsStatus404(resp) { + return retry.RetryableError(util.BuildWithRetriesApiDiagnosticError(ResourceType, fmt.Sprintf("failed to read task management datebased rule %s for worktype %s | error: %s", id, worktypeId, getErr), resp)) + } + return retry.NonRetryableError(util.BuildWithRetriesApiDiagnosticError(ResourceType, fmt.Sprintf("failed to read task management datebased rule %s for worktype %s | error: %s", id, worktypeId, getErr), resp)) + } + + resourcedata.SetNillableValue(d, "name", dateBasedRule.Name) + resourcedata.SetNillableValue(d, "worktype_id", dateBasedRule.Worktype.Id) + resourcedata.SetNillableValueWithInterfaceArrayWithFunc(d, "condition", dateBasedRule, flattenSdkCondition) + + log.Printf("Read task management datebased rule %s for worktype %s", id, worktypeId) + return cc.CheckState(d) + }) +} + +// updateTaskManagementDateBasedRule is used by the task_management_worktype_flow_datebased_rule resource to update a task management datebased rule in Genesys Cloud +func updateTaskManagementDateBasedRule(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + sdkConfig := meta.(*provider.ProviderMeta).ClientConfig + proxy := getTaskManagementDateBasedRuleProxy(sdkConfig) + + dateBasedRuleUpdate := getWorkitemdatebasedruleupdateFromResourceData(d) + worktypeId, id := splitWorktypeBasedTerraformId(d.Id()) + + log.Printf("Updating datebased rule %s for worktype %s", id, worktypeId) + _, resp, err := proxy.updateTaskManagementDateBasedRule(ctx, worktypeId, id, &dateBasedRuleUpdate) + if err != nil { + return util.BuildAPIDiagnosticError(ResourceType, fmt.Sprintf("Failed to update task management datebased rule %s for worktype %s error: %s", id, worktypeId, err), resp) + } + + log.Printf("Updated datebased rule %s for worktype %s", id, worktypeId) + + return readTaskManagementDateBasedRule(ctx, d, meta) +} + +// deleteTaskManagementDateBasedRule is used by the task_management_worktype_flow_datebased_rule resource to delete a task management datebased rule from Genesys cloud +func deleteTaskManagementDateBasedRule(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + sdkConfig := meta.(*provider.ProviderMeta).ClientConfig + proxy := getTaskManagementDateBasedRuleProxy(sdkConfig) + + worktypeId, id := splitWorktypeBasedTerraformId(d.Id()) + + resp, err := proxy.deleteTaskManagementDateBasedRule(ctx, worktypeId, id) + if err != nil { + return util.BuildAPIDiagnosticError(ResourceType, fmt.Sprintf("Failed to delete task management datebased rule %s for worktype %s error: %s", id, worktypeId, err), resp) + } + + return util.WithRetries(ctx, 180*time.Second, func() *retry.RetryError { + _, resp, err := proxy.getTaskManagementDateBasedRuleById(ctx, worktypeId, id) + + if err != nil { + if util.IsStatus404(resp) { + log.Printf("Deleted task management datebased rule %s for worktype %s", id, worktypeId) + return nil + } + return retry.NonRetryableError(util.BuildWithRetriesApiDiagnosticError(ResourceType, fmt.Sprintf("error deleting task management datebased rule %s for worktype %s | error: %s", id, worktypeId, err), resp)) + } + return retry.RetryableError(util.BuildWithRetriesApiDiagnosticError(ResourceType, fmt.Sprintf("task management datebased rule %s still exists", id), resp)) + }) +} diff --git a/genesyscloud/task_management_worktype_flow_datebased_rule/resource_genesyscloud_task_management_datebased_rule_schema.go b/genesyscloud/task_management_worktype_flow_datebased_rule/resource_genesyscloud_task_management_datebased_rule_schema.go new file mode 100644 index 000000000..d960b4e48 --- /dev/null +++ b/genesyscloud/task_management_worktype_flow_datebased_rule/resource_genesyscloud_task_management_datebased_rule_schema.go @@ -0,0 +1,110 @@ +package task_management_worktype_flow_datebased_rule + +import ( + "terraform-provider-genesyscloud/genesyscloud/provider" + resourceExporter "terraform-provider-genesyscloud/genesyscloud/resource_exporter" + registrar "terraform-provider-genesyscloud/genesyscloud/resource_register" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +/* +resource_genesycloud_task_management_datebased_rule_schema.go holds four functions within it: + +1. The registration code that registers the Datasource, Resource and Exporter for the package. +2. The resource schema definitions for the task_management_worktype_flow_datebased_rule resource. +3. The datasource schema definitions for the task_management_worktype_flow_datebased_rule datasource. +4. The resource exporter configuration for the task_management_worktype_flow_datebased_rule exporter. +*/ +const ResourceType = "genesyscloud_task_management_worktype_flow_datebased_rule" + +// SetRegistrar registers all of the resources, datasources and exporters in the package +func SetRegistrar(regInstance registrar.Registrar) { + regInstance.RegisterResource(ResourceType, ResourceTaskManagementDateBasedRule()) + regInstance.RegisterDataSource(ResourceType, DataSourceTaskManagementDateBasedRule()) + regInstance.RegisterExporter(ResourceType, TaskManagementDateBasedRuleExporter()) +} + +// ResourceTaskManagementDateBasedRule registers the genesyscloud_task_management_worktype_flow_datebased_rule resource with Terraform +func ResourceTaskManagementDateBasedRule() *schema.Resource { + condition := &schema.Resource{ + Schema: map[string]*schema.Schema{ + `attribute`: { + Description: "The name of the workitem date attribute.", + Required: true, + Type: schema.TypeString, + }, + `relative_minutes_to_invocation`: { + Description: "The time in minutes before or after the date attribute.", + Required: true, + Type: schema.TypeInt, + }, + }, + } + + return &schema.Resource{ + Description: `Genesys Cloud task management onattributeChange Rule`, + + CreateContext: provider.CreateWithPooledClient(createTaskManagementDateBasedRule), + ReadContext: provider.ReadWithPooledClient(readTaskManagementDateBasedRule), + UpdateContext: provider.UpdateWithPooledClient(updateTaskManagementDateBasedRule), + DeleteContext: provider.DeleteWithPooledClient(deleteTaskManagementDateBasedRule), + Importer: &schema.ResourceImporter{ + StateContext: schema.ImportStatePassthroughContext, + }, + SchemaVersion: 1, + Schema: map[string]*schema.Schema{ + `name`: { + Description: `The name of the Rule.`, + Required: true, + Type: schema.TypeString, + }, + `worktype_id`: { + Description: `The Worktype ID of the Rule.`, + Required: true, + ForceNew: true, + Type: schema.TypeString, + }, + "condition": { + Description: "Condition for this Rule.", + Type: schema.TypeList, + Required: true, + MaxItems: 1, + Elem: condition, + }, + }, + } +} + +// TaskManagementDateBasedRuleExporter returns the resourceExporter object used to hold the genesyscloud_task_management_worktype_flow_datebased_rule exporter's config +func TaskManagementDateBasedRuleExporter() *resourceExporter.ResourceExporter { + return &resourceExporter.ResourceExporter{ + GetResourcesFunc: provider.GetAllWithPooledClient(getAllAuthTaskManagementDateBasedRule), + RefAttrs: map[string]*resourceExporter.RefAttrSettings{ + "worktype_id": {RefType: "genesyscloud_task_management_worktype"}, + }, + } +} + +// DataSourceTaskManagementDateBasedRule registers the genesyscloud_task_management_worktype_flow_datebased_rule data source +func DataSourceTaskManagementDateBasedRule() *schema.Resource { + return &schema.Resource{ + Description: `Genesys Cloud task management datebased rule data source. Select a task management datebased rule by name`, + ReadContext: provider.ReadWithPooledClient(dataSourceTaskManagementDateBasedRuleRead), + Importer: &schema.ResourceImporter{ + StateContext: schema.ImportStatePassthroughContext, + }, + Schema: map[string]*schema.Schema{ + `name`: { + Description: `The name of the Rule.`, + Required: true, + Type: schema.TypeString, + }, + `worktype_id`: { + Description: `The Worktype ID of the Rule.`, + Required: true, + Type: schema.TypeString, + }, + }, + } +} diff --git a/genesyscloud/task_management_worktype_flow_datebased_rule/resource_genesyscloud_task_management_datebased_rule_test.go b/genesyscloud/task_management_worktype_flow_datebased_rule/resource_genesyscloud_task_management_datebased_rule_test.go new file mode 100644 index 000000000..e9fbcc599 --- /dev/null +++ b/genesyscloud/task_management_worktype_flow_datebased_rule/resource_genesyscloud_task_management_datebased_rule_test.go @@ -0,0 +1,127 @@ +package task_management_worktype_flow_datebased_rule + +import ( + "fmt" + "terraform-provider-genesyscloud/genesyscloud/provider" + workbin "terraform-provider-genesyscloud/genesyscloud/task_management_workbin" + workType "terraform-provider-genesyscloud/genesyscloud/task_management_worktype" + "terraform-provider-genesyscloud/genesyscloud/util" + "testing" + + "github.com/google/uuid" + "github.com/mypurecloud/platform-client-sdk-go/v150/platformclientv2" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + + "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" +) + +/* +The resource_genesyscloud_task_management_datebased_rule_test.go contains all of the test cases for running the resource +tests for task_management_worktype_flow_datebased_rule. +*/ + +func TestAccResourceTaskManagementDateBasedRule(t *testing.T) { + t.Parallel() + var ( + // Workbin + wbResourceLabel = "workbin_1" + wbName = "wb_" + uuid.NewString() + wbDescription = "workbin created for CX as Code test case" + + // Worktype + wtResourceLabel = "worktype_1" + wtName = "wt_" + uuid.NewString() + wtDescription = "test worktype description" + + // DateBased Rule Resource + dateBasedRuleResourceLabel = "datebased_rule_resource" + dateBasedRuleName = "datebased-" + uuid.NewString() + dateBasedRuleName2 = "datebased2-" + uuid.NewString() + dateBasedRuleAttribute = "dateDue" + relativeMinutesToInvocation = 30 + relativeMinutesToInvocation2 = 60 + ) + + resource.Test(t, resource.TestCase{ + PreCheck: func() { util.TestAccPreCheck(t) }, + ProviderFactories: provider.GetProviderFactories(providerResources, providerDataSources), + Steps: []resource.TestStep{ + { + // Create worktype status + Config: workbin.GenerateWorkbinResource(wbResourceLabel, wbName, wbDescription, util.NullValue) + + workType.GenerateWorktypeResourceBasic( + wtResourceLabel, + wtName, + wtDescription, + fmt.Sprintf("genesyscloud_task_management_workbin.%s.id", wbResourceLabel), + "", + ) + + GenerateDateBasedRuleResource( + dateBasedRuleResourceLabel, + fmt.Sprintf("genesyscloud_task_management_worktype.%s.id", wtResourceLabel), + dateBasedRuleName, + dateBasedRuleAttribute, + relativeMinutesToInvocation, + ), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrPair(ResourceType+"."+dateBasedRuleResourceLabel, "worktype_id", fmt.Sprintf("genesyscloud_task_management_worktype.%s", wtResourceLabel), "id"), + resource.TestCheckResourceAttr(ResourceType+"."+dateBasedRuleResourceLabel, "name", dateBasedRuleName), + resource.TestCheckResourceAttr(ResourceType+"."+dateBasedRuleResourceLabel, "condition.0.attribute", dateBasedRuleAttribute), + resource.TestCheckResourceAttr(ResourceType+"."+dateBasedRuleResourceLabel, "condition.0.relative_minutes_to_invocation", fmt.Sprintf("%d", relativeMinutesToInvocation)), + ), + }, + { + // Update datebased rule + Config: workbin.GenerateWorkbinResource(wbResourceLabel, wbName, wbDescription, util.NullValue) + + workType.GenerateWorktypeResourceBasic( + wtResourceLabel, + wtName, + wtDescription, + fmt.Sprintf("genesyscloud_task_management_workbin.%s.id", wbResourceLabel), + "", + ) + + GenerateDateBasedRuleResource( + dateBasedRuleResourceLabel, + fmt.Sprintf("genesyscloud_task_management_worktype.%s.id", wtResourceLabel), + dateBasedRuleName2, + dateBasedRuleAttribute, + relativeMinutesToInvocation2, + ), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr(ResourceType+"."+dateBasedRuleResourceLabel, "name", dateBasedRuleName2), + resource.TestCheckResourceAttr(ResourceType+"."+dateBasedRuleResourceLabel, "condition.0.relative_minutes_to_invocation", fmt.Sprintf("%d", relativeMinutesToInvocation2)), + ), + }, + { + ResourceName: ResourceType + "." + dateBasedRuleResourceLabel, + ImportState: true, + ImportStateVerify: true, + }, + }, + CheckDestroy: testVerifyTaskManagementDateBasedRuleDestroyed, + }) +} + +func testVerifyTaskManagementDateBasedRuleDestroyed(state *terraform.State) error { + taskManagementApi := platformclientv2.NewTaskManagementApi() + for _, res := range state.RootModule().Resources { + if res.Type != ResourceType { + continue + } + + worktypeId, dateBasedRuleId := splitWorktypeBasedTerraformId(res.Primary.ID) + dateBasedRule, resp, err := taskManagementApi.GetTaskmanagementWorktypeFlowsDatebasedRule(worktypeId, dateBasedRuleId) + if dateBasedRule != nil { + return fmt.Errorf("task management datebased rule (%s) still exists", res.Primary.ID) + } else if util.IsStatus404(resp) { + // Worktype no found, as expected + continue + } else { + return fmt.Errorf("unexpected error: %s", err) + } + } + + // All datebased rules deleted + return nil +} diff --git a/genesyscloud/task_management_worktype_flow_datebased_rule/resource_genesyscloud_task_management_datebased_rule_utils.go b/genesyscloud/task_management_worktype_flow_datebased_rule/resource_genesyscloud_task_management_datebased_rule_utils.go new file mode 100644 index 000000000..3f931b9e1 --- /dev/null +++ b/genesyscloud/task_management_worktype_flow_datebased_rule/resource_genesyscloud_task_management_datebased_rule_utils.go @@ -0,0 +1,137 @@ +package task_management_worktype_flow_datebased_rule + +import ( + "fmt" + "log" + "strings" + "terraform-provider-genesyscloud/genesyscloud/util/resourcedata" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/mypurecloud/platform-client-sdk-go/v150/platformclientv2" +) + +/* +The resource_genesyscloud_task_management_datebased_rule_utils.go file contains various helper methods to marshal +and unmarshal data into formats consumable by Terraform and/or Genesys Cloud. +*/ + +func GenerateDateBasedRuleResource( + resourceLabel, + worktypeId, + name string, + attribute string, + relativeMinutesToInvocation int, +) string { + return fmt.Sprintf( + `resource "genesyscloud_task_management_worktype_flow_datebased_rule" "%s" { + worktype_id = %s + name = "%s" + condition { + attribute = "%s" + relative_minutes_to_invocation = %d + } + } + `, resourceLabel, worktypeId, name, attribute, relativeMinutesToInvocation) +} + +// getWorkitemdatebasedrulecreateFromResourceData maps data from schema ResourceData object to a platformclientv2.Workitemdatebasedrulecreate +func getWorkitemdatebasedrulecreateFromResourceData(d *schema.ResourceData) platformclientv2.Workitemdatebasedrulecreate { + condition := d.Get("condition").([]interface{}) + conditionMap := condition[0].(map[string]interface{}) + attribute := conditionMap["attribute"].(string) + relativeMinutesToInvocation := conditionMap["relative_minutes_to_invocation"].(int) + + ruleCondition := platformclientv2.Workitemdatebasedcondition{} + ruleCondition.SetField("Attribute", platformclientv2.String(attribute)) + ruleCondition.SetField("RelativeMinutesToInvocation", platformclientv2.Int(relativeMinutesToInvocation)) + + datebasedRule := platformclientv2.Workitemdatebasedrulecreate{ + Name: platformclientv2.String(d.Get("name").(string)), + Condition: &ruleCondition, + } + + return datebasedRule +} + +// getWorkitemdatebasedruleupdateFromResourceData maps data from schema ResourceData object to a platformclientv2.Workitemdatebasedruleupdate +func getWorkitemdatebasedruleupdateFromResourceData(d *schema.ResourceData) platformclientv2.Workitemdatebasedruleupdate { + condition := d.Get("condition").([]interface{}) + conditionMap := condition[0].(map[string]interface{}) + attribute := conditionMap["attribute"].(string) + relativeMinutesToInvocation := conditionMap["relative_minutes_to_invocation"].(int) + + ruleCondition := platformclientv2.Workitemdatebasedconditionupdate{} + ruleCondition.SetField("Attribute", platformclientv2.String(attribute)) + ruleCondition.SetField("RelativeMinutesToInvocation", platformclientv2.Int(relativeMinutesToInvocation)) + + dateBasedRuleUpdate := platformclientv2.Workitemdatebasedruleupdate{} + if d.HasChange("name") { + dateBasedRuleUpdate.SetField("Name", platformclientv2.String(d.Get("name").(string))) + } + if d.HasChange("condition") { + dateBasedRuleUpdate.SetField("Condition", &ruleCondition) + } + return dateBasedRuleUpdate +} + +// splitWorktypeBasedTerraformId will split the rule resource id which is in the form +// / into just the worktypeId and id string +func splitWorktypeBasedTerraformId(composedId string) (worktypeId string, id string) { + if len(strings.Split(composedId, "/")) > 1 { + return strings.Split(composedId, "/")[0], strings.Split(composedId, "/")[1] + } else { + log.Printf("Invalid composedId %s", composedId) + return "", "" + } +} + +// composeWorktypeBasedTerraformId will compose the rule resource id in the form / +func composeWorktypeBasedTerraformId(worktypeId string, id string) (composedId string) { + return worktypeId + "/" + id +} + +// flattenSdkCondition converts a *platformclientv2.Workitemdatebasedrule into a map and then into array for consumption by Terraform +func flattenSdkCondition(rule *platformclientv2.Workitemdatebasedrule) []interface{} { + conditionInterface := make(map[string]interface{}) + + resourcedata.SetMapValueIfNotNil(conditionInterface, "attribute", rule.Condition.Attribute) + resourcedata.SetMapValueIfNotNil(conditionInterface, "relative_minutes_to_invocation", rule.Condition.RelativeMinutesToInvocation) + + return []interface{}{conditionInterface} +} + +// ValidateRuleIds will check that two status ids are the same +// The id could be in the format / +func validateRuleIds(ruleResource1 string, key1 string, ruleResource2 string, key2 string) resource.TestCheckFunc { + return func(state *terraform.State) error { + rule1, ok := state.RootModule().Resources[ruleResource1] + if !ok { + return fmt.Errorf("failed to find rule %s", ruleResource1) + } + + rule2, ok := state.RootModule().Resources[ruleResource2] + if !ok { + return fmt.Errorf("failed to find rule %s", ruleResource2) + } + + status1Id := rule1.Primary.Attributes[key1] + if strings.Contains(status1Id, "/") { + _, status1Id = splitWorktypeBasedTerraformId(status1Id) + } + + status2Id := rule2.Primary.Attributes[key2] + if strings.Contains(status2Id, "/") { + _, status2Id = splitWorktypeBasedTerraformId(status2Id) + } + + if status1Id != status2Id { + attr1 := ruleResource1 + "." + key1 + attr2 := ruleResource2 + "." + key2 + return fmt.Errorf("%s not equal to %s\n %s = %s\n %s = %s", attr1, attr2, attr1, status1Id, attr2, status2Id) + } + + return nil + } +} diff --git a/genesyscloud/task_management_worktype_flow_onattributechange_rule/data_source_genesyscloud_task_management_onattributechange_rule.go b/genesyscloud/task_management_worktype_flow_onattributechange_rule/data_source_genesyscloud_task_management_onattributechange_rule.go new file mode 100644 index 000000000..c0fed3388 --- /dev/null +++ b/genesyscloud/task_management_worktype_flow_onattributechange_rule/data_source_genesyscloud_task_management_onattributechange_rule.go @@ -0,0 +1,43 @@ +package task_management_worktype_flow_onattributechange_rule + +import ( + "context" + "fmt" + "terraform-provider-genesyscloud/genesyscloud/provider" + "terraform-provider-genesyscloud/genesyscloud/util" + "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" +) + +/* + The data_source_genesyscloud_task_management_onattributechange_rule.go contains the data source implementation + for the resource. +*/ + +// dataSourceTaskManagementOnAttributeChangeRuleRead retrieves by name the id in question +func dataSourceTaskManagementOnAttributeChangeRuleRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + sdkConfig := meta.(*provider.ProviderMeta).ClientConfig + proxy := getTaskManagementOnAttributeChangeRuleProxy(sdkConfig) + + name := d.Get("name").(string) + typeId := d.Get("worktype_id").(string) + + return util.WithRetries(ctx, 15*time.Second, func() *retry.RetryError { + onAttributeChangeRuleId, retryable, resp, err := proxy.getTaskManagementOnAttributeChangeRuleIdByName(ctx, typeId, name) + + if err != nil { + if retryable { + return retry.RetryableError(util.BuildWithRetriesApiDiagnosticError(ResourceType, fmt.Sprintf("no task management onattributechange rule found with name %s", name), resp)) + } else { + return retry.NonRetryableError(util.BuildWithRetriesApiDiagnosticError(ResourceType, fmt.Sprintf("error searching task management onattributechange rule %s | error: %s", name, err), resp)) + } + } + + d.SetId(onAttributeChangeRuleId) + return nil + }) +} diff --git a/genesyscloud/task_management_worktype_flow_onattributechange_rule/data_source_genesyscloud_task_management_onattributechange_rule_test.go b/genesyscloud/task_management_worktype_flow_onattributechange_rule/data_source_genesyscloud_task_management_onattributechange_rule_test.go new file mode 100644 index 000000000..e89bd9608 --- /dev/null +++ b/genesyscloud/task_management_worktype_flow_onattributechange_rule/data_source_genesyscloud_task_management_onattributechange_rule_test.go @@ -0,0 +1,104 @@ +package task_management_worktype_flow_onattributechange_rule + +import ( + "fmt" + "terraform-provider-genesyscloud/genesyscloud/provider" + workbin "terraform-provider-genesyscloud/genesyscloud/task_management_workbin" + workType "terraform-provider-genesyscloud/genesyscloud/task_management_worktype" + worktypeStatus "terraform-provider-genesyscloud/genesyscloud/task_management_worktype_status" + "terraform-provider-genesyscloud/genesyscloud/util" + "testing" + + "github.com/google/uuid" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" +) + +/* +Test Class for the task management onattributechange rule Data Source +*/ + +func TestAccDataSourceTaskManagementOnAttributeChangeRule(t *testing.T) { + t.Parallel() + var ( + // Workbin + wbResourceLabel = "workbin_1" + wbName = "wb_" + uuid.NewString() + wbDescription = "workbin created for CX as Code test case" + + // Worktype + wtResourceLabel = "worktype_1" + wtName = "wt_" + uuid.NewString() + wtDescription = "test worktype description" + + // Status + statusResourceLabel = "status_1" + statusName = "status-" + uuid.NewString() + statusCategory = "InProgress" + + // OnAttributeChange Rule Resource + onAttributeChangeRuleResourceLabel = "onattributechange_rule_resource" + onAttributeChangeRuleName = "onattributechange-" + uuid.NewString() + onAttributeChangeRuleAttribute = "statusId" + + // OnAttributeChange Data Source + onAttributeChangeRuleDataSourceLabel = "onattributechange_rule_data" + ) + + resource.Test(t, resource.TestCase{ + PreCheck: func() { util.TestAccPreCheck(t) }, + ProviderFactories: provider.GetProviderFactories(providerResources, providerDataSources), + Steps: []resource.TestStep{ + { + Config: workbin.GenerateWorkbinResource(wbResourceLabel, wbName, wbDescription, util.NullValue) + + workType.GenerateWorktypeResourceBasic( + wtResourceLabel, + wtName, + wtDescription, + fmt.Sprintf("genesyscloud_task_management_workbin.%s.id", wbResourceLabel), + "", + ) + + worktypeStatus.GenerateWorktypeStatusResource( + statusResourceLabel, + fmt.Sprintf("genesyscloud_task_management_worktype.%s.id", wtResourceLabel), + statusName, + statusCategory, + "", util.NullValue, "", + ) + + GenerateOnAttributeChangeRuleResource( + onAttributeChangeRuleResourceLabel, + fmt.Sprintf("genesyscloud_task_management_worktype.%s.id", wtResourceLabel), + onAttributeChangeRuleName, + onAttributeChangeRuleAttribute, + fmt.Sprintf("genesyscloud_task_management_worktype_status.%s.id", statusResourceLabel), + "", "", + ) + + generateOnAttributeChangeRuleDataSource( + onAttributeChangeRuleDataSourceLabel, + fmt.Sprintf("genesyscloud_task_management_worktype.%s.id", wtResourceLabel), + onAttributeChangeRuleName, + ResourceType+"."+onAttributeChangeRuleResourceLabel, + ), + Check: resource.ComposeTestCheckFunc( + validateRuleIds( + "data."+ResourceType+"."+onAttributeChangeRuleDataSourceLabel, "id", ResourceType+"."+onAttributeChangeRuleResourceLabel, "id", + ), + ), + }, + { + ResourceName: ResourceType + "." + onAttributeChangeRuleResourceLabel, + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +func generateOnAttributeChangeRuleDataSource(dataSourceLabel string, worktypeId string, name string, dependsOnResource string) string { + return fmt.Sprintf(`data "%s" "%s" { + worktype_id = %s + name = "%s" + depends_on=[%s] + } + `, ResourceType, dataSourceLabel, worktypeId, name, dependsOnResource) +} diff --git a/genesyscloud/task_management_worktype_flow_onattributechange_rule/genesyscloud_task_management_onattributechange_rule_init_test.go b/genesyscloud/task_management_worktype_flow_onattributechange_rule/genesyscloud_task_management_onattributechange_rule_init_test.go new file mode 100644 index 000000000..46756e7db --- /dev/null +++ b/genesyscloud/task_management_worktype_flow_onattributechange_rule/genesyscloud_task_management_onattributechange_rule_init_test.go @@ -0,0 +1,66 @@ +package task_management_worktype_flow_onattributechange_rule + +import ( + "sync" + workbin "terraform-provider-genesyscloud/genesyscloud/task_management_workbin" + worktype "terraform-provider-genesyscloud/genesyscloud/task_management_worktype" + worktypeStatus "terraform-provider-genesyscloud/genesyscloud/task_management_worktype_status" + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +/* + The genesyscloud_task_management_onattributechange_rule_init_test.go file is used to initialize the data sources and resources + used in testing the task_management_worktype_flow_onattributechange_rule 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[ResourceType] = ResourceTaskManagementOnAttributeChangeRule() + providerResources[worktype.ResourceType] = worktype.ResourceTaskManagementWorktype() + providerResources[workbin.ResourceType] = workbin.ResourceTaskManagementWorkbin() + providerResources[worktypeStatus.ResourceType] = worktypeStatus.ResourceTaskManagementWorktypeStatus() +} + +// registerTestDataSources registers all data sources used in the tests. +func (r *registerTestInstance) registerTestDataSources() { + r.datasourceMapMutex.Lock() + defer r.datasourceMapMutex.Unlock() + + providerDataSources[ResourceType] = DataSourceTaskManagementOnAttributeChangeRule() +} + +// initTestResources initializes all test resources and data sources. +func initTestResources() { + providerDataSources = make(map[string]*schema.Resource) + providerResources = make(map[string]*schema.Resource) + + regInstance := ®isterTestInstance{} + + 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 task_management_worktype_flow_onattributechange_rule package + initTestResources() + + // Run the test suite for the task_management_worktype_flow_onattributechange_rule package + m.Run() +} diff --git a/genesyscloud/task_management_worktype_flow_onattributechange_rule/genesyscloud_task_management_onattributechange_rule_proxy.go b/genesyscloud/task_management_worktype_flow_onattributechange_rule/genesyscloud_task_management_onattributechange_rule_proxy.go new file mode 100644 index 000000000..fa67499d9 --- /dev/null +++ b/genesyscloud/task_management_worktype_flow_onattributechange_rule/genesyscloud_task_management_onattributechange_rule_proxy.go @@ -0,0 +1,187 @@ +package task_management_worktype_flow_onattributechange_rule + +import ( + "context" + "fmt" + rc "terraform-provider-genesyscloud/genesyscloud/resource_cache" + taskManagementWorktype "terraform-provider-genesyscloud/genesyscloud/task_management_worktype" + + "github.com/mypurecloud/platform-client-sdk-go/v150/platformclientv2" +) + +/* +The genesyscloud_task_management_onattributechange_rule_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 *taskManagementOnAttributeChangeRuleProxy + +// Type definitions for each func on our proxy so we can easily mock them out later +type createTaskManagementOnAttributeChangeRuleFunc func(ctx context.Context, p *taskManagementOnAttributeChangeRuleProxy, worktypeId string, onAttributeChangeRuleCreate *platformclientv2.Workitemonattributechangerulecreate) (*platformclientv2.Workitemonattributechangerule, *platformclientv2.APIResponse, error) +type getAllTaskManagementOnAttributeChangeRuleFunc func(ctx context.Context, p *taskManagementOnAttributeChangeRuleProxy, worktypeId string) (*[]platformclientv2.Workitemonattributechangerule, *platformclientv2.APIResponse, error) +type getTaskManagementOnAttributeChangeRuleIdByNameFunc func(ctx context.Context, p *taskManagementOnAttributeChangeRuleProxy, worktypeId string, name string) (id string, retryable bool, resp *platformclientv2.APIResponse, err error) +type getTaskManagementOnAttributeChangeRuleByIdFunc func(ctx context.Context, p *taskManagementOnAttributeChangeRuleProxy, worktypeId string, id string) (worktype *platformclientv2.Workitemonattributechangerule, response *platformclientv2.APIResponse, err error) +type updateTaskManagementOnAttributeChangeRuleFunc func(ctx context.Context, p *taskManagementOnAttributeChangeRuleProxy, worktypeId string, id string, onAttributeChangeRuleUpdate *platformclientv2.Workitemonattributechangeruleupdate) (*platformclientv2.Workitemonattributechangerule, *platformclientv2.APIResponse, error) +type deleteTaskManagementOnAttributeChangeRuleFunc func(ctx context.Context, p *taskManagementOnAttributeChangeRuleProxy, worktypeId string, id string) (response *platformclientv2.APIResponse, err error) + +// taskManagementOnAttributeChangeRuleProxy contains all the methods that call genesys cloud APIs. +type taskManagementOnAttributeChangeRuleProxy struct { + clientConfig *platformclientv2.Configuration + taskManagementApi *platformclientv2.TaskManagementApi + worktypeProxy *taskManagementWorktype.TaskManagementWorktypeProxy + createTaskManagementOnAttributeChangeRuleAttr createTaskManagementOnAttributeChangeRuleFunc + getAllTaskManagementOnAttributeChangeRuleAttr getAllTaskManagementOnAttributeChangeRuleFunc + getTaskManagementOnAttributeChangeRuleIdByNameAttr getTaskManagementOnAttributeChangeRuleIdByNameFunc + getTaskManagementOnAttributeChangeRuleByIdAttr getTaskManagementOnAttributeChangeRuleByIdFunc + updateTaskManagementOnAttributeChangeRuleAttr updateTaskManagementOnAttributeChangeRuleFunc + deleteTaskManagementOnAttributeChangeRuleAttr deleteTaskManagementOnAttributeChangeRuleFunc + onAttributeChangeRuleCache rc.CacheInterface[platformclientv2.Workitemonattributechangerule] +} + +// newTaskManagementOnAttributeChangeRuleProxy initializes the task management worktype proxy with all the data needed to communicate with Genesys Cloud +func newTaskManagementOnAttributeChangeRuleProxy(clientConfig *platformclientv2.Configuration) *taskManagementOnAttributeChangeRuleProxy { + api := platformclientv2.NewTaskManagementApiWithConfig(clientConfig) + onAttributeChangeRuleCache := rc.NewResourceCache[platformclientv2.Workitemonattributechangerule]() + taskmanagementProxy := taskManagementWorktype.GetTaskManagementWorktypeProxy(clientConfig) + return &taskManagementOnAttributeChangeRuleProxy{ + clientConfig: clientConfig, + taskManagementApi: api, + worktypeProxy: taskmanagementProxy, + createTaskManagementOnAttributeChangeRuleAttr: createTaskManagementOnAttributeChangeRuleFn, + getAllTaskManagementOnAttributeChangeRuleAttr: getAllTaskManagementOnAttributeChangeRuleFn, + getTaskManagementOnAttributeChangeRuleIdByNameAttr: getTaskManagementOnAttributeChangeRuleIdByNameFn, + getTaskManagementOnAttributeChangeRuleByIdAttr: getTaskManagementOnAttributeChangeRuleByIdFn, + updateTaskManagementOnAttributeChangeRuleAttr: updateTaskManagementOnAttributeChangeRuleFn, + deleteTaskManagementOnAttributeChangeRuleAttr: deleteTaskManagementOnAttributeChangeRuleFn, + onAttributeChangeRuleCache: onAttributeChangeRuleCache, + } +} + +// GetTaskManagementOnAttributeChangeRuleProxy 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 getTaskManagementOnAttributeChangeRuleProxy(clientConfig *platformclientv2.Configuration) *taskManagementOnAttributeChangeRuleProxy { + if internalProxy == nil { + internalProxy = newTaskManagementOnAttributeChangeRuleProxy(clientConfig) + } + return internalProxy +} + +// createTaskManagementOnAttributeChangeRule creates a Genesys Cloud task management onattributechange rule +func (p *taskManagementOnAttributeChangeRuleProxy) createTaskManagementOnAttributeChangeRule(ctx context.Context, worktypeId string, onAttributeChangeRuleCreate *platformclientv2.Workitemonattributechangerulecreate) (*platformclientv2.Workitemonattributechangerule, *platformclientv2.APIResponse, error) { + return p.createTaskManagementOnAttributeChangeRuleAttr(ctx, p, worktypeId, onAttributeChangeRuleCreate) +} + +// GetAllTaskManagementOnAttributeChangeRule retrieves all Genesys Cloud task management onattributechange rule +func (p *taskManagementOnAttributeChangeRuleProxy) getAllTaskManagementOnAttributeChangeRule(ctx context.Context, worktypeId string) (*[]platformclientv2.Workitemonattributechangerule, *platformclientv2.APIResponse, error) { + return p.getAllTaskManagementOnAttributeChangeRuleAttr(ctx, p, worktypeId) +} + +// getTaskManagementOnAttributeChangeRuleIdByName returns a single Genesys Cloud task management onattributechange rule by a name +func (p *taskManagementOnAttributeChangeRuleProxy) getTaskManagementOnAttributeChangeRuleIdByName(ctx context.Context, worktypeId string, name string) (id string, retryable bool, resp *platformclientv2.APIResponse, err error) { + return p.getTaskManagementOnAttributeChangeRuleIdByNameAttr(ctx, p, worktypeId, name) +} + +// GetTaskManagementOnAttributeChangeRuleById returns a single Genesys Cloud task management onattributechange rule by Id +func (p *taskManagementOnAttributeChangeRuleProxy) getTaskManagementOnAttributeChangeRuleById(ctx context.Context, worktypeId string, id string) (taskManagementOnAttributeChangeRule *platformclientv2.Workitemonattributechangerule, resp *platformclientv2.APIResponse, err error) { + return p.getTaskManagementOnAttributeChangeRuleByIdAttr(ctx, p, worktypeId, id) +} + +// UpdateTaskManagementOnAttributeChangeRule updates a Genesys Cloud task management onattributechange rule +func (p *taskManagementOnAttributeChangeRuleProxy) updateTaskManagementOnAttributeChangeRule(ctx context.Context, worktypeId string, id string, onAttributeChangeRuleUpdate *platformclientv2.Workitemonattributechangeruleupdate) (*platformclientv2.Workitemonattributechangerule, *platformclientv2.APIResponse, error) { + return p.updateTaskManagementOnAttributeChangeRuleAttr(ctx, p, worktypeId, id, onAttributeChangeRuleUpdate) +} + +// deleteTaskManagementOnAttributeChangeRule deletes a Genesys Cloud task management onattributechange rule by Id +func (p *taskManagementOnAttributeChangeRuleProxy) deleteTaskManagementOnAttributeChangeRule(ctx context.Context, worktypeId string, id string) (resp *platformclientv2.APIResponse, err error) { + return p.deleteTaskManagementOnAttributeChangeRuleAttr(ctx, p, worktypeId, id) +} + +// createTaskManagementOnAttributeChangeRuleFn is an implementation function for creating a Genesys Cloud task management onattributechange rule +func createTaskManagementOnAttributeChangeRuleFn(ctx context.Context, p *taskManagementOnAttributeChangeRuleProxy, worktypeId string, onAttributeChangeRuleCreate *platformclientv2.Workitemonattributechangerulecreate) (*platformclientv2.Workitemonattributechangerule, *platformclientv2.APIResponse, error) { + return p.taskManagementApi.PostTaskmanagementWorktypeFlowsOnattributechangeRules(worktypeId, *onAttributeChangeRuleCreate) +} + +// getAllTaskManagementOnAttributeChangeRuleFn is the implementation for retrieving all task management onattributechange rules in Genesys Cloud +func getAllTaskManagementOnAttributeChangeRuleFn(ctx context.Context, p *taskManagementOnAttributeChangeRuleProxy, worktypeId string) (*[]platformclientv2.Workitemonattributechangerule, *platformclientv2.APIResponse, error) { + const pageSize = 200 + var ( + allOnAttributeChangeRules []platformclientv2.Workitemonattributechangerule + after = "" + response *platformclientv2.APIResponse + ) + for { + onAttributeChangeRules, resp, err := p.taskManagementApi.GetTaskmanagementWorktypeFlowsOnattributechangeRules(worktypeId, after, pageSize) + response = resp + if err != nil { + return nil, resp, fmt.Errorf("failed to get onattributechange rules: %v", err) + } + if onAttributeChangeRules.Entities != nil && len(*onAttributeChangeRules.Entities) > 0 { + allOnAttributeChangeRules = append(allOnAttributeChangeRules, *onAttributeChangeRules.Entities...) + } + + // Exit loop if there are no more 'pages' + if onAttributeChangeRules.After == nil || *onAttributeChangeRules.After == "" { + break + } + after = *onAttributeChangeRules.After + } + return &allOnAttributeChangeRules, response, nil +} + +// getTaskManagementOnAttributeChangeRuleIdByNameFn is an implementation of the function to get a Genesys Cloud task management onattributechange rule by name +func getTaskManagementOnAttributeChangeRuleIdByNameFn(ctx context.Context, p *taskManagementOnAttributeChangeRuleProxy, worktypeId string, name string) (id string, retryable bool, resp *platformclientv2.APIResponse, err error) { + const pageSize = 200 + var ( + after = "" + response *platformclientv2.APIResponse + ) + for { + onAttributeChangeRules, resp, err := p.taskManagementApi.GetTaskmanagementWorktypeFlowsOnattributechangeRules(worktypeId, after, pageSize) + response = resp + if err != nil { + return "", false, resp, fmt.Errorf("failed to get onattributechange rules: %v", err) + } + + if onAttributeChangeRules.Entities != nil && len(*onAttributeChangeRules.Entities) > 0 { + for i := 0; i < len(*onAttributeChangeRules.Entities); i++ { + onAttributeChangeRule := (*onAttributeChangeRules.Entities)[i] + if *onAttributeChangeRule.Name == name { + return *onAttributeChangeRule.Id, false, resp, nil + } + } + } + + // Exit loop if there are no more 'pages' + if onAttributeChangeRules.After == nil || *onAttributeChangeRules.After == "" { + break + } + after = *onAttributeChangeRules.After + } + return "", true, response, fmt.Errorf("no task management onattributechange rules found with name %s", name) +} + +// getTaskManagementOnAttributeChangeRuleByIdFn is an implementation of the function to get a Genesys Cloud task management onattributechange rule by Id +func getTaskManagementOnAttributeChangeRuleByIdFn(ctx context.Context, p *taskManagementOnAttributeChangeRuleProxy, worktypeId string, id string) (taskManagementOnAttributeChangeRule *platformclientv2.Workitemonattributechangerule, resp *platformclientv2.APIResponse, err error) { + onAttributeChangeRule := rc.GetCacheItem(p.onAttributeChangeRuleCache, id) + if onAttributeChangeRule != nil { + return onAttributeChangeRule, nil, nil + } + + return p.taskManagementApi.GetTaskmanagementWorktypeFlowsOnattributechangeRule(worktypeId, id) +} + +// updateTaskManagementOnAttributeChangeRuleFn is an implementation of the function to update a Genesys Cloud task management onattributechange rule +func updateTaskManagementOnAttributeChangeRuleFn(ctx context.Context, p *taskManagementOnAttributeChangeRuleProxy, worktypeId string, id string, onAttributeChangeRuleUpdate *platformclientv2.Workitemonattributechangeruleupdate) (*platformclientv2.Workitemonattributechangerule, *platformclientv2.APIResponse, error) { + return p.taskManagementApi.PatchTaskmanagementWorktypeFlowsOnattributechangeRule(worktypeId, id, *onAttributeChangeRuleUpdate) +} + +// deleteTaskManagementOnAttributeChangeRuleFn is an implementation function for deleting a Genesys Cloud task management onattributechange rule +func deleteTaskManagementOnAttributeChangeRuleFn(ctx context.Context, p *taskManagementOnAttributeChangeRuleProxy, worktypeId string, id string) (resp *platformclientv2.APIResponse, err error) { + resp, err = p.taskManagementApi.DeleteTaskmanagementWorktypeFlowsOnattributechangeRule(worktypeId, id) + if err == nil { + rc.DeleteCacheItem(p.onAttributeChangeRuleCache, id) + } + return resp, err +} diff --git a/genesyscloud/task_management_worktype_flow_onattributechange_rule/resource_genesyscloud_task_management_onattributechange_rule.go b/genesyscloud/task_management_worktype_flow_onattributechange_rule/resource_genesyscloud_task_management_onattributechange_rule.go new file mode 100644 index 000000000..405ea98f7 --- /dev/null +++ b/genesyscloud/task_management_worktype_flow_onattributechange_rule/resource_genesyscloud_task_management_onattributechange_rule.go @@ -0,0 +1,147 @@ +package task_management_worktype_flow_onattributechange_rule + +import ( + "context" + "fmt" + "log" + "terraform-provider-genesyscloud/genesyscloud/provider" + resourceExporter "terraform-provider-genesyscloud/genesyscloud/resource_exporter" + "terraform-provider-genesyscloud/genesyscloud/util" + "terraform-provider-genesyscloud/genesyscloud/util/constants" + "time" + + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/mypurecloud/platform-client-sdk-go/v150/platformclientv2" + + "terraform-provider-genesyscloud/genesyscloud/consistency_checker" + + "terraform-provider-genesyscloud/genesyscloud/util/resourcedata" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/retry" +) + +/* +The resource_genesyscloud_task_management_onattributechange_rule.go contains all of the methods that perform the core logic for a resource. +*/ + +// getAllAuthTaskManagementOnAttributeChangeRule retrieves all of the task management onattributechange Rules via Terraform in the Genesys Cloud and is used for the exporter +func getAllAuthTaskManagementOnAttributeChangeRule(ctx context.Context, clientConfig *platformclientv2.Configuration) (resourceExporter.ResourceIDMetaMap, diag.Diagnostics) { + proxy := getTaskManagementOnAttributeChangeRuleProxy(clientConfig) + resources := make(resourceExporter.ResourceIDMetaMap) + + worktypes, resp, err := proxy.worktypeProxy.GetAllTaskManagementWorktype(ctx) + if err != nil { + return nil, util.BuildAPIDiagnosticError(ResourceType, fmt.Sprintf("Failed to get task management worktypes: %v", err), resp) + } + if worktypes == nil { + return resources, nil + } + + for _, worktype := range *worktypes { + onAttributeChangeRules, resp, err := proxy.getAllTaskManagementOnAttributeChangeRule(ctx, *worktype.Id) + if err != nil { + return nil, util.BuildAPIDiagnosticError(ResourceType, fmt.Sprintf("Failed to get task management onattributechange rules error: %s", err), resp) + } + if onAttributeChangeRules == nil { + continue + } + + for _, onAttributeChangeRule := range *onAttributeChangeRules { + resources[composeWorktypeBasedTerraformId(*worktype.Id, *onAttributeChangeRule.Id)] = &resourceExporter.ResourceMeta{BlockLabel: *onAttributeChangeRule.Name} + } + } + return resources, nil +} + +// createTaskManagementOnAttributeChangeRule is used by the task_management_worktype_flow_onattributechange_rule resource to create Genesys cloud task management onattributechange rule +func createTaskManagementOnAttributeChangeRule(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + sdkConfig := meta.(*provider.ProviderMeta).ClientConfig + proxy := getTaskManagementOnAttributeChangeRuleProxy(sdkConfig) + + worktypeId := d.Get("worktype_id").(string) + onAttributeChangeRuleCreate := getWorkitemonattributechangerulecreateFromResourceData(d) + + log.Printf("Creating task management onattributechange rule %s for worktype %s", *onAttributeChangeRuleCreate.Name, worktypeId) + onAttributeChangeRule, resp, err := proxy.createTaskManagementOnAttributeChangeRule(ctx, worktypeId, &onAttributeChangeRuleCreate) + if err != nil { + return util.BuildAPIDiagnosticError(ResourceType, fmt.Sprintf("Failed to create task management onattributechange rule %s error: %s", *onAttributeChangeRuleCreate.Name, err), resp) + } + log.Printf("Created the base task management onattributechange rule %s for worktype %s", *onAttributeChangeRule.Id, worktypeId) + + d.SetId(composeWorktypeBasedTerraformId(worktypeId, *onAttributeChangeRule.Id)) + + return readTaskManagementOnAttributeChangeRule(ctx, d, meta) +} + +// readTaskManagementOnAttributeChangeRule is used by the task_management_worktype_flow_onattributechange_rule resource to read a task management onattributechange rule from genesys cloud +func readTaskManagementOnAttributeChangeRule(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + sdkConfig := meta.(*provider.ProviderMeta).ClientConfig + proxy := getTaskManagementOnAttributeChangeRuleProxy(sdkConfig) + cc := consistency_checker.NewConsistencyCheck(ctx, d, meta, ResourceTaskManagementOnAttributeChangeRule(), constants.ConsistencyChecks(), ResourceType) + + worktypeId, id := splitWorktypeBasedTerraformId(d.Id()) + + log.Printf("Reading task management onattributechange rule %s for worktype %s", id, worktypeId) + return util.WithRetriesForRead(ctx, d, func() *retry.RetryError { + onAttributeChangeRule, resp, getErr := proxy.getTaskManagementOnAttributeChangeRuleById(ctx, worktypeId, id) + if getErr != nil { + if util.IsStatus404(resp) { + return retry.RetryableError(util.BuildWithRetriesApiDiagnosticError(ResourceType, fmt.Sprintf("failed to read task management onattributechange rule %s for worktype %s | error: %s", id, worktypeId, getErr), resp)) + } + return retry.NonRetryableError(util.BuildWithRetriesApiDiagnosticError(ResourceType, fmt.Sprintf("failed to read task management onattributechange rule %s for worktype %s | error: %s", id, worktypeId, getErr), resp)) + } + + resourcedata.SetNillableValue(d, "name", onAttributeChangeRule.Name) + resourcedata.SetNillableValue(d, "worktype_id", onAttributeChangeRule.Worktype.Id) + resourcedata.SetNillableValueWithInterfaceArrayWithFunc(d, "condition", onAttributeChangeRule, flattenSdkCondition) + + log.Printf("Read task management onattributechange rule %s for worktype %s", id, worktypeId) + return cc.CheckState(d) + }) +} + +// updateTaskManagementOnAttributeChangeRule is used by the task_management_worktype_flow_onattributechange_rule resource to update a task management onattributechange rule in Genesys Cloud +func updateTaskManagementOnAttributeChangeRule(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + sdkConfig := meta.(*provider.ProviderMeta).ClientConfig + proxy := getTaskManagementOnAttributeChangeRuleProxy(sdkConfig) + + onAttributeChangeRuleUpdate := getWorkitemonattributechangeruleupdateFromResourceData(d) + worktypeId, id := splitWorktypeBasedTerraformId(d.Id()) + + log.Printf("Updating onattributechange rule %s for worktype %s", id, worktypeId) + _, resp, err := proxy.updateTaskManagementOnAttributeChangeRule(ctx, worktypeId, id, &onAttributeChangeRuleUpdate) + if err != nil { + return util.BuildAPIDiagnosticError(ResourceType, fmt.Sprintf("Failed to update task management onattributechange rule %s for worktype %s error: %s", id, worktypeId, err), resp) + } + + log.Printf("Updated onattributechange rule %s for worktype %s", id, worktypeId) + + return readTaskManagementOnAttributeChangeRule(ctx, d, meta) +} + +// deleteTaskManagementOnAttributeChangeRule is used by the task_management_worktype_flow_onattributechange_rule resource to delete a task management onattributechange rule from Genesys cloud +func deleteTaskManagementOnAttributeChangeRule(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + sdkConfig := meta.(*provider.ProviderMeta).ClientConfig + proxy := getTaskManagementOnAttributeChangeRuleProxy(sdkConfig) + + worktypeId, id := splitWorktypeBasedTerraformId(d.Id()) + + resp, err := proxy.deleteTaskManagementOnAttributeChangeRule(ctx, worktypeId, id) + if err != nil { + return util.BuildAPIDiagnosticError(ResourceType, fmt.Sprintf("Failed to delete task management onattributechange rule %s for worktype %s error: %s", id, worktypeId, err), resp) + } + + return util.WithRetries(ctx, 180*time.Second, func() *retry.RetryError { + _, resp, err := proxy.getTaskManagementOnAttributeChangeRuleById(ctx, worktypeId, id) + + if err != nil { + if util.IsStatus404(resp) { + log.Printf("Deleted task management onattributechange rule %s for worktype %s", id, worktypeId) + return nil + } + return retry.NonRetryableError(util.BuildWithRetriesApiDiagnosticError(ResourceType, fmt.Sprintf("error deleting task management onattributechange rule %s for worktype %s | error: %s", id, worktypeId, err), resp)) + } + return retry.RetryableError(util.BuildWithRetriesApiDiagnosticError(ResourceType, fmt.Sprintf("task management onattributechange rule %s still exists", id), resp)) + }) +} diff --git a/genesyscloud/task_management_worktype_flow_onattributechange_rule/resource_genesyscloud_task_management_onattributechange_rule_schema.go b/genesyscloud/task_management_worktype_flow_onattributechange_rule/resource_genesyscloud_task_management_onattributechange_rule_schema.go new file mode 100644 index 000000000..6619cd1ca --- /dev/null +++ b/genesyscloud/task_management_worktype_flow_onattributechange_rule/resource_genesyscloud_task_management_onattributechange_rule_schema.go @@ -0,0 +1,117 @@ +package task_management_worktype_flow_onattributechange_rule + +import ( + "terraform-provider-genesyscloud/genesyscloud/provider" + resourceExporter "terraform-provider-genesyscloud/genesyscloud/resource_exporter" + registrar "terraform-provider-genesyscloud/genesyscloud/resource_register" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +/* +resource_genesycloud_task_management_onattributechange_rule_schema.go holds four functions within it: + +1. The registration code that registers the Datasource, Resource and Exporter for the package. +2. The resource schema definitions for the task_management_worktype_flow_onattributechange_rule resource. +3. The datasource schema definitions for the task_management_worktype_flow_onattributechange_rule datasource. +4. The resource exporter configuration for the task_management_worktype_flow_onattributechange_rule exporter. +*/ +const ResourceType = "genesyscloud_task_management_worktype_flow_onattributechange_rule" + +// SetRegistrar registers all of the resources, datasources and exporters in the package +func SetRegistrar(regInstance registrar.Registrar) { + regInstance.RegisterResource(ResourceType, ResourceTaskManagementOnAttributeChangeRule()) + regInstance.RegisterDataSource(ResourceType, DataSourceTaskManagementOnAttributeChangeRule()) + regInstance.RegisterExporter(ResourceType, TaskManagementOnAttributeChangeRuleExporter()) +} + +// ResourceTaskManagementOnAttributeChangeRule registers the genesyscloud_task_management_worktype_flow_onattributechange_rule resource with Terraform +func ResourceTaskManagementOnAttributeChangeRule() *schema.Resource { + condition := &schema.Resource{ + Schema: map[string]*schema.Schema{ + `attribute`: { + Description: "The name of the workitem attribute whose change will be evaluated as part of the rule.", + Required: true, + Type: schema.TypeString, + }, + `new_value`: { + Description: "The new value of the attribute. If the attribute is updated to this value this part of the condition will be met.", + Required: true, + Type: schema.TypeString, + }, + "old_value": { + Description: "The old value of the attribute. If the attribute was updated from this value this part of the condition will be met.", + Optional: true, + Type: schema.TypeString, + }, + }, + } + + return &schema.Resource{ + Description: `Genesys Cloud task management onattributeChange Rule`, + + CreateContext: provider.CreateWithPooledClient(createTaskManagementOnAttributeChangeRule), + ReadContext: provider.ReadWithPooledClient(readTaskManagementOnAttributeChangeRule), + UpdateContext: provider.UpdateWithPooledClient(updateTaskManagementOnAttributeChangeRule), + DeleteContext: provider.DeleteWithPooledClient(deleteTaskManagementOnAttributeChangeRule), + Importer: &schema.ResourceImporter{ + StateContext: schema.ImportStatePassthroughContext, + }, + SchemaVersion: 1, + Schema: map[string]*schema.Schema{ + `name`: { + Description: `The name of the Rule.`, + Required: true, + Type: schema.TypeString, + }, + `worktype_id`: { + Description: `The Worktype ID of the Rule.`, + Required: true, + ForceNew: true, + Type: schema.TypeString, + }, + "condition": { + Description: "Condition for this Rule.", + Type: schema.TypeList, + Required: true, + MaxItems: 1, + Elem: condition, + }, + }, + } +} + +// TaskManagementOnAttributeChangeRuleExporter returns the resourceExporter object used to hold the genesyscloud_task_management_worktype_flow_onattributechange_rule exporter's config +func TaskManagementOnAttributeChangeRuleExporter() *resourceExporter.ResourceExporter { + return &resourceExporter.ResourceExporter{ + GetResourcesFunc: provider.GetAllWithPooledClient(getAllAuthTaskManagementOnAttributeChangeRule), + RefAttrs: map[string]*resourceExporter.RefAttrSettings{ + "worktype_id": {RefType: "genesyscloud_task_management_worktype"}, + "new_value": {RefType: "genesyscloud_task_management_worktype_status"}, + "old_value": {RefType: "genesyscloud_task_management_worktype_status"}, + }, + } +} + +// DataSourceTaskManagementOnAttributeChangeRule registers the genesyscloud_task_management_worktype_flow_onattributechange_rule data source +func DataSourceTaskManagementOnAttributeChangeRule() *schema.Resource { + return &schema.Resource{ + Description: `Genesys Cloud task management onattributechange rule data source. Select a task management onattributechange rule by name`, + ReadContext: provider.ReadWithPooledClient(dataSourceTaskManagementOnAttributeChangeRuleRead), + Importer: &schema.ResourceImporter{ + StateContext: schema.ImportStatePassthroughContext, + }, + Schema: map[string]*schema.Schema{ + `name`: { + Description: `The name of the Rule.`, + Required: true, + Type: schema.TypeString, + }, + `worktype_id`: { + Description: `The Worktype ID of the Rule.`, + Required: true, + Type: schema.TypeString, + }, + }, + } +} diff --git a/genesyscloud/task_management_worktype_flow_onattributechange_rule/resource_genesyscloud_task_management_onattributechange_rule_test.go b/genesyscloud/task_management_worktype_flow_onattributechange_rule/resource_genesyscloud_task_management_onattributechange_rule_test.go new file mode 100644 index 000000000..d16e8bed1 --- /dev/null +++ b/genesyscloud/task_management_worktype_flow_onattributechange_rule/resource_genesyscloud_task_management_onattributechange_rule_test.go @@ -0,0 +1,171 @@ +package task_management_worktype_flow_onattributechange_rule + +import ( + "fmt" + "terraform-provider-genesyscloud/genesyscloud/provider" + workbin "terraform-provider-genesyscloud/genesyscloud/task_management_workbin" + workType "terraform-provider-genesyscloud/genesyscloud/task_management_worktype" + worktypeStatus "terraform-provider-genesyscloud/genesyscloud/task_management_worktype_status" + "terraform-provider-genesyscloud/genesyscloud/util" + "testing" + + "github.com/google/uuid" + "github.com/mypurecloud/platform-client-sdk-go/v150/platformclientv2" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + + "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" +) + +/* +The resource_genesyscloud_task_management_onattributechange_rule_test.go contains all of the test cases for running the resource +tests for task_management_worktype_flow_onattributechange_rule. +*/ + +func TestAccResourceTaskManagementOnAttributeChangeRule(t *testing.T) { + t.Parallel() + var ( + // Workbin + wbResourceLabel = "workbin_1" + wbName = "wb_" + uuid.NewString() + wbDescription = "workbin created for CX as Code test case" + + // Worktype + wtResourceLabel = "worktype_1" + wtName = "wt_" + uuid.NewString() + wtDescription = "test worktype description" + + // Status + statusOpenResourceLabel = "status_1" + statusOpenName = "status-" + uuid.NewString() + statusOpenCategory = "Open" + statusInProgressResourceLabel = "status_2" + statusInProgressName = "status-" + uuid.NewString() + statusInProgressCategory = "InProgress" + statusClosedResourceLabel = "status_3" + statusClosedName = "status-" + uuid.NewString() + statusClosedCategory = "Closed" + + // OnAttributeChange Rule Resource + onAttributeChangeRuleResourceLabel = "onattributechange_rule_resource" + onAttributeChangeRuleName = "onattributechange-" + uuid.NewString() + onAttributeChangeRuleName2 = "onattributechange2-" + uuid.NewString() + onAttributeChangeRuleAttribute = "statusId" + ) + + resource.Test(t, resource.TestCase{ + PreCheck: func() { util.TestAccPreCheck(t) }, + ProviderFactories: provider.GetProviderFactories(providerResources, providerDataSources), + Steps: []resource.TestStep{ + { + // Create worktype status + Config: workbin.GenerateWorkbinResource(wbResourceLabel, wbName, wbDescription, util.NullValue) + + workType.GenerateWorktypeResourceBasic( + wtResourceLabel, + wtName, + wtDescription, + fmt.Sprintf("genesyscloud_task_management_workbin.%s.id", wbResourceLabel), + "", + ) + + worktypeStatus.GenerateWorktypeStatusResource( + statusInProgressResourceLabel, + fmt.Sprintf("genesyscloud_task_management_worktype.%s.id", wtResourceLabel), + statusInProgressName, + statusInProgressCategory, + "", util.NullValue, "", + ) + + GenerateOnAttributeChangeRuleResource( + onAttributeChangeRuleResourceLabel, + fmt.Sprintf("genesyscloud_task_management_worktype.%s.id", wtResourceLabel), + onAttributeChangeRuleName, + onAttributeChangeRuleAttribute, + fmt.Sprintf("genesyscloud_task_management_worktype_status.%s.id", statusInProgressResourceLabel), + "", "", + ), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrPair(ResourceType+"."+onAttributeChangeRuleResourceLabel, "worktype_id", fmt.Sprintf("genesyscloud_task_management_worktype.%s", wtResourceLabel), "id"), + resource.TestCheckResourceAttr(ResourceType+"."+onAttributeChangeRuleResourceLabel, "name", onAttributeChangeRuleName), + resource.TestCheckResourceAttrPair(ResourceType+"."+onAttributeChangeRuleResourceLabel, "condition.0.new_value", + fmt.Sprintf("genesyscloud_task_management_worktype_status.%s", statusInProgressResourceLabel), "id"), + ), + }, + { + // Update onattributechange rule + Config: workbin.GenerateWorkbinResource(wbResourceLabel, wbName, wbDescription, util.NullValue) + + workType.GenerateWorktypeResourceBasic( + wtResourceLabel, + wtName, + wtDescription, + fmt.Sprintf("genesyscloud_task_management_workbin.%s.id", wbResourceLabel), + "", + ) + + worktypeStatus.GenerateWorktypeStatusResource( + statusOpenResourceLabel, + fmt.Sprintf("genesyscloud_task_management_worktype.%s.id", wtResourceLabel), + statusOpenName, + statusOpenCategory, + "", util.NullValue, "", + ) + + worktypeStatus.GenerateWorktypeStatusResource( + statusInProgressResourceLabel, + fmt.Sprintf("genesyscloud_task_management_worktype.%s.id", wtResourceLabel), + statusInProgressName, + statusInProgressCategory, + "", util.NullValue, "", + ) + + worktypeStatus.GenerateWorktypeStatusResource( + statusClosedResourceLabel, + fmt.Sprintf("genesyscloud_task_management_worktype.%s.id", wtResourceLabel), + statusClosedName, + statusClosedCategory, + "", util.NullValue, "", + ) + + GenerateOnAttributeChangeRuleResource( + onAttributeChangeRuleResourceLabel, + fmt.Sprintf("genesyscloud_task_management_worktype.%s.id", wtResourceLabel), + onAttributeChangeRuleName2, + onAttributeChangeRuleAttribute, + fmt.Sprintf("genesyscloud_task_management_worktype_status.%s.id", statusClosedResourceLabel), + fmt.Sprintf("genesyscloud_task_management_worktype_status.%s.id", statusOpenResourceLabel), + "", + ), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr(ResourceType+"."+onAttributeChangeRuleResourceLabel, "name", onAttributeChangeRuleName2), + resource.TestCheckResourceAttrPair(ResourceType+"."+onAttributeChangeRuleResourceLabel, "condition.0.new_value", + fmt.Sprintf("genesyscloud_task_management_worktype_status.%s", statusClosedResourceLabel), "id"), + resource.TestCheckResourceAttrPair(ResourceType+"."+onAttributeChangeRuleResourceLabel, "condition.0.old_value", + fmt.Sprintf("genesyscloud_task_management_worktype_status.%s", statusOpenResourceLabel), "id"), + ), + }, + { + ResourceName: ResourceType + "." + onAttributeChangeRuleResourceLabel, + ImportState: true, + ImportStateVerify: true, + }, + }, + CheckDestroy: testVerifyTaskManagementOnAttributeChangeRuleDestroyed, + }) +} + +func testVerifyTaskManagementOnAttributeChangeRuleDestroyed(state *terraform.State) error { + taskManagementApi := platformclientv2.NewTaskManagementApi() + for _, res := range state.RootModule().Resources { + if res.Type != ResourceType { + continue + } + + worktypeId, onAttributeChangeRuleId := splitWorktypeBasedTerraformId(res.Primary.ID) + onAttributeChangeRule, resp, err := taskManagementApi.GetTaskmanagementWorktypeFlowsOnattributechangeRule(worktypeId, onAttributeChangeRuleId) + if onAttributeChangeRule != nil { + return fmt.Errorf("task management onattributechange rule (%s) still exists", res.Primary.ID) + } else if util.IsStatus404(resp) { + // Worktype no found, as expected + continue + } else { + return fmt.Errorf("unexpected error: %s", err) + } + } + + // All onattributechange rules deleted + return nil +} diff --git a/genesyscloud/task_management_worktype_flow_onattributechange_rule/resource_genesyscloud_task_management_onattributechange_rule_utils.go b/genesyscloud/task_management_worktype_flow_onattributechange_rule/resource_genesyscloud_task_management_onattributechange_rule_utils.go new file mode 100644 index 000000000..f8d237842 --- /dev/null +++ b/genesyscloud/task_management_worktype_flow_onattributechange_rule/resource_genesyscloud_task_management_onattributechange_rule_utils.go @@ -0,0 +1,179 @@ +package task_management_worktype_flow_onattributechange_rule + +import ( + "fmt" + "log" + "strings" + "terraform-provider-genesyscloud/genesyscloud/util/resourcedata" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/mypurecloud/platform-client-sdk-go/v150/platformclientv2" +) + +/* +The resource_genesyscloud_task_management_onattributechange_rule_utils.go file contains various helper methods to marshal +and unmarshal data into formats consumable by Terraform and/or Genesys Cloud. +*/ + +func GenerateOnAttributeChangeRuleResource( + resourceLabel, + worktypeId, + name string, + attribute string, + newValue string, + oldValue string, + attrs ...string, +) string { + oldValueCondition := "" + if oldValue != "" { + oldValueCondition = "old_value = " + oldValue + } + return fmt.Sprintf( + `resource "genesyscloud_task_management_worktype_flow_onattributechange_rule" "%s" { + worktype_id = %s + name = "%s" + condition { + attribute = "%s" + new_value = %s + %s + } + %s + } + `, resourceLabel, worktypeId, name, attribute, newValue, oldValueCondition, strings.Join(attrs, "\n")) +} + +// getWorkitemonattributechangerulecreateFromResourceData maps data from schema ResourceData object to a platformclientv2.Workitemonattributechangerulecreate +func getWorkitemonattributechangerulecreateFromResourceData(d *schema.ResourceData) platformclientv2.Workitemonattributechangerulecreate { + condition := d.Get("condition").([]interface{}) + conditionMap := condition[0].(map[string]interface{}) + attribute := conditionMap["attribute"].(string) + newValue := conditionMap["new_value"].(string) + oldValue := conditionMap["old_value"].(string) + if attribute == "statusId" { + _, newValue = splitWorktypeBasedTerraformId(newValue) + if oldValue != "" { + _, oldValue = splitWorktypeBasedTerraformId(oldValue) + } + } + + ruleCondition := platformclientv2.Workitemonattributechangecondition{} + ruleCondition.SetField("Attribute", platformclientv2.String(attribute)) + ruleCondition.SetField("NewValue", platformclientv2.String(newValue)) + if oldValue != "" { + ruleCondition.SetField("OldValue", platformclientv2.String(oldValue)) + } + + onattributechangeRule := platformclientv2.Workitemonattributechangerulecreate{ + Name: platformclientv2.String(d.Get("name").(string)), + Condition: &ruleCondition, + } + + return onattributechangeRule +} + +// getWorkitemonattributechangeruleupdateFromResourceData maps data from schema ResourceData object to a platformclientv2.Workitemonattributechangeruleupdate +func getWorkitemonattributechangeruleupdateFromResourceData(d *schema.ResourceData) platformclientv2.Workitemonattributechangeruleupdate { + condition := d.Get("condition").([]interface{}) + conditionMap := condition[0].(map[string]interface{}) + attribute := conditionMap["attribute"].(string) + newValue := conditionMap["new_value"].(string) + oldValue := conditionMap["old_value"].(string) + if attribute == "statusId" { + _, newValue = splitWorktypeBasedTerraformId(newValue) + if oldValue != "" { + _, oldValue = splitWorktypeBasedTerraformId(oldValue) + } + } + + ruleCondition := platformclientv2.Workitemonattributechangeconditionupdate{} + ruleCondition.SetField("Attribute", platformclientv2.String(attribute)) + ruleCondition.SetField("NewValue", platformclientv2.String(newValue)) + if oldValue != "" { + ruleCondition.SetField("OldValue", platformclientv2.String(oldValue)) + } else { + ruleCondition.SetField("OldValue", nil) + } + + onAttributeChangeRuleUpdate := platformclientv2.Workitemonattributechangeruleupdate{} + if d.HasChange("name") { + onAttributeChangeRuleUpdate.SetField("Name", platformclientv2.String(d.Get("name").(string))) + } + if d.HasChange("condition") { + onAttributeChangeRuleUpdate.SetField("Condition", &ruleCondition) + } + return onAttributeChangeRuleUpdate +} + +// splitWorktypeBasedTerraformId will split the rule resource id which is in the form +// / into just the worktypeId and id string +func splitWorktypeBasedTerraformId(composedId string) (worktypeId string, id string) { + if len(strings.Split(composedId, "/")) > 1 { + return strings.Split(composedId, "/")[0], strings.Split(composedId, "/")[1] + } else { + log.Printf("Invalid composedId %s", composedId) + return "", "" + } +} + +// composeWorktypeBasedTerraformId will compose the rule resource id in the form / +func composeWorktypeBasedTerraformId(worktypeId string, id string) (composedId string) { + return worktypeId + "/" + id +} + +// flattenSdkCondition converts a *platformclientv2.Workitemonattributechangerule into a map and then into array for consumption by Terraform +func flattenSdkCondition(rule *platformclientv2.Workitemonattributechangerule) []interface{} { + conditionInterface := make(map[string]interface{}) + + resourcedata.SetMapValueIfNotNil(conditionInterface, "attribute", rule.Condition.Attribute) + + if *rule.Condition.Attribute == "statusId" { + newValue := composeWorktypeBasedTerraformId(*rule.Worktype.Id, *rule.Condition.NewValue) + resourcedata.SetMapValueIfNotNil(conditionInterface, "new_value", &newValue) + + if rule.Condition.OldValue != nil { + oldValue := composeWorktypeBasedTerraformId(*rule.Worktype.Id, *rule.Condition.OldValue) + resourcedata.SetMapValueIfNotNil(conditionInterface, "old_value", &oldValue) + } + } else { + resourcedata.SetMapValueIfNotNil(conditionInterface, "new_value", rule.Condition.NewValue) + resourcedata.SetMapValueIfNotNil(conditionInterface, "old_value", rule.Condition.OldValue) + } + + return []interface{}{conditionInterface} +} + +// ValidateRuleIds will check that two status ids are the same +// The id could be in the format / +func validateRuleIds(ruleResource1 string, key1 string, ruleResource2 string, key2 string) resource.TestCheckFunc { + return func(state *terraform.State) error { + rule1, ok := state.RootModule().Resources[ruleResource1] + if !ok { + return fmt.Errorf("failed to find rule %s", ruleResource1) + } + + rule2, ok := state.RootModule().Resources[ruleResource2] + if !ok { + return fmt.Errorf("failed to find rule %s", ruleResource2) + } + + status1Id := rule1.Primary.Attributes[key1] + if strings.Contains(status1Id, "/") { + _, status1Id = splitWorktypeBasedTerraformId(status1Id) + } + + status2Id := rule2.Primary.Attributes[key2] + if strings.Contains(status2Id, "/") { + _, status2Id = splitWorktypeBasedTerraformId(status2Id) + } + + if status1Id != status2Id { + attr1 := ruleResource1 + "." + key1 + attr2 := ruleResource2 + "." + key2 + return fmt.Errorf("%s not equal to %s\n %s = %s\n %s = %s", attr1, attr2, attr1, status1Id, attr2, status2Id) + } + + return nil + } +} diff --git a/genesyscloud/task_management_worktype_flow_oncreate_rule/data_source_genesyscloud_task_management_oncreate_rule.go b/genesyscloud/task_management_worktype_flow_oncreate_rule/data_source_genesyscloud_task_management_oncreate_rule.go new file mode 100644 index 000000000..65dbf871c --- /dev/null +++ b/genesyscloud/task_management_worktype_flow_oncreate_rule/data_source_genesyscloud_task_management_oncreate_rule.go @@ -0,0 +1,43 @@ +package task_management_worktype_flow_oncreate_rule + +import ( + "context" + "fmt" + "terraform-provider-genesyscloud/genesyscloud/provider" + "terraform-provider-genesyscloud/genesyscloud/util" + "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" +) + +/* + The data_source_genesyscloud_task_management_oncreate_rule.go contains the data source implementation + for the resource. +*/ + +// dataSourceTaskManagementOnCreateRuleRead retrieves by name the id in question +func dataSourceTaskManagementOnCreateRuleRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + sdkConfig := meta.(*provider.ProviderMeta).ClientConfig + proxy := getTaskManagementOnCreateRuleProxy(sdkConfig) + + name := d.Get("name").(string) + typeId := d.Get("worktype_id").(string) + + return util.WithRetries(ctx, 15*time.Second, func() *retry.RetryError { + onCreateRuleId, retryable, resp, err := proxy.getTaskManagementOnCreateRuleIdByName(ctx, typeId, name) + + if err != nil { + if retryable { + return retry.RetryableError(util.BuildWithRetriesApiDiagnosticError(ResourceType, fmt.Sprintf("no task management oncreate rule found with name %s", name), resp)) + } else { + return retry.NonRetryableError(util.BuildWithRetriesApiDiagnosticError(ResourceType, fmt.Sprintf("error searching task management oncreate rule %s | error: %s", name, err), resp)) + } + } + + d.SetId(onCreateRuleId) + return nil + }) +} diff --git a/genesyscloud/task_management_worktype_flow_oncreate_rule/data_source_genesyscloud_task_management_oncreate_rule_test.go b/genesyscloud/task_management_worktype_flow_oncreate_rule/data_source_genesyscloud_task_management_oncreate_rule_test.go new file mode 100644 index 000000000..d07301184 --- /dev/null +++ b/genesyscloud/task_management_worktype_flow_oncreate_rule/data_source_genesyscloud_task_management_oncreate_rule_test.go @@ -0,0 +1,88 @@ +package task_management_worktype_flow_oncreate_rule + +import ( + "fmt" + "terraform-provider-genesyscloud/genesyscloud/provider" + workbin "terraform-provider-genesyscloud/genesyscloud/task_management_workbin" + workType "terraform-provider-genesyscloud/genesyscloud/task_management_worktype" + "terraform-provider-genesyscloud/genesyscloud/util" + "testing" + + "github.com/google/uuid" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" +) + +/* +Test Class for the task management oncreate rule Data Source +*/ + +func TestAccDataSourceTaskManagementOnCreateRule(t *testing.T) { + t.Parallel() + var ( + // Workbin + wbResourceLabel = "workbin_1" + wbName = "wb_" + uuid.NewString() + wbDescription = "workbin created for CX as Code test case" + + // Worktype + wtResourceLabel = "worktype_1" + wtName = "wt_" + uuid.NewString() + wtDescription = "test worktype description" + + // OnCreate Rule Resource + onCreateRuleResourceLabel = "oncreate_rule_resource" + onCreateRuleName = "oncreate-" + uuid.NewString() + + // OnCreate Data Source + onCreateRuleDataSourceLabel = "oncreate_rule_data" + ) + + resource.Test(t, resource.TestCase{ + PreCheck: func() { util.TestAccPreCheck(t) }, + ProviderFactories: provider.GetProviderFactories(providerResources, providerDataSources), + Steps: []resource.TestStep{ + { + Config: workbin.GenerateWorkbinResource(wbResourceLabel, wbName, wbDescription, util.NullValue) + + workType.GenerateWorktypeResourceBasic( + wtResourceLabel, + wtName, + wtDescription, + fmt.Sprintf("genesyscloud_task_management_workbin.%s.id", wbResourceLabel), + "", + ) + + GenerateOnCreateRuleResource( + onCreateRuleResourceLabel, + fmt.Sprintf("genesyscloud_task_management_worktype.%s.id", wtResourceLabel), + onCreateRuleName, + "", + ) + + generateOnCreateRuleDataSource( + onCreateRuleDataSourceLabel, + fmt.Sprintf("genesyscloud_task_management_worktype.%s.id", wtResourceLabel), + onCreateRuleName, + ResourceType+"."+onCreateRuleResourceLabel, + ), + Check: resource.ComposeTestCheckFunc( + validateRuleIds( + "data."+ResourceType+"."+onCreateRuleDataSourceLabel, "id", ResourceType+"."+onCreateRuleResourceLabel, "id", + ), + ), + }, + { + ResourceName: ResourceType + "." + onCreateRuleResourceLabel, + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +func generateOnCreateRuleDataSource(dataSourceLabel string, worktypeId string, name string, dependsOnResource string) string { + return fmt.Sprintf(`data "%s" "%s" { + worktype_id = %s + name = "%s" + depends_on=[%s] + } + `, ResourceType, dataSourceLabel, worktypeId, name, dependsOnResource) +} diff --git a/genesyscloud/task_management_worktype_flow_oncreate_rule/genesyscloud_task_management_oncreate_rule_init_test.go b/genesyscloud/task_management_worktype_flow_oncreate_rule/genesyscloud_task_management_oncreate_rule_init_test.go new file mode 100644 index 000000000..6315fa3d4 --- /dev/null +++ b/genesyscloud/task_management_worktype_flow_oncreate_rule/genesyscloud_task_management_oncreate_rule_init_test.go @@ -0,0 +1,64 @@ +package task_management_worktype_flow_oncreate_rule + +import ( + "sync" + workbin "terraform-provider-genesyscloud/genesyscloud/task_management_workbin" + worktype "terraform-provider-genesyscloud/genesyscloud/task_management_worktype" + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +/* + The genesyscloud_task_management_oncreate_rule_init_test.go file is used to initialize the data sources and resources + used in testing the task_management_worktype_flow_oncreate_rule 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[ResourceType] = ResourceTaskManagementOnCreateRule() + providerResources[worktype.ResourceType] = worktype.ResourceTaskManagementWorktype() + providerResources[workbin.ResourceType] = workbin.ResourceTaskManagementWorkbin() +} + +// registerTestDataSources registers all data sources used in the tests. +func (r *registerTestInstance) registerTestDataSources() { + r.datasourceMapMutex.Lock() + defer r.datasourceMapMutex.Unlock() + + providerDataSources[ResourceType] = DataSourceTaskManagementOnCreateRule() +} + +// initTestResources initializes all test resources and data sources. +func initTestResources() { + providerDataSources = make(map[string]*schema.Resource) + providerResources = make(map[string]*schema.Resource) + + regInstance := ®isterTestInstance{} + + 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 task_management_worktype_flow_oncreate_rule package + initTestResources() + + // Run the test suite for the task_management_worktype_flow_oncreate_rule package + m.Run() +} diff --git a/genesyscloud/task_management_worktype_flow_oncreate_rule/genesyscloud_task_management_oncreate_rule_proxy.go b/genesyscloud/task_management_worktype_flow_oncreate_rule/genesyscloud_task_management_oncreate_rule_proxy.go new file mode 100644 index 000000000..22f11c9f5 --- /dev/null +++ b/genesyscloud/task_management_worktype_flow_oncreate_rule/genesyscloud_task_management_oncreate_rule_proxy.go @@ -0,0 +1,187 @@ +package task_management_worktype_flow_oncreate_rule + +import ( + "context" + "fmt" + rc "terraform-provider-genesyscloud/genesyscloud/resource_cache" + taskManagementWorktype "terraform-provider-genesyscloud/genesyscloud/task_management_worktype" + + "github.com/mypurecloud/platform-client-sdk-go/v150/platformclientv2" +) + +/* +The genesyscloud_task_management_oncreate_rule_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 *taskManagementOnCreateRuleProxy + +// Type definitions for each func on our proxy so we can easily mock them out later +type createTaskManagementOnCreateRuleFunc func(ctx context.Context, p *taskManagementOnCreateRuleProxy, worktypeId string, onCreateRuleCreate *platformclientv2.Workitemoncreaterulecreate) (*platformclientv2.Workitemoncreaterule, *platformclientv2.APIResponse, error) +type getAllTaskManagementOnCreateRuleFunc func(ctx context.Context, p *taskManagementOnCreateRuleProxy, worktypeId string) (*[]platformclientv2.Workitemoncreaterule, *platformclientv2.APIResponse, error) +type getTaskManagementOnCreateRuleIdByNameFunc func(ctx context.Context, p *taskManagementOnCreateRuleProxy, worktypeId string, name string) (id string, retryable bool, resp *platformclientv2.APIResponse, err error) +type getTaskManagementOnCreateRuleByIdFunc func(ctx context.Context, p *taskManagementOnCreateRuleProxy, worktypeId string, id string) (worktype *platformclientv2.Workitemoncreaterule, response *platformclientv2.APIResponse, err error) +type updateTaskManagementOnCreateRuleFunc func(ctx context.Context, p *taskManagementOnCreateRuleProxy, worktypeId string, id string, onCreateRuleUpdate *platformclientv2.Workitemoncreateruleupdate) (*platformclientv2.Workitemoncreaterule, *platformclientv2.APIResponse, error) +type deleteTaskManagementOnCreateRuleFunc func(ctx context.Context, p *taskManagementOnCreateRuleProxy, worktypeId string, id string) (response *platformclientv2.APIResponse, err error) + +// taskManagementOnCreateRuleProxy contains all the methods that call genesys cloud APIs. +type taskManagementOnCreateRuleProxy struct { + clientConfig *platformclientv2.Configuration + taskManagementApi *platformclientv2.TaskManagementApi + worktypeProxy *taskManagementWorktype.TaskManagementWorktypeProxy + createTaskManagementOnCreateRuleAttr createTaskManagementOnCreateRuleFunc + getAllTaskManagementOnCreateRuleAttr getAllTaskManagementOnCreateRuleFunc + getTaskManagementOnCreateRuleIdByNameAttr getTaskManagementOnCreateRuleIdByNameFunc + getTaskManagementOnCreateRuleByIdAttr getTaskManagementOnCreateRuleByIdFunc + updateTaskManagementOnCreateRuleAttr updateTaskManagementOnCreateRuleFunc + deleteTaskManagementOnCreateRuleAttr deleteTaskManagementOnCreateRuleFunc + onCreateRuleCache rc.CacheInterface[platformclientv2.Workitemoncreaterule] +} + +// newTaskManagementOnCreateRuleProxy initializes the task management worktype proxy with all the data needed to communicate with Genesys Cloud +func newTaskManagementOnCreateRuleProxy(clientConfig *platformclientv2.Configuration) *taskManagementOnCreateRuleProxy { + api := platformclientv2.NewTaskManagementApiWithConfig(clientConfig) + onCreateRuleCache := rc.NewResourceCache[platformclientv2.Workitemoncreaterule]() + taskmanagementProxy := taskManagementWorktype.GetTaskManagementWorktypeProxy(clientConfig) + return &taskManagementOnCreateRuleProxy{ + clientConfig: clientConfig, + taskManagementApi: api, + worktypeProxy: taskmanagementProxy, + createTaskManagementOnCreateRuleAttr: createTaskManagementOnCreateRuleFn, + getAllTaskManagementOnCreateRuleAttr: getAllTaskManagementOnCreateRuleFn, + getTaskManagementOnCreateRuleIdByNameAttr: getTaskManagementOnCreateRuleIdByNameFn, + getTaskManagementOnCreateRuleByIdAttr: getTaskManagementOnCreateRuleByIdFn, + updateTaskManagementOnCreateRuleAttr: updateTaskManagementOnCreateRuleFn, + deleteTaskManagementOnCreateRuleAttr: deleteTaskManagementOnCreateRuleFn, + onCreateRuleCache: onCreateRuleCache, + } +} + +// GetTaskManagementOnCreateRuleProxy 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 getTaskManagementOnCreateRuleProxy(clientConfig *platformclientv2.Configuration) *taskManagementOnCreateRuleProxy { + if internalProxy == nil { + internalProxy = newTaskManagementOnCreateRuleProxy(clientConfig) + } + return internalProxy +} + +// createTaskManagementOnCreateRule creates a Genesys Cloud task management oncreate rule +func (p *taskManagementOnCreateRuleProxy) createTaskManagementOnCreateRule(ctx context.Context, worktypeId string, onCreateRuleCreate *platformclientv2.Workitemoncreaterulecreate) (*platformclientv2.Workitemoncreaterule, *platformclientv2.APIResponse, error) { + return p.createTaskManagementOnCreateRuleAttr(ctx, p, worktypeId, onCreateRuleCreate) +} + +// GetAllTaskManagementOnCreateRule retrieves all Genesys Cloud task management oncreate rule +func (p *taskManagementOnCreateRuleProxy) getAllTaskManagementOnCreateRule(ctx context.Context, worktypeId string) (*[]platformclientv2.Workitemoncreaterule, *platformclientv2.APIResponse, error) { + return p.getAllTaskManagementOnCreateRuleAttr(ctx, p, worktypeId) +} + +// getTaskManagementOnCreateRuleIdByName returns a single Genesys Cloud task management oncreate rule by a name +func (p *taskManagementOnCreateRuleProxy) getTaskManagementOnCreateRuleIdByName(ctx context.Context, worktypeId string, name string) (id string, retryable bool, resp *platformclientv2.APIResponse, err error) { + return p.getTaskManagementOnCreateRuleIdByNameAttr(ctx, p, worktypeId, name) +} + +// GetTaskManagementOnCreateRuleById returns a single Genesys Cloud task management oncreate rule by Id +func (p *taskManagementOnCreateRuleProxy) getTaskManagementOnCreateRuleById(ctx context.Context, worktypeId string, id string) (taskManagementOnCreateRule *platformclientv2.Workitemoncreaterule, resp *platformclientv2.APIResponse, err error) { + return p.getTaskManagementOnCreateRuleByIdAttr(ctx, p, worktypeId, id) +} + +// UpdateTaskManagementOnCreateRule updates a Genesys Cloud task management oncreate rule +func (p *taskManagementOnCreateRuleProxy) updateTaskManagementOnCreateRule(ctx context.Context, worktypeId string, id string, onCreateRuleUpdate *platformclientv2.Workitemoncreateruleupdate) (*platformclientv2.Workitemoncreaterule, *platformclientv2.APIResponse, error) { + return p.updateTaskManagementOnCreateRuleAttr(ctx, p, worktypeId, id, onCreateRuleUpdate) +} + +// deleteTaskManagementOnCreateRule deletes a Genesys Cloud task management oncreate rule by Id +func (p *taskManagementOnCreateRuleProxy) deleteTaskManagementOnCreateRule(ctx context.Context, worktypeId string, id string) (resp *platformclientv2.APIResponse, err error) { + return p.deleteTaskManagementOnCreateRuleAttr(ctx, p, worktypeId, id) +} + +// createTaskManagementOnCreateRuleFn is an implementation function for creating a Genesys Cloud task management oncreate rule +func createTaskManagementOnCreateRuleFn(ctx context.Context, p *taskManagementOnCreateRuleProxy, worktypeId string, onCreateRuleCreate *platformclientv2.Workitemoncreaterulecreate) (*platformclientv2.Workitemoncreaterule, *platformclientv2.APIResponse, error) { + return p.taskManagementApi.PostTaskmanagementWorktypeFlowsOncreateRules(worktypeId, *onCreateRuleCreate) +} + +// getAllTaskManagementOnCreateRuleFn is the implementation for retrieving all task management oncreate rules in Genesys Cloud +func getAllTaskManagementOnCreateRuleFn(ctx context.Context, p *taskManagementOnCreateRuleProxy, worktypeId string) (*[]platformclientv2.Workitemoncreaterule, *platformclientv2.APIResponse, error) { + const pageSize = 200 + var ( + allOnCreateRules []platformclientv2.Workitemoncreaterule + after = "" + response *platformclientv2.APIResponse + ) + for { + onCreateRules, resp, err := p.taskManagementApi.GetTaskmanagementWorktypeFlowsOncreateRules(worktypeId, after, pageSize) + response = resp + if err != nil { + return nil, resp, fmt.Errorf("failed to get oncreate rules: %v", err) + } + if onCreateRules.Entities != nil && len(*onCreateRules.Entities) > 0 { + allOnCreateRules = append(allOnCreateRules, *onCreateRules.Entities...) + } + + // Exit loop if there are no more 'pages' + if onCreateRules.After == nil || *onCreateRules.After == "" { + break + } + after = *onCreateRules.After + } + return &allOnCreateRules, response, nil +} + +// getTaskManagementOnCreateRuleIdByNameFn is an implementation of the function to get a Genesys Cloud task management oncreate rule by name +func getTaskManagementOnCreateRuleIdByNameFn(ctx context.Context, p *taskManagementOnCreateRuleProxy, worktypeId string, name string) (id string, retryable bool, resp *platformclientv2.APIResponse, err error) { + const pageSize = 200 + var ( + after = "" + response *platformclientv2.APIResponse + ) + for { + onCreateRules, resp, err := p.taskManagementApi.GetTaskmanagementWorktypeFlowsOncreateRules(worktypeId, after, pageSize) + response = resp + if err != nil { + return "", false, resp, fmt.Errorf("failed to get oncreate rules: %v", err) + } + + if onCreateRules.Entities != nil && len(*onCreateRules.Entities) > 0 { + for i := 0; i < len(*onCreateRules.Entities); i++ { + onCreateRule := (*onCreateRules.Entities)[i] + if *onCreateRule.Name == name { + return *onCreateRule.Id, false, resp, nil + } + } + } + + // Exit loop if there are no more 'pages' + if onCreateRules.After == nil || *onCreateRules.After == "" { + break + } + after = *onCreateRules.After + } + return "", true, response, fmt.Errorf("no task management oncreate rules found with name %s", name) +} + +// getTaskManagementOnCreateRuleByIdFn is an implementation of the function to get a Genesys Cloud task management oncreate rule by Id +func getTaskManagementOnCreateRuleByIdFn(ctx context.Context, p *taskManagementOnCreateRuleProxy, worktypeId string, id string) (taskManagementOnCreateRule *platformclientv2.Workitemoncreaterule, resp *platformclientv2.APIResponse, err error) { + onCreateRule := rc.GetCacheItem(p.onCreateRuleCache, id) + if onCreateRule != nil { + return onCreateRule, nil, nil + } + + return p.taskManagementApi.GetTaskmanagementWorktypeFlowsOncreateRule(worktypeId, id) +} + +// updateTaskManagementOnCreateRuleFn is an implementation of the function to update a Genesys Cloud task management oncreate rule +func updateTaskManagementOnCreateRuleFn(ctx context.Context, p *taskManagementOnCreateRuleProxy, worktypeId string, id string, onCreateRuleUpdate *platformclientv2.Workitemoncreateruleupdate) (*platformclientv2.Workitemoncreaterule, *platformclientv2.APIResponse, error) { + return p.taskManagementApi.PatchTaskmanagementWorktypeFlowsOncreateRule(worktypeId, id, *onCreateRuleUpdate) +} + +// deleteTaskManagementOnCreateRuleFn is an implementation function for deleting a Genesys Cloud task management oncreate rule +func deleteTaskManagementOnCreateRuleFn(ctx context.Context, p *taskManagementOnCreateRuleProxy, worktypeId string, id string) (resp *platformclientv2.APIResponse, err error) { + resp, err = p.taskManagementApi.DeleteTaskmanagementWorktypeFlowsOncreateRule(worktypeId, id) + if err == nil { + rc.DeleteCacheItem(p.onCreateRuleCache, id) + } + return resp, err +} diff --git a/genesyscloud/task_management_worktype_flow_oncreate_rule/resource_genesyscloud_task_management_oncreate_rule.go b/genesyscloud/task_management_worktype_flow_oncreate_rule/resource_genesyscloud_task_management_oncreate_rule.go new file mode 100644 index 000000000..1a3172e0f --- /dev/null +++ b/genesyscloud/task_management_worktype_flow_oncreate_rule/resource_genesyscloud_task_management_oncreate_rule.go @@ -0,0 +1,146 @@ +package task_management_worktype_flow_oncreate_rule + +import ( + "context" + "fmt" + "log" + "terraform-provider-genesyscloud/genesyscloud/provider" + resourceExporter "terraform-provider-genesyscloud/genesyscloud/resource_exporter" + "terraform-provider-genesyscloud/genesyscloud/util" + "terraform-provider-genesyscloud/genesyscloud/util/constants" + "time" + + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/mypurecloud/platform-client-sdk-go/v150/platformclientv2" + + "terraform-provider-genesyscloud/genesyscloud/consistency_checker" + + "terraform-provider-genesyscloud/genesyscloud/util/resourcedata" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/retry" +) + +/* +The resource_genesyscloud_task_management_oncreate_rule.go contains all of the methods that perform the core logic for a resource. +*/ + +// getAllAuthTaskManagementOnCreateRule retrieves all of the task management oncreate Rules via Terraform in the Genesys Cloud and is used for the exporter +func getAllAuthTaskManagementOnCreateRule(ctx context.Context, clientConfig *platformclientv2.Configuration) (resourceExporter.ResourceIDMetaMap, diag.Diagnostics) { + proxy := getTaskManagementOnCreateRuleProxy(clientConfig) + resources := make(resourceExporter.ResourceIDMetaMap) + + worktypes, resp, err := proxy.worktypeProxy.GetAllTaskManagementWorktype(ctx) + if err != nil { + return nil, util.BuildAPIDiagnosticError(ResourceType, fmt.Sprintf("Failed to get task management worktypes: %v", err), resp) + } + if worktypes == nil { + return resources, nil + } + + for _, worktype := range *worktypes { + onCreateRules, resp, err := proxy.getAllTaskManagementOnCreateRule(ctx, *worktype.Id) + if err != nil { + return nil, util.BuildAPIDiagnosticError(ResourceType, fmt.Sprintf("Failed to get task management oncreate rules error: %s", err), resp) + } + if onCreateRules == nil { + continue + } + + for _, onCreateRule := range *onCreateRules { + resources[composeWorktypeBasedTerraformId(*worktype.Id, *onCreateRule.Id)] = &resourceExporter.ResourceMeta{BlockLabel: *onCreateRule.Name} + } + } + return resources, nil +} + +// createTaskManagementOnCreateRule is used by the task_management_worktype_flow_oncreate_rule resource to create Genesys cloud task management oncreate rule +func createTaskManagementOnCreateRule(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + sdkConfig := meta.(*provider.ProviderMeta).ClientConfig + proxy := getTaskManagementOnCreateRuleProxy(sdkConfig) + + worktypeId := d.Get("worktype_id").(string) + workitemOnCreateRuleCreate := getWorkitemoncreaterulecreateFromResourceData(d) + + log.Printf("Creating task management oncreate rule %s for worktype %s", *workitemOnCreateRuleCreate.Name, worktypeId) + onCreateRule, resp, err := proxy.createTaskManagementOnCreateRule(ctx, worktypeId, &workitemOnCreateRuleCreate) + if err != nil { + return util.BuildAPIDiagnosticError(ResourceType, fmt.Sprintf("Failed to create task management oncreate rule %s error: %s", *workitemOnCreateRuleCreate.Name, err), resp) + } + log.Printf("Created the base task management oncreate rule %s for worktype %s", *onCreateRule.Id, worktypeId) + + d.SetId(composeWorktypeBasedTerraformId(worktypeId, *onCreateRule.Id)) + + return readTaskManagementOnCreateRule(ctx, d, meta) +} + +// readTaskManagementOnCreateRule is used by the task_management_worktype_flow_oncreate_rule resource to read a task management oncreate rule from genesys cloud +func readTaskManagementOnCreateRule(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + sdkConfig := meta.(*provider.ProviderMeta).ClientConfig + proxy := getTaskManagementOnCreateRuleProxy(sdkConfig) + cc := consistency_checker.NewConsistencyCheck(ctx, d, meta, ResourceTaskManagementOnCreateRule(), constants.ConsistencyChecks(), ResourceType) + + worktypeId, id := splitWorktypeBasedTerraformId(d.Id()) + + log.Printf("Reading task management oncreate rule %s for worktype %s", id, worktypeId) + return util.WithRetriesForRead(ctx, d, func() *retry.RetryError { + onCreateRule, resp, getErr := proxy.getTaskManagementOnCreateRuleById(ctx, worktypeId, id) + if getErr != nil { + if util.IsStatus404(resp) { + return retry.RetryableError(util.BuildWithRetriesApiDiagnosticError(ResourceType, fmt.Sprintf("failed to read task management oncreate rule %s for worktype %s | error: %s", id, worktypeId, getErr), resp)) + } + return retry.NonRetryableError(util.BuildWithRetriesApiDiagnosticError(ResourceType, fmt.Sprintf("failed to read task management oncreate rule %s for worktype %s | error: %s", id, worktypeId, getErr), resp)) + } + + resourcedata.SetNillableValue(d, "name", onCreateRule.Name) + resourcedata.SetNillableValue(d, "worktype_id", onCreateRule.Worktype.Id) + + log.Printf("Read task management oncreate rule %s for worktype %s", id, worktypeId) + return cc.CheckState(d) + }) +} + +// updateTaskManagementOnCreateRule is used by the task_management_worktype_flow_oncreate_rule resource to update a task management oncreate rule in Genesys Cloud +func updateTaskManagementOnCreateRule(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + sdkConfig := meta.(*provider.ProviderMeta).ClientConfig + proxy := getTaskManagementOnCreateRuleProxy(sdkConfig) + + onCreateRuleUpdate := getWorkitemoncreateruleupdateFromResourceData(d) + worktypeId, id := splitWorktypeBasedTerraformId(d.Id()) + + log.Printf("Updating oncreate rule %s for worktype %s", id, worktypeId) + _, resp, err := proxy.updateTaskManagementOnCreateRule(ctx, worktypeId, id, &onCreateRuleUpdate) + if err != nil { + return util.BuildAPIDiagnosticError(ResourceType, fmt.Sprintf("Failed to update task management oncreate rule %s for worktype %s error: %s", id, worktypeId, err), resp) + } + + log.Printf("Updated oncreate rule %s for worktype %s", id, worktypeId) + + return readTaskManagementOnCreateRule(ctx, d, meta) +} + +// deleteTaskManagementOnCreateRule is used by the task_management_worktype_flow_oncreate_rule resource to delete a task management oncreate rule from Genesys cloud +func deleteTaskManagementOnCreateRule(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + sdkConfig := meta.(*provider.ProviderMeta).ClientConfig + proxy := getTaskManagementOnCreateRuleProxy(sdkConfig) + + worktypeId, id := splitWorktypeBasedTerraformId(d.Id()) + + resp, err := proxy.deleteTaskManagementOnCreateRule(ctx, worktypeId, id) + if err != nil { + return util.BuildAPIDiagnosticError(ResourceType, fmt.Sprintf("Failed to delete task management oncreate rule %s for worktype %s error: %s", id, worktypeId, err), resp) + } + + return util.WithRetries(ctx, 180*time.Second, func() *retry.RetryError { + _, resp, err := proxy.getTaskManagementOnCreateRuleById(ctx, worktypeId, id) + + if err != nil { + if util.IsStatus404(resp) { + log.Printf("Deleted task management oncreate rule %s for worktype %s", id, worktypeId) + return nil + } + return retry.NonRetryableError(util.BuildWithRetriesApiDiagnosticError(ResourceType, fmt.Sprintf("error deleting task management oncreate rule %s for worktype %s | error: %s", id, worktypeId, err), resp)) + } + return retry.RetryableError(util.BuildWithRetriesApiDiagnosticError(ResourceType, fmt.Sprintf("task management oncreate rule %s still exists", id), resp)) + }) +} diff --git a/genesyscloud/task_management_worktype_flow_oncreate_rule/resource_genesyscloud_task_management_oncreate_rule_schema.go b/genesyscloud/task_management_worktype_flow_oncreate_rule/resource_genesyscloud_task_management_oncreate_rule_schema.go new file mode 100644 index 000000000..de648a2e1 --- /dev/null +++ b/genesyscloud/task_management_worktype_flow_oncreate_rule/resource_genesyscloud_task_management_oncreate_rule_schema.go @@ -0,0 +1,88 @@ +package task_management_worktype_flow_oncreate_rule + +import ( + "terraform-provider-genesyscloud/genesyscloud/provider" + resourceExporter "terraform-provider-genesyscloud/genesyscloud/resource_exporter" + registrar "terraform-provider-genesyscloud/genesyscloud/resource_register" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +/* +resource_genesycloud_task_management_oncreate_rule_schema.go holds four functions within it: + +1. The registration code that registers the Datasource, Resource and Exporter for the package. +2. The resource schema definitions for the task_management_worktype_flow_oncreate_rule resource. +3. The datasource schema definitions for the task_management_worktype_flow_oncreate_rule datasource. +4. The resource exporter configuration for the task_management_worktype_flow_oncreate_rule exporter. +*/ +const ResourceType = "genesyscloud_task_management_worktype_flow_oncreate_rule" + +// SetRegistrar registers all of the resources, datasources and exporters in the package +func SetRegistrar(regInstance registrar.Registrar) { + regInstance.RegisterResource(ResourceType, ResourceTaskManagementOnCreateRule()) + regInstance.RegisterDataSource(ResourceType, DataSourceTaskManagementOnCreateRule()) + regInstance.RegisterExporter(ResourceType, TaskManagementOnCreateRuleExporter()) +} + +// ResourceTaskManagementOnCreateRule registers the genesyscloud_task_management_worktype_flow_oncreate_rule resource with Terraform +func ResourceTaskManagementOnCreateRule() *schema.Resource { + return &schema.Resource{ + Description: `Genesys Cloud task management oncreate Rule`, + + CreateContext: provider.CreateWithPooledClient(createTaskManagementOnCreateRule), + ReadContext: provider.ReadWithPooledClient(readTaskManagementOnCreateRule), + UpdateContext: provider.UpdateWithPooledClient(updateTaskManagementOnCreateRule), + DeleteContext: provider.DeleteWithPooledClient(deleteTaskManagementOnCreateRule), + Importer: &schema.ResourceImporter{ + StateContext: schema.ImportStatePassthroughContext, + }, + SchemaVersion: 1, + Schema: map[string]*schema.Schema{ + `name`: { + Description: `The name of the Rule.`, + Required: true, + Type: schema.TypeString, + }, + `worktype_id`: { + Description: `The Worktype ID of the Rule.`, + Required: true, + ForceNew: true, + Type: schema.TypeString, + }, + }, + } +} + +// TaskManagementOnCreateRuleExporter returns the resourceExporter object used to hold the genesyscloud_task_management_worktype_flow_oncreate_rule exporter's config +func TaskManagementOnCreateRuleExporter() *resourceExporter.ResourceExporter { + return &resourceExporter.ResourceExporter{ + GetResourcesFunc: provider.GetAllWithPooledClient(getAllAuthTaskManagementOnCreateRule), + RefAttrs: map[string]*resourceExporter.RefAttrSettings{ + "worktype_id": {RefType: "genesyscloud_task_management_worktype"}, + }, + } +} + +// DataSourceTaskManagementOnCreateRule registers the genesyscloud_task_management_worktype_flow_oncreate_rule data source +func DataSourceTaskManagementOnCreateRule() *schema.Resource { + return &schema.Resource{ + Description: `Genesys Cloud task management oncreate rule data source. Select a task management oncreate rule by name`, + ReadContext: provider.ReadWithPooledClient(dataSourceTaskManagementOnCreateRuleRead), + Importer: &schema.ResourceImporter{ + StateContext: schema.ImportStatePassthroughContext, + }, + Schema: map[string]*schema.Schema{ + "name": { + Description: `Task management oncreate rule name`, + Type: schema.TypeString, + Required: true, + }, + `worktype_id`: { + Description: `The Worktype ID of the Rule.`, + Required: true, + Type: schema.TypeString, + }, + }, + } +} diff --git a/genesyscloud/task_management_worktype_flow_oncreate_rule/resource_genesyscloud_task_management_oncreate_rule_test.go b/genesyscloud/task_management_worktype_flow_oncreate_rule/resource_genesyscloud_task_management_oncreate_rule_test.go new file mode 100644 index 000000000..df39f8666 --- /dev/null +++ b/genesyscloud/task_management_worktype_flow_oncreate_rule/resource_genesyscloud_task_management_oncreate_rule_test.go @@ -0,0 +1,119 @@ +package task_management_worktype_flow_oncreate_rule + +import ( + "fmt" + "terraform-provider-genesyscloud/genesyscloud/provider" + workbin "terraform-provider-genesyscloud/genesyscloud/task_management_workbin" + workType "terraform-provider-genesyscloud/genesyscloud/task_management_worktype" + "terraform-provider-genesyscloud/genesyscloud/util" + "testing" + + "github.com/google/uuid" + "github.com/mypurecloud/platform-client-sdk-go/v150/platformclientv2" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + + "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" +) + +/* +The resource_genesyscloud_task_management_oncreate_rule_test.go contains all of the test cases for running the resource +tests for task_management_worktype_flow_oncreate_rule. +*/ + +func TestAccResourceTaskManagementOnCreateRule(t *testing.T) { + t.Parallel() + var ( + // Workbin + wbResourceLabel = "workbin_1" + wbName = "wb_" + uuid.NewString() + wbDescription = "workbin created for CX as Code test case" + + // Worktype + wtResourceLabel = "worktype_1" + wtName = "wt_" + uuid.NewString() + wtDescription = "test worktype description" + + // OnCreate Rule Resource + onCreateRuleResourceLabel = "oncreate_rule_resource" + onCreateRuleName = "oncreate-" + uuid.NewString() + onCreateRuleName2 = "oncreate2-" + uuid.NewString() + ) + + resource.Test(t, resource.TestCase{ + PreCheck: func() { util.TestAccPreCheck(t) }, + ProviderFactories: provider.GetProviderFactories(providerResources, providerDataSources), + Steps: []resource.TestStep{ + { + // Create worktype status + Config: workbin.GenerateWorkbinResource(wbResourceLabel, wbName, wbDescription, util.NullValue) + + workType.GenerateWorktypeResourceBasic( + wtResourceLabel, + wtName, + wtDescription, + fmt.Sprintf("genesyscloud_task_management_workbin.%s.id", wbResourceLabel), + "", + ) + + GenerateOnCreateRuleResource( + onCreateRuleResourceLabel, + fmt.Sprintf("genesyscloud_task_management_worktype.%s.id", wtResourceLabel), + onCreateRuleName, + "", + ), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrPair(ResourceType+"."+onCreateRuleResourceLabel, "worktype_id", fmt.Sprintf("genesyscloud_task_management_worktype.%s", wtResourceLabel), "id"), + resource.TestCheckResourceAttr(ResourceType+"."+onCreateRuleResourceLabel, "name", onCreateRuleName), + ), + }, + { + // Update oncreate rule + Config: workbin.GenerateWorkbinResource(wbResourceLabel, wbName, wbDescription, util.NullValue) + + workType.GenerateWorktypeResourceBasic( + wtResourceLabel, + wtName, + wtDescription, + fmt.Sprintf("genesyscloud_task_management_workbin.%s.id", wbResourceLabel), + "", + ) + + GenerateOnCreateRuleResource( + onCreateRuleResourceLabel, + fmt.Sprintf("genesyscloud_task_management_worktype.%s.id", wtResourceLabel), + onCreateRuleName2, + "", + ), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr(ResourceType+"."+onCreateRuleResourceLabel, "name", onCreateRuleName2), + ), + }, + { + ResourceName: ResourceType + "." + onCreateRuleResourceLabel, + ImportState: true, + ImportStateVerify: true, + }, + }, + CheckDestroy: testVerifyTaskManagementOnCreateRuleDestroyed, + }) +} + +func testVerifyTaskManagementOnCreateRuleDestroyed(state *terraform.State) error { + taskManagementApi := platformclientv2.NewTaskManagementApi() + for _, res := range state.RootModule().Resources { + if res.Type != ResourceType { + continue + } + + worktypeId, onCreateRuleId := splitWorktypeBasedTerraformId(res.Primary.ID) + onCreateRule, resp, err := taskManagementApi.GetTaskmanagementWorktypeFlowsOncreateRule(worktypeId, onCreateRuleId) + if onCreateRule != nil { + return fmt.Errorf("task management oncreate rule (%s) still exists", res.Primary.ID) + } else if util.IsStatus404(resp) { + // Worktype no found, as expected + continue + } else { + return fmt.Errorf("unexpected error: %s", err) + } + } + + // All oncreate rules deleted + return nil +} diff --git a/genesyscloud/task_management_worktype_flow_oncreate_rule/resource_genesyscloud_task_management_oncreate_rule_utils.go b/genesyscloud/task_management_worktype_flow_oncreate_rule/resource_genesyscloud_task_management_oncreate_rule_utils.go new file mode 100644 index 000000000..9f1278bfb --- /dev/null +++ b/genesyscloud/task_management_worktype_flow_oncreate_rule/resource_genesyscloud_task_management_oncreate_rule_utils.go @@ -0,0 +1,100 @@ +package task_management_worktype_flow_oncreate_rule + +import ( + "fmt" + "log" + "strings" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/mypurecloud/platform-client-sdk-go/v150/platformclientv2" +) + +/* +The resource_genesyscloud_task_management_oncreate_rule_utils.go file contains various helper methods to marshal +and unmarshal data into formats consumable by Terraform and/or Genesys Cloud. +*/ + +func GenerateOnCreateRuleResource( + resourceLabel, + worktypeId, + name string, + attrs ...string, +) string { + return fmt.Sprintf( + `resource "genesyscloud_task_management_worktype_flow_oncreate_rule" "%s" { + worktype_id = %s + name = "%s" + %s + } + `, resourceLabel, worktypeId, name, strings.Join(attrs, "\n")) +} + +// getWorkitemoncreaterulecreateFromResourceData maps data from schema ResourceData object to a platformclientv2.Workitemoncreaterulecreate +func getWorkitemoncreaterulecreateFromResourceData(d *schema.ResourceData) platformclientv2.Workitemoncreaterulecreate { + onCreateRule := platformclientv2.Workitemoncreaterulecreate{ + Name: platformclientv2.String(d.Get("name").(string)), + } + + return onCreateRule +} + +// getWorkitemoncreateruleupdateFromResourceData maps data from schema ResourceData object to a platformclientv2.Workitemoncreateruleupdate +func getWorkitemoncreateruleupdateFromResourceData(d *schema.ResourceData) platformclientv2.Workitemoncreateruleupdate { + onCreateRuleUpdate := platformclientv2.Workitemoncreateruleupdate{} + if d.HasChange("name") { + onCreateRuleUpdate.SetField("Name", platformclientv2.String(d.Get("name").(string))) + } + return onCreateRuleUpdate +} + +// splitWorktypeBasedTerraformId will split the rule resource id which is in the form +// / into just the worktypeId and ruleId string +func splitWorktypeBasedTerraformId(composedId string) (worktypeId string, ruleId string) { + if len(strings.Split(composedId, "/")) > 1 { + return strings.Split(composedId, "/")[0], strings.Split(composedId, "/")[1] + } else { + log.Printf("Invalid composedId %s", composedId) + return "", "" + } +} + +// composeWorktypeBasedTerraformId will compose the rule resource id in the form / +func composeWorktypeBasedTerraformId(worktypeId string, id string) (composedId string) { + return worktypeId + "/" + id +} + +// ValidateRuleIds will check that two status ids are the same +// The id could be in the format / +func validateRuleIds(ruleResource1 string, key1 string, ruleResource2 string, key2 string) resource.TestCheckFunc { + return func(state *terraform.State) error { + rule1, ok := state.RootModule().Resources[ruleResource1] + if !ok { + return fmt.Errorf("failed to find rule %s", ruleResource1) + } + + rule2, ok := state.RootModule().Resources[ruleResource2] + if !ok { + return fmt.Errorf("failed to find rule %s", ruleResource2) + } + + status1Id := rule1.Primary.Attributes[key1] + if strings.Contains(status1Id, "/") { + _, status1Id = splitWorktypeBasedTerraformId(status1Id) + } + + status2Id := rule2.Primary.Attributes[key2] + if strings.Contains(status2Id, "/") { + _, status2Id = splitWorktypeBasedTerraformId(status2Id) + } + + if status1Id != status2Id { + attr1 := ruleResource1 + "." + key1 + attr2 := ruleResource2 + "." + key2 + return fmt.Errorf("%s not equal to %s\n %s = %s\n %s = %s", attr1, attr2, attr1, status1Id, attr2, status2Id) + } + + return nil + } +} diff --git a/genesyscloud/task_management_worktype_status/data_source_genesyscloud_task_management_worktype_status_test.go b/genesyscloud/task_management_worktype_status/data_source_genesyscloud_task_management_worktype_status_test.go index e214b1f8f..09fb762ae 100644 --- a/genesyscloud/task_management_worktype_status/data_source_genesyscloud_task_management_worktype_status_test.go +++ b/genesyscloud/task_management_worktype_status/data_source_genesyscloud_task_management_worktype_status_test.go @@ -57,7 +57,6 @@ func TestAccDataSourceTaskManagementWorktypeStatus(t *testing.T) { wtName, wtDescription, fmt.Sprintf("genesyscloud_task_management_workbin.%s.id", wbResourceLabel), - fmt.Sprintf("genesyscloud_task_management_workitem_schema.%s.id", wsResourceLabel), "", ) + GenerateWorktypeStatusResource( diff --git a/genesyscloud/task_management_worktype_status/resource_genesyscloud_task_management_worktype_status_test.go b/genesyscloud/task_management_worktype_status/resource_genesyscloud_task_management_worktype_status_test.go index 44c31725c..117899308 100644 --- a/genesyscloud/task_management_worktype_status/resource_genesyscloud_task_management_worktype_status_test.go +++ b/genesyscloud/task_management_worktype_status/resource_genesyscloud_task_management_worktype_status_test.go @@ -67,7 +67,6 @@ func TestAccResourceTaskManagementWorktypeStatus(t *testing.T) { wtName, wtDescription, fmt.Sprintf("genesyscloud_task_management_workbin.%s.id", wbResourceLabel), - fmt.Sprintf("genesyscloud_task_management_workitem_schema.%s.id", wsResourceLabel), "", ) + GenerateWorktypeStatusResource( @@ -97,7 +96,6 @@ func TestAccResourceTaskManagementWorktypeStatus(t *testing.T) { wtName, wtDescription, fmt.Sprintf("genesyscloud_task_management_workbin.%s.id", wbResourceLabel), - fmt.Sprintf("genesyscloud_task_management_workitem_schema.%s.id", wsResourceLabel), "", ) + GenerateWorktypeStatusResource( diff --git a/main.go b/main.go index 590d66079..ffd0c9251 100644 --- a/main.go +++ b/main.go @@ -100,6 +100,9 @@ import ( workitem "terraform-provider-genesyscloud/genesyscloud/task_management_workitem" workitemSchema "terraform-provider-genesyscloud/genesyscloud/task_management_workitem_schema" worktype "terraform-provider-genesyscloud/genesyscloud/task_management_worktype" + workitemDateBasedRule "terraform-provider-genesyscloud/genesyscloud/task_management_worktype_flow_datebased_rule" + workitemOnAttributeChangeRule "terraform-provider-genesyscloud/genesyscloud/task_management_worktype_flow_onattributechange_rule" + workitemOnCreateRule "terraform-provider-genesyscloud/genesyscloud/task_management_worktype_flow_oncreate_rule" worktypeStatus "terraform-provider-genesyscloud/genesyscloud/task_management_worktype_status" "terraform-provider-genesyscloud/genesyscloud/team" "terraform-provider-genesyscloud/genesyscloud/telephony_provider_edges_trunkbasesettings" @@ -246,6 +249,9 @@ func registerResources() { worktype.SetRegistrar(regInstance) //Registering task management worktype worktypeStatus.SetRegistrar(regInstance) //Registering task management worktype status workitem.SetRegistrar(regInstance) //Registering task management workitem + workitemOnCreateRule.SetRegistrar(regInstance) //Registering task management oncreate rule + workitemOnAttributeChangeRule.SetRegistrar(regInstance) //Registering task management onattributechange rule + workitemDateBasedRule.SetRegistrar(regInstance) //Registering task management datebased rule externalContacts.SetRegistrar(regInstance) //Registering external contacts team.SetRegistrar(regInstance) //Registering team telephony_provider_edges_trunkbasesettings.SetRegistrar(regInstance) //Registering telephony_provider_edges_trunkbasesettings package