Examples

Real-world usage patterns and best practices.

Create Account with Contacts

Go
func createAccountWithContacts(ctx context.Context, client *salesforce.Client) error {
    // Use composite API for atomic creation
    resp, err := client.Composite().Execute(ctx, composite.Request{
        AllOrNone: true,
        CompositeRequest: []composite.Subrequest{
            {
                Method:      "POST",
                URL:         "/services/data/v59.0/sobjects/Account",
                ReferenceId: "newAccount",
                Body: map[string]interface{}{
                    "Name":     "Acme Corp",
                    "Industry": "Technology",
                },
            },
            {
                Method:      "POST",
                URL:         "/services/data/v59.0/sobjects/Contact",
                ReferenceId: "contact1",
                Body: map[string]interface{}{
                    "LastName":  "Smith",
                    "AccountId": "@{newAccount.id}",
                },
            },
        },
    })
    return err
}

Bulk Import from CSV

Go
func importAccounts(ctx context.Context, client *salesforce.Client, csvFile string) error {
    // Read CSV
    file, _ := os.Open(csvFile)
    reader := csv.NewReader(file)
    rows, _ := reader.ReadAll()

    // Create job
    job, _ := client.Bulk().CreateJob(ctx, bulk.CreateJobRequest{
        Object:    "Account",
        Operation: bulk.OperationInsert,
    })

    // Convert rows to maps
    headers := rows[0]
    var records []map[string]string
    for _, row := range rows[1:] {
        record := make(map[string]string)
        for i, val := range row {
            record[headers[i]] = val
        }
        records = append(records, record)
    }

    // Upload and process
    client.Bulk().UploadCSV(ctx, job.ID, records, headers)
    client.Bulk().CloseJob(ctx, job.ID)
    
    job, _ = client.Bulk().WaitForCompletion(ctx, job.ID, 5*time.Second)
    
    fmt.Printf("Processed: %d, Failed: %d\n", 
        job.NumberRecordsProcessed, job.NumberRecordsFailed)
    
    return nil
}

Export All Records

Go
func exportAccounts(ctx context.Context, client *salesforce.Client) error {
    // Get all records with automatic pagination
    records, err := client.Query().ExecuteAllRecords(ctx,
        "SELECT Id, Name, Industry, AnnualRevenue FROM Account")
    if err != nil {
        return err
    }

    // Write to CSV
    file, _ := os.Create("accounts.csv")
    writer := csv.NewWriter(file)
    writer.Write([]string{"Id", "Name", "Industry", "AnnualRevenue"})

    for _, r := range records {
        writer.Write([]string{
            r.StringField("Id"),
            r.StringField("Name"),
            r.StringField("Industry"),
            fmt.Sprintf("%.2f", r.FloatField("AnnualRevenue")),
        })
    }
    writer.Flush()
    
    return nil
}

Monitor API Limits

Go
func checkLimits(ctx context.Context, client *salesforce.Client) {
    limits, _ := client.Limits().GetLimits(ctx)

    // Alert if approaching limits
    if limits.DailyApiRequests.PercentUsed() > 80 {
        log.Warn("API requests at 80%!")
    }

    if limits.DataStorageMB.PercentUsed() > 90 {
        log.Error("Data storage critical!")
    }
}