From 20c067620f2b53d453841bb0103a24fdefca7438 Mon Sep 17 00:00:00 2001 From: Krystian Jarmicki Date: Fri, 24 Oct 2025 13:03:03 +0200 Subject: [PATCH 1/2] Add support for complementary asset relation APIs --- api/admin/asset.go | 171 +++++++++++++++------------- api/admin/asset_acceptance_test.go | 9 ++ api/admin/assets.go | 49 ++++++-- api/admin/assets_acceptance_test.go | 161 +++++++++++++++++++++++++- 4 files changed, 299 insertions(+), 91 deletions(-) diff --git a/api/admin/asset.go b/api/admin/asset.go index 3ad68a9..6bc3513 100644 --- a/api/admin/asset.go +++ b/api/admin/asset.go @@ -14,25 +14,27 @@ import ( // AssetParams are the parameters for Asset. type AssetParams struct { - AssetType api.AssetType `json:"-"` - DeliveryType api.DeliveryType `json:"-"` - PublicID string `json:"-"` - Exif *bool `json:"exif,omitempty"` - Colors *bool `json:"colors,omitempty"` - Faces *bool `json:"faces,omitempty"` - QualityAnalysis *bool `json:"quality_analysis,omitempty"` - ImageMetadata *bool `json:"image_metadata,omitempty"` - MediaMetadata *bool `json:"media_metadata,omitempty"` - Phash *bool `json:"phash,omitempty"` - Pages *bool `json:"pages,omitempty"` - AccessibilityAnalysis *bool `json:"accessibility_analysis,omitempty"` - CinemagraphAnalysis *bool `json:"cinemagraph_analysis,omitempty"` - Coordinates *bool `json:"coordinates,omitempty"` - MaxResults int `json:"max_results,omitempty"` - DerivedNextCursor string `json:"derived_next_cursor,omitempty"` - Related *bool `json:"related,omitempty"` - RelatedNextCursor string `json:"related_next_cursor,omitempty"` - Versions *bool `json:"versions,omitempty"` + AssetType api.AssetType `json:"-"` + DeliveryType api.DeliveryType `json:"-"` + PublicID string `json:"-"` + Exif *bool `json:"exif,omitempty"` + Colors *bool `json:"colors,omitempty"` + Faces *bool `json:"faces,omitempty"` + QualityAnalysis *bool `json:"quality_analysis,omitempty"` + ImageMetadata *bool `json:"image_metadata,omitempty"` + MediaMetadata *bool `json:"media_metadata,omitempty"` + Phash *bool `json:"phash,omitempty"` + Pages *bool `json:"pages,omitempty"` + AccessibilityAnalysis *bool `json:"accessibility_analysis,omitempty"` + CinemagraphAnalysis *bool `json:"cinemagraph_analysis,omitempty"` + Coordinates *bool `json:"coordinates,omitempty"` + MaxResults int `json:"max_results,omitempty"` + DerivedNextCursor string `json:"derived_next_cursor,omitempty"` + Related *bool `json:"related,omitempty"` + RelatedNextCursor string `json:"related_next_cursor,omitempty"` + RelatedComplementary *bool `json:"related_complementary,omitempty"` + RelatedComplementaryNextCursor string `json:"related_complementary_next_cursor,omitempty"` + Versions *bool `json:"versions,omitempty"` } // Asset returns the details of the specified asset and all its derived resources. @@ -52,51 +54,52 @@ func (a *API) Asset(ctx context.Context, params AssetParams) (*AssetResult, erro // AssetResult is the result of the Asset. type AssetResult struct { - AssetID string `json:"asset_id"` - PublicID string `json:"public_id"` - Format string `json:"format"` - AssetFolder string `json:"asset_folder"` - DisplayName string `json:"display_name"` - Version int `json:"version"` - ResourceType string `json:"resource_type"` - Type string `json:"type"` - CreatedAt time.Time `json:"created_at"` - Bytes int `json:"bytes"` - Width int `json:"width"` - Height int `json:"height"` - Backup bool `json:"backup"` - AccessMode string `json:"access_mode"` - AccessControl api.AccessControl `json:"access_control,omitempty"` - URL string `json:"url"` - SecureURL string `json:"secure_url"` - Metadata api.Metadata `json:"metadata,omitempty"` - Tags []string `json:"tags"` - LastUpdated api.LastUpdated `json:"last_updated"` - NextCursor string `json:"next_cursor"` - Derived []interface{} `json:"derived"` - Etag string `json:"etag"` - ImageMetadata ImageMetadataResult `json:"image_metadata"` - VideoMetadata MediaMetadataResult `json:"video_metadata"` - Coordinates interface{} `json:"coordinates"` - Info interface{} `json:"info"` - Exif interface{} `json:"exif"` - Faces [][]int `json:"faces"` - IllustrationScore float64 `json:"illustration_score"` - SemiTransparent bool `json:"semi_transparent"` - Grayscale bool `json:"grayscale"` - Colors [][]interface{} `json:"colors"` - Predominant PredominantResult `json:"predominant"` - Phash string `json:"phash"` - QualityAnalysis QualityAnalysisResult `json:"quality_analysis"` - QualityScore float64 `json:"quality_score"` - AccessibilityAnalysis AccessibilityAnalysisResult `json:"accessibility_analysis"` - Pages int `json:"pages"` - CinemagraphAnalysis CinemagraphAnalysisResult `json:"cinemagraph_analysis"` - Usage interface{} `json:"usage"` - OriginalFilename string `json:"original_filename"` - Context AssetContextResult `json:"context"` - Error api.ErrorResp `json:"error,omitempty"` - Response interface{} + AssetID string `json:"asset_id"` + PublicID string `json:"public_id"` + Format string `json:"format"` + AssetFolder string `json:"asset_folder"` + DisplayName string `json:"display_name"` + Version int `json:"version"` + ResourceType string `json:"resource_type"` + Type string `json:"type"` + CreatedAt time.Time `json:"created_at"` + Bytes int `json:"bytes"` + Width int `json:"width"` + Height int `json:"height"` + Backup bool `json:"backup"` + AccessMode string `json:"access_mode"` + AccessControl api.AccessControl `json:"access_control,omitempty"` + URL string `json:"url"` + SecureURL string `json:"secure_url"` + Metadata api.Metadata `json:"metadata,omitempty"` + Tags []string `json:"tags"` + LastUpdated api.LastUpdated `json:"last_updated"` + NextCursor string `json:"next_cursor"` + Derived []interface{} `json:"derived"` + Etag string `json:"etag"` + ImageMetadata ImageMetadataResult `json:"image_metadata"` + VideoMetadata MediaMetadataResult `json:"video_metadata"` + Coordinates interface{} `json:"coordinates"` + Info interface{} `json:"info"` + Exif interface{} `json:"exif"` + Faces [][]int `json:"faces"` + IllustrationScore float64 `json:"illustration_score"` + SemiTransparent bool `json:"semi_transparent"` + Grayscale bool `json:"grayscale"` + Colors [][]interface{} `json:"colors"` + Predominant PredominantResult `json:"predominant"` + Phash string `json:"phash"` + QualityAnalysis QualityAnalysisResult `json:"quality_analysis"` + QualityScore float64 `json:"quality_score"` + RelatedComplementaryAssets []RelatedComplementaryAssetResult `json:"related_complementary_assets"` + AccessibilityAnalysis AccessibilityAnalysisResult `json:"accessibility_analysis"` + Pages int `json:"pages"` + CinemagraphAnalysis CinemagraphAnalysisResult `json:"cinemagraph_analysis"` + Usage interface{} `json:"usage"` + OriginalFilename string `json:"original_filename"` + Context AssetContextResult `json:"context"` + Error api.ErrorResp `json:"error,omitempty"` + Response interface{} } // QualityAnalysisResult contains the details about quality analysis. @@ -117,6 +120,14 @@ type QualityAnalysisResult struct { Resolution float64 `json:"resolution"` } +// RelatedComplementaryAssetResult contains the details about a related complementary asset. +type RelatedComplementaryAssetResult struct { + AssetID string `json:"asset_id"` + PublicID string `json:"public_id"` + Status string `json:"status"` + Subkind string `json:"subkind"` +} + // AccessibilityAnalysisResult contains the details about accessibility analysis. type AccessibilityAnalysisResult struct { ColorblindAccessibilityAnalysis struct { @@ -222,21 +233,23 @@ func (a *API) UpdateAsset(ctx context.Context, params UpdateAssetParams) (*Asset // AssetByAssetIDParams are the parameters for AssetByAssetID. type AssetByAssetIDParams struct { - AssetID string `json:"-"` - Colors *bool `json:"colors,omitempty"` - Exif *bool `json:"exif,omitempty"` - Faces *bool `json:"faces,omitempty"` - QualityAnalysis *bool `json:"quality_analysis,omitempty"` - ImageMetadata *bool `json:"image_metadata,omitempty"` - MediaMetadata *bool `json:"media_metadata,omitempty"` - Phash *bool `json:"phash,omitempty"` - Pages *bool `json:"pages,omitempty"` - CinemagraphAnalysis *bool `json:"cinemagraph_analysis,omitempty"` - Coordinates *bool `json:"coordinates,omitempty"` - MaxResults int `json:"max_results,omitempty"` - DerivedNextCursor string `json:"derived_next_cursor,omitempty"` - AccessibilityAnalysis *bool `json:"accessibility_analysis,omitempty"` - Versions *bool `json:"versions,omitempty"` + AssetID string `json:"-"` + Colors *bool `json:"colors,omitempty"` + Exif *bool `json:"exif,omitempty"` + Faces *bool `json:"faces,omitempty"` + QualityAnalysis *bool `json:"quality_analysis,omitempty"` + ImageMetadata *bool `json:"image_metadata,omitempty"` + MediaMetadata *bool `json:"media_metadata,omitempty"` + Phash *bool `json:"phash,omitempty"` + Pages *bool `json:"pages,omitempty"` + CinemagraphAnalysis *bool `json:"cinemagraph_analysis,omitempty"` + Coordinates *bool `json:"coordinates,omitempty"` + MaxResults int `json:"max_results,omitempty"` + DerivedNextCursor string `json:"derived_next_cursor,omitempty"` + AccessibilityAnalysis *bool `json:"accessibility_analysis,omitempty"` + Versions *bool `json:"versions,omitempty"` + RelatedComplementary *bool `json:"related_complementary,omitempty"` + RelatedComplementaryNextCursor string `json:"related_complementary_next_cursor,omitempty"` } // AssetByAssetID returns the details of the specified asset and all its derived assets by asset id. diff --git a/api/admin/asset_acceptance_test.go b/api/admin/asset_acceptance_test.go index ea0ec70..c88e87e 100644 --- a/api/admin/asset_acceptance_test.go +++ b/api/admin/asset_acceptance_test.go @@ -62,6 +62,15 @@ func getAssetTestCases() []AdminAPIAcceptanceTestCase { "related_next_cursor": []string{"NEXT_CURSOR"}, }, }, + { + requestParams: admin.AssetParams{PublicID: cldtest.PublicID, + RelatedComplementary: api.Bool(true), RelatedComplementaryNextCursor: "NEXT_CURSOR"}, + uri: "/resources/image/upload/" + cldtest.PublicID, + expectedParams: &url.Values{ + "related_complementary": []string{"true"}, + "related_complementary_next_cursor": []string{"NEXT_CURSOR"}, + }, + }, } for num, testCase := range assetTestCases { diff --git a/api/admin/assets.go b/api/admin/assets.go index d18f143..73c3feb 100644 --- a/api/admin/assets.go +++ b/api/admin/assets.go @@ -12,15 +12,16 @@ import ( ) const ( - assets api.EndPoint = "resources" - byAssetFolder api.EndPoint = "by_asset_folder" - visualSearch api.EndPoint = "visual_search" - derivedAssets api.EndPoint = "derived_resources" - relatedAssets api.EndPoint = "related_assets" - tags api.EndPoint = "tags" - cldContext api.EndPoint = "context" - moderations api.EndPoint = "moderations" - restore api.EndPoint = "restore" + assets api.EndPoint = "resources" + byAssetFolder api.EndPoint = "by_asset_folder" + visualSearch api.EndPoint = "visual_search" + derivedAssets api.EndPoint = "derived_resources" + relatedAssets api.EndPoint = "related_assets" + relatedComplementaryAssets api.EndPoint = "related_complementary_assets" + tags api.EndPoint = "tags" + cldContext api.EndPoint = "context" + moderations api.EndPoint = "moderations" + restore api.EndPoint = "restore" ) // AssetTypes lists available asset types. @@ -450,3 +451,33 @@ func (a *API) DeleteRelatedAssetsByAssetIDs(ctx context.Context, params DeleteRe return res, err } + +// AddRelatedComplementaryAssetsByAssetIDsParams are the parameters for AddRelatedComplementaryAssetsByAssetIDs. +type AddRelatedComplementaryAssetsByAssetIDsParams struct { + AssetID string `json:"-"` + ComplementaryAssetsToRelate []string `json:"complementary_assets_to_relate"` + Subkind string `json:"subkind"` +} + +// AddRelatedComplementaryAssetsByAssetIDs relates an asset to other complementary assets by asset IDs. +func (a *API) AddRelatedComplementaryAssetsByAssetIDs(ctx context.Context, params AddRelatedComplementaryAssetsByAssetIDsParams) (*AddRelatedAssetsResult, error) { + res := &AddRelatedAssetsResult{} + _, err := a.post(ctx, api.BuildPath(assets, relatedComplementaryAssets, params.AssetID), params, res) + + return res, err +} + +// DeleteRelatedComplementaryAssetsByAssetIDsParams are the parameters for DeleteRelatedComplementaryAssetsByAssetIDs. +type DeleteRelatedComplementaryAssetsByAssetIDsParams struct { + AssetID string `json:"-"` + ComplementaryAssetsToUnrelate []string `json:"complementary_assets_to_unrelate"` + Subkind string `json:"subkind"` +} + +// DeleteRelatedComplementaryAssetsByAssetIDs unrelates an asset from other complementary assets by asset IDs. +func (a *API) DeleteRelatedComplementaryAssetsByAssetIDs(ctx context.Context, params DeleteRelatedComplementaryAssetsByAssetIDsParams) (*DeleteRelatedAssetsResult, error) { + res := &DeleteRelatedAssetsResult{} + _, err := a.delete(ctx, api.BuildPath(assets, relatedComplementaryAssets, params.AssetID), params, res) + + return res, err +} diff --git a/api/admin/assets_acceptance_test.go b/api/admin/assets_acceptance_test.go index caaf36d..5754476 100644 --- a/api/admin/assets_acceptance_test.go +++ b/api/admin/assets_acceptance_test.go @@ -5,12 +5,13 @@ import ( "context" "encoding/json" "fmt" - "github.com/cloudinary/cloudinary-go/v2/api" - "github.com/cloudinary/cloudinary-go/v2/api/admin" - "github.com/cloudinary/cloudinary-go/v2/internal/cldtest" "net/url" "reflect" "testing" + + "github.com/cloudinary/cloudinary-go/v2/api" + "github.com/cloudinary/cloudinary-go/v2/api/admin" + "github.com/cloudinary/cloudinary-go/v2/internal/cldtest" ) // Acceptance test cases for `restore` method @@ -1230,6 +1231,158 @@ func getDeleteRelatedAssetsByAssetIDsTestCases() []AdminAPIAcceptanceTestCase { return testCases } +// Acceptance test cases for `AddRelatedAssetsByAssetIDs` method +func getAddRelatedComplementaryAssetsByAssetIDsTestCases() []AdminAPIAcceptanceTestCase { + type addRelatedComplementaryAssetsByAssetIDsTestCase struct { + requestParams admin.AddRelatedComplementaryAssetsByAssetIDsParams + uri string + expectedParams *string + } + + getTestCase := func(num int, t addRelatedComplementaryAssetsByAssetIDsTestCase) AdminAPIAcceptanceTestCase { + return AdminAPIAcceptanceTestCase{ + Name: fmt.Sprintf("AddRelatedComplementaryAssetsByAssetIDs #%d", num), + RequestTest: func(api *admin.API, ctx context.Context) (interface{}, error) { + return api.AddRelatedComplementaryAssetsByAssetIDs(ctx, t.requestParams) + }, + ResponseTest: func(response interface{}, t *testing.T) { + _, ok := response.(*admin.AddRelatedAssetsResult) + if !ok { + t.Errorf("Response should be type of AddRelatedAssetsResult, %s given", reflect.TypeOf(response)) + } + }, + ExpectedRequest: cldtest.ExpectedRequestParams{ + Method: "POST", + URI: t.uri, + Body: t.expectedParams, + }, + JsonResponse: "{}", + ExpectedCallCount: 1, + } + } + + var testCases []AdminAPIAcceptanceTestCase + + params := fmt.Sprintf("{\"complementary_assets_to_relate\":[\"%s\",\"%s\"],\"subkind\":\"subkind\"}", cldtest.AssetID2, cldtest.AssetID3) + addRelatedComplementaryAssetsByAssetIDsTestCases := []addRelatedComplementaryAssetsByAssetIDsTestCase{ + { + requestParams: admin.AddRelatedComplementaryAssetsByAssetIDsParams{ + AssetID: cldtest.AssetID, + ComplementaryAssetsToRelate: []string{cldtest.AssetID2, cldtest.AssetID3}, + Subkind: "subkind", + }, + uri: "/resources/related_complementary_assets/" + cldtest.AssetID, + expectedParams: ¶ms, + }, + } + + for num, testCase := range addRelatedComplementaryAssetsByAssetIDsTestCases { + testCases = append(testCases, getTestCase(num, testCase)) + } + + testCases = append(testCases, AdminAPIAcceptanceTestCase{ + Name: "Related Complementary Assets By Asset IDs error case", + RequestTest: func(api *admin.API, ctx context.Context) (interface{}, error) { + return api.AddRelatedComplementaryAssetsByAssetIDs(ctx, admin.AddRelatedComplementaryAssetsByAssetIDsParams{AssetID: cldtest.AssetID}) + }, + ResponseTest: func(response interface{}, t *testing.T) { + v, ok := response.(*admin.AddRelatedAssetsResult) + if !ok { + t.Errorf("Response should be type of AddRelatedComplementaryAssetsResult, %s given", reflect.TypeOf(response)) + } + + if v.Failed[0].Message != "TEST ERROR" { + t.Errorf("Error message should be %s, %s given", "TEST ERROR", v.Failed[0].Message) + } + }, + ExpectedRequest: cldtest.ExpectedRequestParams{ + Method: "POST", + URI: "/resources/related_complementary_assets/" + cldtest.AssetID, + Params: &url.Values{}, + }, + JsonResponse: "{\"failed\":[{\"message\": \"TEST ERROR\"}]}", + ExpectedCallCount: 1, + }) + + return testCases +} + +// Acceptance test cases for `DeleteRelatedAssetsByAssetIDs` method +func getDeleteRelatedComplementaryAssetsByAssetIDsTestCases() []AdminAPIAcceptanceTestCase { + type deleteRelatedComplementaryAssetsByAssetIDsTestCase struct { + requestParams admin.DeleteRelatedComplementaryAssetsByAssetIDsParams + uri string + expectedParams *string + } + + getTestCase := func(num int, t deleteRelatedComplementaryAssetsByAssetIDsTestCase) AdminAPIAcceptanceTestCase { + return AdminAPIAcceptanceTestCase{ + Name: fmt.Sprintf("DeleteRelatedComplementaryAssetsByAssetIDs #%d", num), + RequestTest: func(api *admin.API, ctx context.Context) (interface{}, error) { + return api.DeleteRelatedComplementaryAssetsByAssetIDs(ctx, t.requestParams) + }, + ResponseTest: func(response interface{}, t *testing.T) { + _, ok := response.(*admin.DeleteRelatedAssetsResult) + if !ok { + t.Errorf("Response should be type of DeleteRelatedAssetsResult, %s given", reflect.TypeOf(response)) + } + }, + ExpectedRequest: cldtest.ExpectedRequestParams{ + Method: "DELETE", + URI: t.uri, + Body: t.expectedParams, + }, + JsonResponse: "{}", + ExpectedCallCount: 1, + } + } + + var testCases []AdminAPIAcceptanceTestCase + + params := fmt.Sprintf("{\"complementary_assets_to_unrelate\":[\"%s\",\"%s\"],\"subkind\":\"subkind\"}", cldtest.AssetID2, cldtest.AssetID3) + deleteRelatedComplementaryAssetsByAssetIDsTestCases := []deleteRelatedComplementaryAssetsByAssetIDsTestCase{ + { + requestParams: admin.DeleteRelatedComplementaryAssetsByAssetIDsParams{ + AssetID: cldtest.AssetID, + ComplementaryAssetsToUnrelate: []string{cldtest.AssetID2, cldtest.AssetID3}, + Subkind: "subkind", + }, + uri: "/resources/related_complementary_assets/" + cldtest.AssetID, + expectedParams: ¶ms, + }, + } + + for num, testCase := range deleteRelatedComplementaryAssetsByAssetIDsTestCases { + testCases = append(testCases, getTestCase(num, testCase)) + } + + testCases = append(testCases, AdminAPIAcceptanceTestCase{ + Name: "Related Complementary Assets By Asset IDs error case", + RequestTest: func(api *admin.API, ctx context.Context) (interface{}, error) { + return api.DeleteRelatedComplementaryAssetsByAssetIDs(ctx, admin.DeleteRelatedComplementaryAssetsByAssetIDsParams{AssetID: cldtest.AssetID}) + }, + ResponseTest: func(response interface{}, t *testing.T) { + v, ok := response.(*admin.DeleteRelatedAssetsResult) + if !ok { + t.Errorf("Response should be type of DeleteRelatedAssetsResult, %s given", reflect.TypeOf(response)) + } + + if v.Failed[0].Message != "TEST ERROR" { + t.Errorf("Error message should be %s, %s given", "TEST ERROR", v.Failed[0].Message) + } + }, + ExpectedRequest: cldtest.ExpectedRequestParams{ + Method: "DELETE", + URI: "/resources/related_complementary_assets/" + cldtest.AssetID, + Params: &url.Values{}, + }, + JsonResponse: "{\"failed\":[{\"message\": \"TEST ERROR\"}]}", + ExpectedCallCount: 1, + }) + + return testCases +} + // Acceptance test cases for `VisualSearch` method func getVisualSearchTestCases() []AdminAPIAcceptanceTestCase { type visualSearchTestCase struct { @@ -1306,6 +1459,8 @@ func TestAssets_Acceptance(t *testing.T) { testAdminAPIByTestCases(getDeleteRelatedAssetsTestCases(), t) testAdminAPIByTestCases(getAddRelatedAssetsByAssetIDsTestCases(), t) testAdminAPIByTestCases(getDeleteRelatedAssetsByAssetIDsTestCases(), t) + testAdminAPIByTestCases(getAddRelatedComplementaryAssetsByAssetIDsTestCases(), t) + testAdminAPIByTestCases(getDeleteRelatedComplementaryAssetsByAssetIDsTestCases(), t) testAdminAPIByTestCases(getAssetsByModerationTestCases(), t) testAdminAPIByTestCases(getVisualSearchTestCases(), t) testAdminAPIByTestCases(getDeleteAssetsTestCases(), t) From a76f1ca7fc17b6a7520e22e90b46cd8362134ed6 Mon Sep 17 00:00:00 2001 From: Krystian Jarmicki Date: Fri, 14 Nov 2025 12:23:11 +0100 Subject: [PATCH 2/2] update names --- api/admin/asset.go | 10 ++++++---- api/admin/assets.go | 22 +++++++--------------- api/admin/assets_acceptance_test.go | 28 ++++++++++++++-------------- 3 files changed, 27 insertions(+), 33 deletions(-) diff --git a/api/admin/asset.go b/api/admin/asset.go index 6bc3513..c267f3e 100644 --- a/api/admin/asset.go +++ b/api/admin/asset.go @@ -122,10 +122,12 @@ type QualityAnalysisResult struct { // RelatedComplementaryAssetResult contains the details about a related complementary asset. type RelatedComplementaryAssetResult struct { - AssetID string `json:"asset_id"` - PublicID string `json:"public_id"` - Status string `json:"status"` - Subkind string `json:"subkind"` + AssetID string `json:"asset_id"` + PublicID string `json:"public_id"` + ResourceType string `json:"resource_type"` + Type string `json:"type"` + Status string `json:"status"` + ComplementaryType string `json:"complementary_type"` } // AccessibilityAnalysisResult contains the details about accessibility analysis. diff --git a/api/admin/assets.go b/api/admin/assets.go index 73c3feb..94f4625 100644 --- a/api/admin/assets.go +++ b/api/admin/assets.go @@ -452,30 +452,22 @@ func (a *API) DeleteRelatedAssetsByAssetIDs(ctx context.Context, params DeleteRe return res, err } -// AddRelatedComplementaryAssetsByAssetIDsParams are the parameters for AddRelatedComplementaryAssetsByAssetIDs. -type AddRelatedComplementaryAssetsByAssetIDsParams struct { - AssetID string `json:"-"` - ComplementaryAssetsToRelate []string `json:"complementary_assets_to_relate"` - Subkind string `json:"subkind"` +// RelatedComplementaryAssetsByAssetIDsParams are the parameters for AddRelatedComplementaryAssetsByAssetIDs. +type RelatedComplementaryAssetsByAssetIDsParams struct { + AssetID string `json:"-"` + RelatedAssetIDs []string `json:"related_asset_ids"` + ComplementaryType string `json:"complementary_type"` } // AddRelatedComplementaryAssetsByAssetIDs relates an asset to other complementary assets by asset IDs. -func (a *API) AddRelatedComplementaryAssetsByAssetIDs(ctx context.Context, params AddRelatedComplementaryAssetsByAssetIDsParams) (*AddRelatedAssetsResult, error) { +func (a *API) AddRelatedComplementaryAssetsByAssetIDs(ctx context.Context, params RelatedComplementaryAssetsByAssetIDsParams) (*AddRelatedAssetsResult, error) { res := &AddRelatedAssetsResult{} _, err := a.post(ctx, api.BuildPath(assets, relatedComplementaryAssets, params.AssetID), params, res) return res, err } -// DeleteRelatedComplementaryAssetsByAssetIDsParams are the parameters for DeleteRelatedComplementaryAssetsByAssetIDs. -type DeleteRelatedComplementaryAssetsByAssetIDsParams struct { - AssetID string `json:"-"` - ComplementaryAssetsToUnrelate []string `json:"complementary_assets_to_unrelate"` - Subkind string `json:"subkind"` -} - -// DeleteRelatedComplementaryAssetsByAssetIDs unrelates an asset from other complementary assets by asset IDs. -func (a *API) DeleteRelatedComplementaryAssetsByAssetIDs(ctx context.Context, params DeleteRelatedComplementaryAssetsByAssetIDsParams) (*DeleteRelatedAssetsResult, error) { +func (a *API) DeleteRelatedComplementaryAssetsByAssetIDs(ctx context.Context, params RelatedComplementaryAssetsByAssetIDsParams) (*DeleteRelatedAssetsResult, error) { res := &DeleteRelatedAssetsResult{} _, err := a.delete(ctx, api.BuildPath(assets, relatedComplementaryAssets, params.AssetID), params, res) diff --git a/api/admin/assets_acceptance_test.go b/api/admin/assets_acceptance_test.go index 5754476..dbabbef 100644 --- a/api/admin/assets_acceptance_test.go +++ b/api/admin/assets_acceptance_test.go @@ -1234,7 +1234,7 @@ func getDeleteRelatedAssetsByAssetIDsTestCases() []AdminAPIAcceptanceTestCase { // Acceptance test cases for `AddRelatedAssetsByAssetIDs` method func getAddRelatedComplementaryAssetsByAssetIDsTestCases() []AdminAPIAcceptanceTestCase { type addRelatedComplementaryAssetsByAssetIDsTestCase struct { - requestParams admin.AddRelatedComplementaryAssetsByAssetIDsParams + requestParams admin.RelatedComplementaryAssetsByAssetIDsParams uri string expectedParams *string } @@ -1263,13 +1263,13 @@ func getAddRelatedComplementaryAssetsByAssetIDsTestCases() []AdminAPIAcceptanceT var testCases []AdminAPIAcceptanceTestCase - params := fmt.Sprintf("{\"complementary_assets_to_relate\":[\"%s\",\"%s\"],\"subkind\":\"subkind\"}", cldtest.AssetID2, cldtest.AssetID3) + params := fmt.Sprintf("{\"related_asset_ids\":[\"%s\",\"%s\"],\"complementary_type\":\"complementary_type\"}", cldtest.AssetID2, cldtest.AssetID3) addRelatedComplementaryAssetsByAssetIDsTestCases := []addRelatedComplementaryAssetsByAssetIDsTestCase{ { - requestParams: admin.AddRelatedComplementaryAssetsByAssetIDsParams{ - AssetID: cldtest.AssetID, - ComplementaryAssetsToRelate: []string{cldtest.AssetID2, cldtest.AssetID3}, - Subkind: "subkind", + requestParams: admin.RelatedComplementaryAssetsByAssetIDsParams{ + AssetID: cldtest.AssetID, + RelatedAssetIDs: []string{cldtest.AssetID2, cldtest.AssetID3}, + ComplementaryType: "complementary_type", }, uri: "/resources/related_complementary_assets/" + cldtest.AssetID, expectedParams: ¶ms, @@ -1283,7 +1283,7 @@ func getAddRelatedComplementaryAssetsByAssetIDsTestCases() []AdminAPIAcceptanceT testCases = append(testCases, AdminAPIAcceptanceTestCase{ Name: "Related Complementary Assets By Asset IDs error case", RequestTest: func(api *admin.API, ctx context.Context) (interface{}, error) { - return api.AddRelatedComplementaryAssetsByAssetIDs(ctx, admin.AddRelatedComplementaryAssetsByAssetIDsParams{AssetID: cldtest.AssetID}) + return api.AddRelatedComplementaryAssetsByAssetIDs(ctx, admin.RelatedComplementaryAssetsByAssetIDsParams{AssetID: cldtest.AssetID}) }, ResponseTest: func(response interface{}, t *testing.T) { v, ok := response.(*admin.AddRelatedAssetsResult) @@ -1310,7 +1310,7 @@ func getAddRelatedComplementaryAssetsByAssetIDsTestCases() []AdminAPIAcceptanceT // Acceptance test cases for `DeleteRelatedAssetsByAssetIDs` method func getDeleteRelatedComplementaryAssetsByAssetIDsTestCases() []AdminAPIAcceptanceTestCase { type deleteRelatedComplementaryAssetsByAssetIDsTestCase struct { - requestParams admin.DeleteRelatedComplementaryAssetsByAssetIDsParams + requestParams admin.RelatedComplementaryAssetsByAssetIDsParams uri string expectedParams *string } @@ -1339,13 +1339,13 @@ func getDeleteRelatedComplementaryAssetsByAssetIDsTestCases() []AdminAPIAcceptan var testCases []AdminAPIAcceptanceTestCase - params := fmt.Sprintf("{\"complementary_assets_to_unrelate\":[\"%s\",\"%s\"],\"subkind\":\"subkind\"}", cldtest.AssetID2, cldtest.AssetID3) + params := fmt.Sprintf("{\"related_asset_ids\":[\"%s\",\"%s\"],\"complementary_type\":\"complementary_type\"}", cldtest.AssetID2, cldtest.AssetID3) deleteRelatedComplementaryAssetsByAssetIDsTestCases := []deleteRelatedComplementaryAssetsByAssetIDsTestCase{ { - requestParams: admin.DeleteRelatedComplementaryAssetsByAssetIDsParams{ - AssetID: cldtest.AssetID, - ComplementaryAssetsToUnrelate: []string{cldtest.AssetID2, cldtest.AssetID3}, - Subkind: "subkind", + requestParams: admin.RelatedComplementaryAssetsByAssetIDsParams{ + AssetID: cldtest.AssetID, + RelatedAssetIDs: []string{cldtest.AssetID2, cldtest.AssetID3}, + ComplementaryType: "complementary_type", }, uri: "/resources/related_complementary_assets/" + cldtest.AssetID, expectedParams: ¶ms, @@ -1359,7 +1359,7 @@ func getDeleteRelatedComplementaryAssetsByAssetIDsTestCases() []AdminAPIAcceptan testCases = append(testCases, AdminAPIAcceptanceTestCase{ Name: "Related Complementary Assets By Asset IDs error case", RequestTest: func(api *admin.API, ctx context.Context) (interface{}, error) { - return api.DeleteRelatedComplementaryAssetsByAssetIDs(ctx, admin.DeleteRelatedComplementaryAssetsByAssetIDsParams{AssetID: cldtest.AssetID}) + return api.DeleteRelatedComplementaryAssetsByAssetIDs(ctx, admin.RelatedComplementaryAssetsByAssetIDsParams{AssetID: cldtest.AssetID}) }, ResponseTest: func(response interface{}, t *testing.T) { v, ok := response.(*admin.DeleteRelatedAssetsResult)