github.com/haagen/force@v0.19.6-0.20140911230915-22addd930b34/sobject.go (about)

     1  package main
     2  
     3  import (
     4  	"encoding/json"
     5  	"encoding/xml"
     6  	"fmt"
     7  	"html"
     8  	"io/ioutil"
     9  	"os"
    10  	"strings"
    11  )
    12  
    13  var cmdSobject = &Command{
    14  	Run:   runSobject,
    15  	Usage: "sobject",
    16  	Short: "Manage standard & custom objects",
    17  	Long: `
    18  Manage sobjects
    19  
    20  Usage:
    21  
    22    force sobject list
    23  
    24    force sobject create <object> [<field>:<type>]...
    25  
    26    force sobject delete <object>
    27  
    28    force sobject import
    29  Examples:
    30  
    31    force sobject list
    32  
    33    force sobject create Todo Description:string
    34  
    35    force sobject delete Todo
    36  `,
    37  }
    38  
    39  func runSobject(cmd *Command, args []string) {
    40  	if len(args) == 0 {
    41  		cmd.printUsage()
    42  	} else {
    43  		switch args[0] {
    44  		case "list":
    45  			runSobjectList(args[1:])
    46  		case "create", "add":
    47  			runSobjectCreate(args[1:])
    48  		case "delete", "remove":
    49  			runSobjectDelete(args[1:])
    50  		case "import":
    51  			runSobjectImport(args[1:])
    52  		default:
    53  			ErrorAndExit("no such command: %s", args[0])
    54  		}
    55  	}
    56  }
    57  
    58  func runSobjectList(args []string) {
    59  	force, _ := ActiveForce()
    60  	sobjects, err := force.ListSobjects()
    61  
    62  	l := make([]ForceSobject, 0)
    63  	for _, sobject := range sobjects {
    64  		if len(args) == 1 {
    65  			if strings.Contains(sobject["name"].(string), args[0]) {
    66  				l = append(l, sobject)
    67  			}
    68  		} else {
    69  			l = append(l, sobject)
    70  		}
    71  	}
    72  
    73  	if err != nil {
    74  		ErrorAndExit(fmt.Sprintf("ERROR: %s\n", err))
    75  	} else {
    76  		DisplayForceSobjects(l)
    77  	}
    78  }
    79  
    80  func runSobjectCreate(args []string) {
    81  	if len(args) < 1 {
    82  		ErrorAndExit("must specify object name")
    83  	}
    84  	force, _ := ActiveForce()
    85  	if err := force.Metadata.CreateCustomObject(args[0]); err != nil {
    86  		ErrorAndExit(err.Error())
    87  	}
    88  	for _, field := range args[1:] {
    89  		parts := strings.Split(field, ":")
    90  		if len(parts) != 2 {
    91  			ErrorAndExit("must specify name:type for fields")
    92  		} else {
    93  			if err := force.Metadata.CreateCustomField(fmt.Sprintf("%s__c", args[0]), parts[0], parts[1], nil); err != nil {
    94  				ErrorAndExit(err.Error())
    95  			}
    96  		}
    97  	}
    98  	args[0] = fmt.Sprintf("%s__c", args[0])
    99  
   100  	runFieldCreate(args)
   101  	fmt.Println("Custom object created")
   102  }
   103  
   104  func runSobjectDelete(args []string) {
   105  	if len(args) < 1 {
   106  		ErrorAndExit("must specify object")
   107  	}
   108  	force, _ := ActiveForce()
   109  	if err := force.Metadata.DeleteCustomObject(args[0]); err != nil {
   110  		ErrorAndExit(err.Error())
   111  	}
   112  	fmt.Println("Custom object deleted")
   113  }
   114  
   115  func runSobjectImport(args []string) {
   116  	var objectDef = `
   117  <cmd:sObjects> 
   118  	<cmd:type>%s</cmd:type>
   119  %s</cmd:sObjects>`
   120  
   121  	// Need to read the file into a query result structure
   122  	data, err := ioutil.ReadAll(os.Stdin)
   123  
   124  	var query ForceQueryResult
   125  	json.Unmarshal(data, &query)
   126  	if err != nil {
   127  		ErrorAndExit(err.Error())
   128  	}
   129  
   130  	var soapMsg = ""
   131  	var objectType = ""
   132  	for _, record := range query.Records {
   133  		var fields = ""
   134  		for key, _ := range record {
   135  			if key == "Id" {
   136  				continue
   137  			} else if key == "attributes" {
   138  				x := record[key].(map[string]interface{})
   139  				val, ok := x["type"]
   140  				if ok {
   141  					objectType, ok = val.(string)
   142  				}
   143  			} else {
   144  				if record[key] != nil {
   145  					val, ok := record[key].(string)
   146  					if ok {
   147  						fields += fmt.Sprintf("\t<%s>%s</%s>\n", key, html.EscapeString(val), key)
   148  					} else {
   149  						valf, ok := record[key].(float64)
   150  						if ok {
   151  							fields += fmt.Sprintf("\t<%s>%f</%s>\n", key, valf, key)
   152  						} else {
   153  							fields += fmt.Sprintf("\t<%s>%s</%s>\n", key, record[key].(string), key)
   154  						}
   155  					}
   156  				}
   157  			}
   158  		}
   159  		soapMsg += fmt.Sprintf(objectDef, objectType, fields)
   160  	}
   161  
   162  	force, _ := ActiveForce()
   163  	response, err := force.Partner.soapExecuteCore("create", soapMsg)
   164  
   165  	type errorData struct {
   166  		Fields     string `xml:"field"`
   167  		Message    string `xml:"message"`
   168  		StatusCode string `xml:"statusCode"`
   169  	}
   170  
   171  	type result struct {
   172  		Id      string      `xml:"id"`
   173  		Success bool        `xml:"success"`
   174  		Errors  []errorData `xml:"errors"`
   175  	}
   176  
   177  	var xmlresponse struct {
   178  		Results []result `xml:"Body>createResponse>result"`
   179  	}
   180  
   181  	xml.Unmarshal(response, &xmlresponse)
   182  
   183  	for i, res := range xmlresponse.Results {
   184  		if res.Success {
   185  			fmt.Printf("%s created successfully\n", res.Id)
   186  		} else {
   187  			for _, e := range res.Errors {
   188  				fmt.Printf("%s\n\t%s\n%s\n", e.StatusCode, e.Message, query.Records[i])
   189  			}
   190  		}
   191  	}
   192  }