diff --git a/api/admin/asset.go b/api/admin/asset.go index c267f3e..f693171 100644 --- a/api/admin/asset.go +++ b/api/admin/asset.go @@ -98,6 +98,7 @@ type AssetResult struct { Usage interface{} `json:"usage"` OriginalFilename string `json:"original_filename"` Context AssetContextResult `json:"context"` + AdminContext []AssetAdminContextResult `json:"admin_context"` Error api.ErrorResp `json:"error,omitempty"` Response interface{} } @@ -194,6 +195,11 @@ func (m *AssetContextResult) UnmarshalJSON(data []byte) error { return nil } +type AssetAdminContextResult struct { + Name string `json:"name"` + Value interface{} `json:"value"` +} + // UpdateAssetParams are the parameters for UpdateAsset. type UpdateAssetParams struct { AssetType api.AssetType `json:"-"` @@ -215,6 +221,7 @@ type UpdateAssetParams struct { NotificationURL string `json:"notification_url,omitempty"` Tags api.CldAPIArray `json:"tags,omitempty,omitempty"` Context api.CldAPIMap `json:"context,omitempty"` + AdminContext []api.AdminContext `json:"admin_context,omitempty"` FaceCoordinates api.Coordinates `json:"face_coordinates,omitempty"` CustomCoordinates api.Coordinates `json:"custom_coordinates,omitempty"` AccessControl interface{} `json:"access_control,omitempty"` diff --git a/api/admin/asset_acceptance_test.go b/api/admin/asset_acceptance_test.go index c88e87e..63a53a1 100644 --- a/api/admin/asset_acceptance_test.go +++ b/api/admin/asset_acceptance_test.go @@ -185,6 +185,47 @@ func getAssetTestCases() []AdminAPIAcceptanceTestCase { ExpectedCallCount: 1, }) + assetWithAdminContext := admin.AssetResult{ + AssetID: "1", + PublicID: cldtest.PublicID, + AdminContext: []admin.AssetAdminContextResult{ + { + Name: "key1", + Value: []interface{}{"value1", "value2"}, + }, + }, + } + responseJsonAdminContext, _ := json.Marshal(map[string]interface{}{ + "asset_id": "1", + "public_id": cldtest.PublicID, + "admin_context": []map[string]interface{}{ + {"name": "key1", "value": []string{"value1", "value2"}}, + }, + }) + + testCases = append(testCases, AdminAPIAcceptanceTestCase{ + Name: "Asset response with admin context", + RequestTest: func(api *admin.API, ctx context.Context) (interface{}, error) { + return api.Asset(ctx, admin.AssetParams{PublicID: cldtest.PublicID}) + }, + ResponseTest: func(response interface{}, t *testing.T) { + v, ok := response.(*admin.AssetResult) + if !ok { + t.Errorf("Response should be type of AssetResult, %s given", reflect.TypeOf(response)) + } + v.Response = nil // omit raw response comparison + if !reflect.DeepEqual(*v, assetWithAdminContext) { + t.Errorf("Response asset should be %+v\n%+v given", assetWithAdminContext, *v) + } + }, + ExpectedRequest: cldtest.ExpectedRequestParams{ + Method: "GET", + URI: "/resources/image/upload/" + cldtest.PublicID, + }, + JsonResponse: string(responseJsonAdminContext), + ExpectedCallCount: 1, + }) + return testCases } diff --git a/api/api.go b/api/api.go index 44b2e42..5d1844c 100644 --- a/api/api.go +++ b/api/api.go @@ -171,6 +171,26 @@ type Metadata map[string]interface{} // HookExecution is the result of a hook execution. type HookExecution map[string]interface{} +type AdminContextOp string + +const ( + AdminContextOpAdd AdminContextOp = "+" + AdminContextOpRemove AdminContextOp = "-" + AdminContextOpReplace AdminContextOp = "=" +) + +type AdminContextType string + +const AdminContextTypeArray AdminContextType = "array" + +// AdminContext is the Cloudinary admin contextual metadata payload +type AdminContext struct { + Name string `json:"name"` + Value []string `json:"value"` + Type AdminContextType `json:"type"` + Op AdminContextOp `json:"op"` +} + // AutoTranscription represents the auto transcription params. type AutoTranscription struct { Translate []string `json:"translate,omitempty"`