From f7bb5f0e32fab44f477a1f8efb2bfbb3f205fcda Mon Sep 17 00:00:00 2001 From: Utkarsh Raj Date: Mon, 14 Oct 2024 11:33:50 +0200 Subject: [PATCH] ticket form update test --- zendesk/models/ticket_form.go | 49 +++++---- zendesk/resource_zendesk_ticket_form.go | 134 ++++++++++++++++++++++++ 2 files changed, 161 insertions(+), 22 deletions(-) diff --git a/zendesk/models/ticket_form.go b/zendesk/models/ticket_form.go index 5098e6ae..4020bf19 100644 --- a/zendesk/models/ticket_form.go +++ b/zendesk/models/ticket_form.go @@ -1,30 +1,35 @@ package models type TicketForm struct { - ID int64 `json:"id,omitempty"` - URL string `json:"url,omitempty"` - Name string `json:"name"` - RawName string `json:"raw_name,omitempty"` - DisplayName string `json:"display_name,omitempty"` - RawDisplayName string `json:"raw_display_name,omitempty"` - Position int64 `json:"position"` - Active bool `json:"active,omitempty"` - EndUserVisible bool `json:"end_user_visible,omitempty"` - Default bool `json:"default,omitempty"` - TicketFieldIDs []int64 `json:"ticket_field_ids,omitempty"` - InAllBrands bool `json:"in_all_brands,omitempty"` - RestrictedBrandIDs []int64 `json:"restricted_brand_ids,omitempty"` + ID int64 `json:"id,omitempty"` + URL string `json:"url,omitempty"` + Name string `json:"name"` + RawName string `json:"raw_name,omitempty"` + DisplayName string `json:"display_name,omitempty"` + RawDisplayName string `json:"raw_display_name,omitempty"` + Position int64 `json:"position"` + Active bool `json:"active,omitempty"` + EndUserVisible bool `json:"end_user_visible,omitempty"` + Default bool `json:"default,omitempty"` + TicketFieldIDs []int64 `json:"ticket_field_ids,omitempty"` + InAllBrands bool `json:"in_all_brands,omitempty"` + RestrictedBrandIDs []int64 `json:"restricted_brand_ids,omitempty"` + AgentConditions []AgentCondition `json:"agent_conditions,omitempty"` } -type TicketFormListOptions struct { - PageOptions - Active bool `url:"active,omitempty"` - EndUserVisible bool `url:"end_user_visible,omitempty"` - FallbackToDefault bool `url:"fallback_to_default,omitempty"` - AssociatedToBrand bool `url:"associated_to_brand,omitempty"` +type AgentCondition struct { + ParentFieldId int64 `json:"parent_field_id"` + Value string `json:"value"` + ChildFields []ChildFields `json:"child_fields"` // eg, matching_value, matching_value_1 } -type PageOptions struct { - PerPage int `url:"per_page,omitempty"` - Page int `url:"page,omitempty"` +type ChildFields struct { + Id int64 `json:"id"` + IsRequired bool `json:"is_required"` + RequiredOnStatuses RequiredOnStatuses `json:"required_on_statuses"` +} + +type RequiredOnStatuses struct { + Type string `json:"type"` // NO_STATUSES OR SOME_STATUSES OR ALL_STATUSES + Statuses []string `json:"statuses"` // eg, ["new", "pending", "open"] } diff --git a/zendesk/resource_zendesk_ticket_form.go b/zendesk/resource_zendesk_ticket_form.go index 6b8174e8..c819d432 100644 --- a/zendesk/resource_zendesk_ticket_form.go +++ b/zendesk/resource_zendesk_ticket_form.go @@ -2,6 +2,7 @@ package zendesk import ( "context" + "encoding/json" "fmt" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" @@ -95,6 +96,67 @@ func resourceZendeskTicketForm() *schema.Resource { }, Computed: true, }, + "agent_conditions": { + Description: "Array of condition sets for agent workspaces", + Type: schema.TypeSet, + Optional: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "parent_field_id": { + Description: "ID of the parent field", + Type: schema.TypeInt, + Required: true, + }, + "value": { + Description: "value", + Type: schema.TypeString, + Required: true, + }, + "child_fields": { + Description: "Child Fields", + Type: schema.TypeSet, + Required: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "id": { + Description: "", + Type: schema.TypeInt, + Required: true, + }, + "is_required": { + Description: "", + Type: schema.TypeBool, + Required: true, + }, + "required_on_statuses": { + Description: "", + Type: schema.TypeSet, + Required: true, + MaxItems: 1, // Ensures only one element is allowed + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "type": { + Description: "", + Required: true, + Type: schema.TypeString, + }, + "statuses": { + Description: "", + Optional: true, + Type: schema.TypeSet, + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, }, } } @@ -159,11 +221,78 @@ func unmarshalTicketForm(d identifiableGetterSetter) (models.TicketForm, error) } } + if v, ok := d.GetOk("agent_conditions"); ok { + agent_conditions := v.(*schema.Set).List() + for _, agent_condition := range agent_conditions { + AgentCondition := models.AgentCondition{} + AgentCondition.Value = agent_condition.(map[string]interface{})["value"].(string) + AgentCondition.ParentFieldId = int64(agent_condition.(map[string]interface{})["parent_field_id"].(int)) + ChildFields := agent_condition.(map[string]interface{})["child_fields"].(*schema.Set).List() + // for _, child_field := range agent_condition.(map[string]interface{})["child_fields"].([]interface{}) { + for _, child_field := range ChildFields { + ChildField := models.ChildFields{} + ChildField.Id = int64(child_field.(map[string]interface{})["id"].(int)) + ChildField.IsRequired = child_field.(map[string]interface{})["is_required"].(bool) + + required_on_statuses := child_field.(map[string]interface{})["required_on_statuses"].(*schema.Set).List() + + if len(required_on_statuses) > 0 { + // Extract the first element from required_on_statuses, assuming it's a slice + statusesInterface := required_on_statuses[0].(map[string]interface{})["statuses"].(*schema.Set).List() + + // Initialize a slice to hold the converted statuses + statuses := make([]string, len(statusesInterface)) + + // Loop through the []interface{} and convert each item to a string + for i, v := range statusesInterface { + statuses[i] = v.(string) // Type assert to string + } + + ChildField.RequiredOnStatuses = models.RequiredOnStatuses{ + Type: required_on_statuses[0].(map[string]interface{})["type"].(string), + Statuses: statuses, + } + } + AgentCondition.ChildFields = append(AgentCondition.ChildFields, ChildField) + } + tf.AgentConditions = append(tf.AgentConditions, AgentCondition) + } + } + return tf, nil } // marshalTicketField encodes the provided form into the provided resource data func marshalTicketForm(f models.TicketForm, d identifiableGetterSetter) error { + + var agentConditionsList []interface{} + + for _, agentCondition := range f.AgentConditions { + agentConditionMap := map[string]interface{}{ + "value": agentCondition.Value, + "parent_field_id": agentCondition.ParentFieldId, + } + + var childFieldsList []interface{} + for _, childField := range agentCondition.ChildFields { + + var requiredStatuses []interface{} + requiredStatuses = append(requiredStatuses, map[string]interface{}{ + "type": childField.RequiredOnStatuses.Type, + "statuses": childField.RequiredOnStatuses.Statuses, + }) + + childFieldMap := map[string]interface{}{ + "id": childField.Id, + "is_required": childField.IsRequired, + "required_on_statuses": requiredStatuses, + } + childFieldsList = append(childFieldsList, childFieldMap) + } + agentConditionMap["child_fields"] = childFieldsList + agentConditionsList = append(agentConditionsList, agentConditionMap) + } + fields := map[string]interface{}{ "url": f.URL, "name": f.Name, @@ -175,6 +304,7 @@ func marshalTicketForm(f models.TicketForm, d identifiableGetterSetter) error { "ticket_field_ids": f.TicketFieldIDs, "in_all_brands": f.InAllBrands, "restricted_brand_ids": f.RestrictedBrandIDs, + "agent_conditions": agentConditionsList, } err := setSchemaFields(d, fields) @@ -239,6 +369,10 @@ func updateTicketForm(ctx context.Context, d identifiableGetterSetter, zd client return diag.FromErr(err) } + jsonData, err := json.Marshal(tf) + fmt.Println("Update Processed payload: JSON") + fmt.Println(string(jsonData)) + tf, err = zd.UpdateTicketForm(ctx, tf.ID, tf) if err != nil { return diag.FromErr(err)