sobject/framework.go (170 lines of code) (raw):

package sobject import ( "errors" "fmt" "regexp" "time" "github.com/elastic/go-sfdc" "github.com/elastic/go-sfdc/session" ) // ObjectURLs is the URL for the SObject metadata. type ObjectURLs struct { CompactLayouts string `json:"compactLayouts"` RowTemplate string `json:"rowTemplate"` ApprovalLayouts string `json:"approvalLayouts"` DefaultValues string `json:"defaultValues"` ListViews string `json:"listviews"` Describe string `json:"describe"` QuickActions string `json:"quickActions"` Layouts string `json:"layouts"` SObject string `json:"sobject"` UIDetailTemplate string `json:"uiDetailTemplate"` UIEditTemplate string `json:"uiEditTemplate"` UINewRecord string `json:"uiNewRecord"` } // Resources is the structure for the Salesforce APIs for SObjects. type Resources struct { metadata *metadata describe *describe dml *dml query *query } const objectEndpoint = "/sobjects/" // NewResources forms the Salesforce SObject resource structure. The // session formatter is required to form the proper URLs and authorization // header. func NewResources(session session.ServiceFormatter) (*Resources, error) { if session == nil { return nil, errors.New("sobject resource: session can not be nil") } return &Resources{ metadata: &metadata{ session: session, }, describe: &describe{ session: session, }, dml: &dml{ session: session, }, query: &query{ session: session, }, }, nil } // Metadata retrieves the SObject's metadata. func (r *Resources) Metadata(sobject string) (MetadataValue, error) { if r.metadata == nil { return MetadataValue{}, errors.New("salesforce api is not initialized properly") } matching, err := regexp.MatchString(`\w`, sobject) if err != nil { return MetadataValue{}, err } if matching == false { return MetadataValue{}, fmt.Errorf("sobject salesforce api: %s is not a valid sobject", sobject) } return r.metadata.callout(sobject) } // Describe retrieves the SObject's describe. func (r *Resources) Describe(sobject string) (DescribeValue, error) { if r.describe == nil { return DescribeValue{}, errors.New("salesforce api is not initialized properly") } matching, err := regexp.MatchString(`\w`, sobject) if err != nil { return DescribeValue{}, err } if matching == false { return DescribeValue{}, fmt.Errorf("sobject salesforce api: %s is not a valid sobject", sobject) } return r.describe.callout(sobject) } // Insert will create a new Salesforce record. func (r *Resources) Insert(inserter Inserter) (InsertValue, error) { if r.dml == nil { return InsertValue{}, errors.New("salesforce api is not initialized properly") } if inserter == nil { return InsertValue{}, errors.New("inserter can not be nil") } return r.dml.insertCallout(inserter) } // Update will update an existing Salesforce record. func (r *Resources) Update(updater Updater) error { if r.dml == nil { return errors.New("salesforce api is not initialized properly") } if updater == nil { return errors.New("updater can not be nil") } return r.dml.updateCallout(updater) } // Upsert will upsert an existing or new Salesforce record. func (r *Resources) Upsert(upserter Upserter) (UpsertValue, error) { if r.dml == nil { return UpsertValue{}, errors.New("salesforce api is not initialized properly") } if upserter == nil { return UpsertValue{}, errors.New("upserter can not be nil") } return r.dml.upsertCallout(upserter) } // Delete will delete an existing Salesforce record. func (r *Resources) Delete(deleter Deleter) error { if r.dml == nil { return errors.New("salesforce api is not initialized properly") } if deleter == nil { return errors.New("deleter can not be nil") } return r.dml.deleteCallout(deleter) } // Query returns a SObject record using the Salesforce ID. func (r *Resources) Query(querier Querier) (*sfdc.Record, error) { if r.query == nil { return nil, errors.New("salesforce api is not initialized properly") } if querier == nil { return nil, errors.New("querier can not be nil") } return r.query.callout(querier) } // ExternalQuery returns a SObject record using an external ID field. func (r *Resources) ExternalQuery(querier ExternalQuerier) (*sfdc.Record, error) { if r.query == nil { return nil, errors.New("salesforce api is not initialized properly") } if querier == nil { return nil, errors.New("querier can not be nil") } return r.query.externalCallout(querier) } // DeletedRecords returns a list of records that have been deleted from a date range. func (r *Resources) DeletedRecords(sobject string, startDate, endDate time.Time) (DeletedRecords, error) { if r.query == nil { return DeletedRecords{}, errors.New("salesforce api is not initialized properly") } matching, err := regexp.MatchString(`\w`, sobject) if err != nil { return DeletedRecords{}, err } if matching == false { return DeletedRecords{}, fmt.Errorf("sobject salesforce api: %s is not a valid sobject", sobject) } return r.query.deletedRecordsCallout(sobject, startDate, endDate) } // UpdatedRecords returns a list of records that have been updated from a date range. func (r *Resources) UpdatedRecords(sobject string, startDate, endDate time.Time) (UpdatedRecords, error) { if r.query == nil { return UpdatedRecords{}, errors.New("salesforce api is not initialized properly") } matching, err := regexp.MatchString(`\w`, sobject) if err != nil { return UpdatedRecords{}, err } if matching == false { return UpdatedRecords{}, fmt.Errorf("sobject salesforce api: %s is not a valid sobject", sobject) } return r.query.updatedRecordsCallout(sobject, startDate, endDate) } // GetContent returns the blob from a content SObject. func (r *Resources) GetContent(id string, content ContentType) ([]byte, error) { if r.query == nil { return nil, errors.New("salesforce api is not initialized properly") } if id == "" { return nil, fmt.Errorf("sobject salesforce api: %s can not be empty", id) } switch content { case AttachmentType: case DocumentType: default: return nil, fmt.Errorf("sobject salesforce: content type (%s) is not supported", string(content)) } return r.query.contentCallout(id, content) }