Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
193 changes: 181 additions & 12 deletions examples/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,25 +19,65 @@ package main
import (
"context"
"flag"
"fmt"
"log"
"os"
"strings"

"github.com/go-json-experiment/json"
"github.com/go-json-experiment/json/jsontext"
"golang.org/x/oauth2"

"github.com/zchee/abm"
)

const (
endpointGetOrgDevices = "get-org-devices"
endpointGetOrgDevice = "get-org-device"
endpointGetOrgDeviceAppleCareCoverage = "get-org-device-applecare-coverage"
endpointGetMDMServers = "get-mdm-servers"
endpointGetMDMServerDeviceLinkages = "get-mdm-server-device-linkages"
endpointGetOrgDeviceAssignedServerLinkage = "get-org-device-assigned-server-linkage"
endpointGetOrgDeviceAssignedServer = "get-org-device-assigned-server"
endpointCreateOrgDeviceActivity = "create-org-device-activity"
endpointGetOrgDeviceActivity = "get-org-device-activity"
endpointFetchOrgDevicePartNumbers = "fetch-org-device-part-numbers"
)

var (
clientID string
keyID string
privateKeyPath string
apiBaseURL string
endpoint string

orgDeviceID string
mdmServerID string
orgDeviceActivityID string
fieldsArg string
limit int

activityType string
activityDeviceIDs string
)

func init() {
flag.StringVar(&clientID, "client-id", "", "ABM client id")
flag.StringVar(&keyID, "key-id", "", "ABM key id")
flag.StringVar(&privateKeyPath, "private-key", "", "path to private-key filepath")
flag.StringVar(&clientID, "client-id", "", "ABM client ID")
flag.StringVar(&keyID, "key-id", "", "ABM key ID")
flag.StringVar(&privateKeyPath, "private-key", "", "path to private key file")
flag.StringVar(&apiBaseURL, "api-base-url", "", "optional ABM API base URL override")
flag.StringVar(&endpoint, "endpoint", endpointGetOrgDevices, "endpoint to call")

flag.StringVar(&orgDeviceID, "org-device-id", "", "organization device ID")
flag.StringVar(&mdmServerID, "mdm-server-id", "", "MDM server ID")
flag.StringVar(&orgDeviceActivityID, "org-device-activity-id", "", "organization device activity ID")
flag.StringVar(&fieldsArg, "fields", "", "comma-separated fields parameter")
flag.IntVar(&limit, "limit", 0, "page size limit (0 means API default)")

flag.StringVar(&activityType, "activity-type", string(abm.OrgDeviceActivityTypeAssignDevices), "activity type for create-org-device-activity")
flag.StringVar(&activityDeviceIDs, "activity-device-ids", "", "comma-separated org device IDs for create-org-device-activity")

flag.Usage = usage
}

func main() {
Expand Down Expand Up @@ -65,23 +105,152 @@ func main() {
log.Fatal(err)
}

client, err := abm.NewClient(nil, ts)
client, err := newABMClient(ts)
if err != nil {
log.Fatal(err)
}

out, err := client.GetOrgDevices(ctx, &abm.GetOrgDevicesOptions{
Fields: []string{
"partNumber",
"serialNumber",
},
Limit: 100,
})
response, err := runEndpoint(ctx, client)
if err != nil {
log.Fatal(err)
}

if err := json.MarshalWrite(os.Stdout, out, jsontext.WithIndent(" ")); err != nil {
if err := json.MarshalWrite(os.Stdout, response, jsontext.WithIndent(" ")); err != nil {
log.Fatal(err)
}

_, _ = fmt.Fprintln(os.Stdout)
}

func usage() {
_, _ = fmt.Fprintf(flag.CommandLine.Output(), "Usage of %s:\n", os.Args[0])
flag.PrintDefaults()
_, _ = fmt.Fprintln(flag.CommandLine.Output(), "")
_, _ = fmt.Fprintln(flag.CommandLine.Output(), "Supported endpoint values:")
_, _ = fmt.Fprintf(flag.CommandLine.Output(), " - %s\n", endpointGetOrgDevices)
_, _ = fmt.Fprintf(flag.CommandLine.Output(), " - %s\n", endpointGetOrgDevice)
_, _ = fmt.Fprintf(flag.CommandLine.Output(), " - %s\n", endpointGetOrgDeviceAppleCareCoverage)
_, _ = fmt.Fprintf(flag.CommandLine.Output(), " - %s\n", endpointGetMDMServers)
_, _ = fmt.Fprintf(flag.CommandLine.Output(), " - %s\n", endpointGetMDMServerDeviceLinkages)
_, _ = fmt.Fprintf(flag.CommandLine.Output(), " - %s\n", endpointGetOrgDeviceAssignedServerLinkage)
_, _ = fmt.Fprintf(flag.CommandLine.Output(), " - %s\n", endpointGetOrgDeviceAssignedServer)
_, _ = fmt.Fprintf(flag.CommandLine.Output(), " - %s\n", endpointCreateOrgDeviceActivity)
_, _ = fmt.Fprintf(flag.CommandLine.Output(), " - %s\n", endpointGetOrgDeviceActivity)
_, _ = fmt.Fprintf(flag.CommandLine.Output(), " - %s\n", endpointFetchOrgDevicePartNumbers)
}

func newABMClient(tokenSource oauth2.TokenSource) (*abm.Client, error) {
if apiBaseURL == "" {
return abm.NewClient(nil, tokenSource)
}

return abm.NewClientWithBaseURL(nil, tokenSource, apiBaseURL)
}

func runEndpoint(ctx context.Context, client *abm.Client) (any, error) {
fields := splitCommaList(fieldsArg)

switch endpoint {
case endpointGetOrgDevices:
return client.GetOrgDevices(ctx, &abm.GetOrgDevicesOptions{
Fields: fields,
Limit: limit,
})
case endpointGetOrgDevice:
if orgDeviceID == "" {
return nil, fmt.Errorf("-org-device-id is required for %s", endpointGetOrgDevice)
}
return client.GetOrgDevice(ctx, orgDeviceID, &abm.GetOrgDeviceOptions{Fields: fields})
case endpointGetOrgDeviceAppleCareCoverage:
if orgDeviceID == "" {
return nil, fmt.Errorf("-org-device-id is required for %s", endpointGetOrgDeviceAppleCareCoverage)
}
return client.GetOrgDeviceAppleCareCoverage(ctx, orgDeviceID, &abm.GetOrgDeviceAppleCareCoverageOptions{
Fields: fields,
Limit: limit,
})
case endpointGetMDMServers:
return client.GetMDMServers(ctx, &abm.GetMDMServersOptions{
Fields: fields,
Limit: limit,
})
case endpointGetMDMServerDeviceLinkages:
if mdmServerID == "" {
return nil, fmt.Errorf("-mdm-server-id is required for %s", endpointGetMDMServerDeviceLinkages)
}
return client.GetMDMServerDeviceLinkages(ctx, mdmServerID, &abm.GetMDMServerDeviceLinkagesOptions{Limit: limit})
case endpointGetOrgDeviceAssignedServerLinkage:
if orgDeviceID == "" {
return nil, fmt.Errorf("-org-device-id is required for %s", endpointGetOrgDeviceAssignedServerLinkage)
}
return client.GetOrgDeviceAssignedServerLinkage(ctx, orgDeviceID)
case endpointGetOrgDeviceAssignedServer:
if orgDeviceID == "" {
return nil, fmt.Errorf("-org-device-id is required for %s", endpointGetOrgDeviceAssignedServer)
}
return client.GetOrgDeviceAssignedServer(ctx, orgDeviceID, &abm.GetOrgDeviceAssignedServerOptions{Fields: fields})
case endpointCreateOrgDeviceActivity:
if mdmServerID == "" {
return nil, fmt.Errorf("-mdm-server-id is required for %s", endpointCreateOrgDeviceActivity)
}
deviceIDs := splitCommaList(activityDeviceIDs)
if len(deviceIDs) == 0 {
return nil, fmt.Errorf("-activity-device-ids is required for %s", endpointCreateOrgDeviceActivity)
}
request := abm.OrgDeviceActivityCreateRequest{
Data: abm.OrgDeviceActivityCreateRequestData{
Type: "orgDeviceActivities",
Attributes: abm.OrgDeviceActivityCreateRequestDataAttributes{
ActivityType: abm.OrgDeviceActivityType(activityType),
},
Relationships: abm.OrgDeviceActivityCreateRequestDataRelationships{
Devices: abm.OrgDeviceActivityCreateRequestDataRelationshipsDevices{
Data: toActivityDeviceRelationships(deviceIDs),
},
MDMServer: abm.OrgDeviceActivityCreateRequestDataRelationshipsMDMServer{
Data: abm.OrgDeviceActivityCreateRequestDataRelationshipsMDMServerData{
ID: mdmServerID,
Type: "mdmServers",
},
},
},
},
}
return client.CreateOrgDeviceActivity(ctx, request)
case endpointGetOrgDeviceActivity:
if orgDeviceActivityID == "" {
return nil, fmt.Errorf("-org-device-activity-id is required for %s", endpointGetOrgDeviceActivity)
}
return client.GetOrgDeviceActivity(ctx, orgDeviceActivityID, &abm.GetOrgDeviceActivityOptions{Fields: fields})
case endpointFetchOrgDevicePartNumbers:
return client.FetchOrgDevicePartNumbers(ctx)
default:
return nil, fmt.Errorf("unsupported -endpoint value %q", endpoint)
}
}

func splitCommaList(value string) []string {
parts := strings.Split(value, ",")
out := make([]string, 0, len(parts))
for _, part := range parts {
trimmed := strings.TrimSpace(part)
if trimmed == "" {
continue
}
out = append(out, trimmed)
}

return out
}

func toActivityDeviceRelationships(deviceIDs []string) []abm.OrgDeviceActivityCreateRequestDataRelationshipsDevicesData {
data := make([]abm.OrgDeviceActivityCreateRequestDataRelationshipsDevicesData, len(deviceIDs))
for i, id := range deviceIDs {
data[i] = abm.OrgDeviceActivityCreateRequestDataRelationshipsDevicesData{
ID: id,
Type: "orgDevices",
}
}

return data
}