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 }