Skip to content

Commit

Permalink
ticket form update test
Browse files Browse the repository at this point in the history
  • Loading branch information
clearnote01 committed Oct 14, 2024
1 parent 09ac4ea commit f7bb5f0
Show file tree
Hide file tree
Showing 2 changed files with 161 additions and 22 deletions.
49 changes: 27 additions & 22 deletions zendesk/models/ticket_form.go
Original file line number Diff line number Diff line change
@@ -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"]
}
134 changes: 134 additions & 0 deletions zendesk/resource_zendesk_ticket_form.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package zendesk

import (
"context"
"encoding/json"
"fmt"

"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
Expand Down Expand Up @@ -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,
},
},
},
},
},
},
},
},
},
},
},
},
}
}
Expand Down Expand Up @@ -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,
Expand All @@ -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)
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit f7bb5f0

Please sign in to comment.