Skip to content

Commit

Permalink
Upload additional files (media) to the asset and solved inconsistency…
Browse files Browse the repository at this point in the history
… asset vs. file name (#99)

* Upload of additional files to media

* Fixed issue and inconsistency with file / asset name, implementation of upload additional file. Updated sample program and tests.

* Removed upload sample

Co-authored-by: Alfredo Navarro <alfredo.navarro@redbull.com>
  • Loading branch information
alfnav and alfnav committed Jan 23, 2023
1 parent c2ee54f commit 170a564
Show file tree
Hide file tree
Showing 9 changed files with 189 additions and 19 deletions.
10 changes: 6 additions & 4 deletions src/main/java/com/bynder/sdk/api/BynderApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,7 @@

import com.bynder.sdk.model.Tag;
import com.bynder.sdk.model.*;
import com.bynder.sdk.model.upload.FinaliseResponse;
import com.bynder.sdk.model.upload.PollStatus;
import com.bynder.sdk.model.upload.SaveMediaResponse;
import com.bynder.sdk.model.upload.UploadRequest;
import com.bynder.sdk.model.upload.*;
import io.reactivex.Observable;
import retrofit2.Response;
import retrofit2.http.*;
Expand Down Expand Up @@ -272,6 +269,11 @@ Observable<Response<Void>> shareCollection(@Path("id") String collectionId,
@POST("/api/v4/upload/")
Observable<Response<FinaliseResponse>> finaliseUpload(@FieldMap Map<String, String> params);

@FormUrlEncoded
@POST("/api/v4/media/{id}/save/additional/")
Observable<Response<UploadAdditionalMediaResponse>> finaliseUploadAdditional(@Path("id") String mediaId,
@FieldMap Map<String, String> params);

/**
* Gets poll processing status of finalised files.
*
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/*
* Copyright (c) 2017 Bynder B.V. All rights reserved.
*
* Licensed under the MIT License. See LICENSE file in the project root for full license
* information.
*/
package com.bynder.sdk.model.upload;

import com.bynder.sdk.api.BynderApi;
import com.google.gson.annotations.SerializedName;

import java.util.List;
import java.util.Map;

/**
* Model returned by {@link BynderApi#saveMedia(Map)}.
*/
public class UploadAdditionalMediaResponse {

/**
* Media id.
*/
@SerializedName(value = "itemId")
private String itemId;

public String getItemId() {
return itemId;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
/*
* Copyright (c) 2017 Bynder B.V. All rights reserved.
*
* Licensed under the MIT License. See LICENSE file in the project root for full license
* information.
*/
package com.bynder.sdk.query.upload;

import com.bynder.sdk.query.decoder.ApiField;

/**
* Query with the information to finalise a completely uploaded file.
*/
public class FinaliseUploadAdditionalQuery {

/**
* Upload id for the file being uploaded.
*/
@ApiField(name = "uploadId")
private final String uploadId;

/**
* Target id in the authorisation information.
*/
@ApiField(name = "targetid")
private final String targetId;

/**
* Base location of the uploaded file.
*/
@ApiField(name = "s3_filename")
private final String s3Filename;

/**
* Total number of chunks uploaded.
*/
@ApiField
private final Long chunks;

public FinaliseUploadAdditionalQuery(
final String uploadId,
final String targetId,
final String s3Filename,
final Long chunks
) {
this.uploadId = uploadId;
this.targetId = targetId;
this.s3Filename = s3Filename;
this.chunks = chunks;
}

public String getUploadId() {
return uploadId;
}

public String getTargetId() {
return targetId;
}

public String getS3Filename() {
return s3Filename;
}

public Long getChunks() {
return chunks;
}
}
19 changes: 13 additions & 6 deletions src/main/java/com/bynder/sdk/query/upload/UploadQuery.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,9 @@ public class UploadQuery {
/**
* Name of the file to upload
*/
private String name;
private String assetName;

private String fileName;

public UploadQuery(final String filepath, final String brandId) {
this.filepath = filepath;
Expand All @@ -63,7 +65,7 @@ public String getFilepath() {
}

public String getFilename() {
return Paths.get(filepath).getFileName().toString();
return (fileName == null) ? Paths.get(filepath).getFileName().toString() : fileName;
}

public String getBrandId() {
Expand All @@ -74,8 +76,8 @@ public String getMediaId() {
return mediaId;
}

public String getName() {
return name;
public String getAssetName() {
return (assetName == null) ? getFilename() : assetName;
}

public UploadQuery setMediaId(final String mediaId) {
Expand All @@ -92,8 +94,13 @@ public UploadQuery setAudit(final Boolean audit) {
return this;
}

public UploadQuery setName(final String name) {
this.name = name;
public UploadQuery setAssetName(final String assetName) {
this.assetName = assetName;
return this;
}

public UploadQuery setFileName(final String fileName) {
this.fileName = fileName;
return this;
}

Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/bynder/sdk/sample/AppSample.java
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ public static void main(final String[] args) throws URISyntaxException, IOExcept
String brandId = "your-brand-id";
UploadQuery uploadQuery = new UploadQuery(filePath, brandId);
// Add the filename you want specifiy in this manner
uploadQuery.setName("your-filename");
uploadQuery.setFileName("your-filename");
SaveMediaResponse saveMediaResponse = assetService.uploadFile(uploadQuery).blockingSingle();

// Optional: define callback function to be triggered after access token is auto
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/com/bynder/sdk/service/asset/AssetService.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import com.bynder.sdk.api.BynderApi;
import com.bynder.sdk.model.*;
import com.bynder.sdk.model.upload.SaveMediaResponse;
import com.bynder.sdk.model.upload.UploadAdditionalMediaResponse;
import com.bynder.sdk.model.upload.UploadProgress;
import com.bynder.sdk.query.*;
import com.bynder.sdk.query.decoder.QueryDecoder;
Expand Down Expand Up @@ -130,6 +131,8 @@ Observable<Response<Map<String, Metaproperty>>> getMetaproperties(
*/
Observable<SaveMediaResponse> uploadFile(UploadQuery uploadQuery);

Observable<UploadAdditionalMediaResponse> uploadAdditionalFile(UploadQuery uploadQuery);

/**
* Uploads a file with Progress Report.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import com.bynder.sdk.api.BynderApi;
import com.bynder.sdk.model.*;
import com.bynder.sdk.model.upload.SaveMediaResponse;
import com.bynder.sdk.model.upload.UploadAdditionalMediaResponse;
import com.bynder.sdk.model.upload.UploadProgress;
import com.bynder.sdk.query.*;
import com.bynder.sdk.query.decoder.QueryDecoder;
Expand Down Expand Up @@ -169,6 +170,11 @@ public Observable<SaveMediaResponse> uploadFile(final UploadQuery uploadQuery) {
return fileUploader.uploadFile(uploadQuery).toObservable();
}

@Override
public Observable<UploadAdditionalMediaResponse> uploadAdditionalFile(final UploadQuery uploadQuery) {
return fileUploader.uploadAdditionalFile(uploadQuery).toObservable();
}

/**
* Check {@link AssetService} for more information.
*/
Expand Down
29 changes: 25 additions & 4 deletions src/main/java/com/bynder/sdk/service/upload/FileUploader.java
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,25 @@ public Single<SaveMediaResponse> uploadFile(final UploadQuery uploadQuery) {
);
}

public Single<UploadAdditionalMediaResponse> uploadAdditionalFile(final UploadQuery uploadQuery) {
return getClosestS3Endpoint().flatMap(awsBucket -> {
String filename = uploadQuery.getFilename();
AmazonS3Service amazonS3Service = AmazonS3Service.Builder.create(awsBucket);
return getUploadInformation(new RequestUploadQuery(filename))
.flatMap(uploadRequest -> uploadChunk(
amazonS3Service,
uploadRequest,
uploadQuery,
filename
).count().flatMap(chunkCount -> finaliseUploadAdditional(new FinaliseUploadAdditionalQuery(
uploadRequest.getS3File().getUploadId(),
uploadRequest.getS3File().getTargetId(),
uploadRequest.getS3Filename(),
chunkCount
), uploadQuery.getMediaId())));
});
}

/**
* Uploads a file with the information specified in the query parameter
* while providing information on the progress of the upload via the Observable returned.
Expand Down Expand Up @@ -167,15 +186,12 @@ private Single<SaveMediaResponse> saveUploadedMedia(final String importId, final
SaveMediaQuery saveMediaQuery = new SaveMediaQuery(importId)
.setAudit(uploadQuery.isAudit())
.setMetaproperties(uploadQuery.getMetaproperties());
String fileName = uploadQuery.getName();
if (fileName == null)
fileName = uploadQuery.getFilename();

if (uploadQuery.getMediaId() == null) {
// A new asset will be created for the uploaded file.
return saveMedia(saveMediaQuery
.setBrandId(uploadQuery.getBrandId())
.setName(fileName)
.setName(uploadQuery.getAssetName())
.setTags(uploadQuery.getTags())
);
} else {
Expand Down Expand Up @@ -218,6 +234,11 @@ private Single<String> finaliseUpload(final FinaliseUploadQuery finaliseUploadQu
.map(FinaliseResponse::getImportId);
}

private Single<UploadAdditionalMediaResponse> finaliseUploadAdditional(final FinaliseUploadAdditionalQuery finaliseUploadQuery, String mediaId) {
Map<String, String> params = queryDecoder.decode(finaliseUploadQuery);
return bynderApi.finaliseUploadAdditional(mediaId, params).singleOrError().map(RXUtils::getResponseBody);
}

/**
* Check {@link BynderApi#getPollStatus(Map)} for more information.
*/
Expand Down
43 changes: 39 additions & 4 deletions src/test/java/com/bynder/sdk/query/upload/UploadQueryTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,15 @@
*/
public class UploadQueryTest {

public static final String EXPECTED_FILE_PATH = "filePath";
public static final String EXPECTED_FILE_PATH = "filePath/fileName";
public static final String EXPECTED_BRAND_ID = "brandId";
public static final String EXPECTED_MEDIA_ID = "mediaId";
public static final String EXPECTED_METAPROPERTY_ID = "metapropertyId";
public static final String EXPECTED_OPTION_NAME = "optionName";
public static final Boolean EXPECTED_AUDIT = Boolean.TRUE;
public static final String EXPECTED_TAGS = "tag1,tag2";
public static final String EXPECTED_NAME = "name";
public static final String EXPECTED_FILE_NAME = "fileName";
public static final String EXPECTED_ASSET_NAME = "assetName";
public static final List<MetapropertyAttribute> EXPECTED_METAPROPERTIES = new ArrayList<>();
public static final MetapropertyAttribute EXPECTED_METAPROPERTY = new MetapropertyAttribute(EXPECTED_METAPROPERTY_ID, new String[]{EXPECTED_OPTION_NAME});
static {
Expand All @@ -37,15 +38,49 @@ public void initializeUploadQuery() {
uploadQuery.setAudit(EXPECTED_AUDIT);
uploadQuery.setTags(Arrays.asList("tag1", "tag2"));
uploadQuery.addMetaproperty(EXPECTED_METAPROPERTY_ID, EXPECTED_OPTION_NAME);
uploadQuery.setName(EXPECTED_NAME);

assertTrue(EXPECTED_METAPROPERTY.equals(uploadQuery.getMetaproperties().get(0)));
assertEquals(EXPECTED_FILE_PATH, uploadQuery.getFilepath());
assertEquals(EXPECTED_BRAND_ID, uploadQuery.getBrandId());
assertEquals(EXPECTED_MEDIA_ID, uploadQuery.getMediaId());
assertEquals(EXPECTED_AUDIT, uploadQuery.isAudit());
assertEquals(EXPECTED_TAGS, uploadQuery.getTags());
assertEquals(EXPECTED_NAME, uploadQuery.getName());
assertEquals(EXPECTED_FILE_NAME, uploadQuery.getFilename());
assertEquals(EXPECTED_FILE_NAME, uploadQuery.getAssetName());
}

@Test
public void testCustomAssetNameOnly() {
UploadQuery uploadQuery = new UploadQuery(EXPECTED_FILE_PATH, EXPECTED_BRAND_ID);
uploadQuery.setAssetName(EXPECTED_ASSET_NAME);

assertEquals(EXPECTED_FILE_PATH, uploadQuery.getFilepath());
assertEquals(EXPECTED_BRAND_ID, uploadQuery.getBrandId());
assertEquals(EXPECTED_FILE_NAME, uploadQuery.getFilename());
assertEquals(EXPECTED_ASSET_NAME, uploadQuery.getAssetName());
}

@Test
public void testCustomFileNameOnly() {
UploadQuery uploadQuery = new UploadQuery(EXPECTED_FILE_PATH, EXPECTED_BRAND_ID);
uploadQuery.setFileName(EXPECTED_FILE_NAME);

assertEquals(EXPECTED_FILE_PATH, uploadQuery.getFilepath());
assertEquals(EXPECTED_BRAND_ID, uploadQuery.getBrandId());
assertEquals(EXPECTED_FILE_NAME, uploadQuery.getFilename());
assertEquals(EXPECTED_FILE_NAME, uploadQuery.getAssetName());
}

@Test
public void testCustomAssetAndFileName() {
UploadQuery uploadQuery = new UploadQuery(EXPECTED_FILE_PATH, EXPECTED_BRAND_ID);
uploadQuery.setFileName(EXPECTED_FILE_NAME);
uploadQuery.setAssetName(EXPECTED_ASSET_NAME);

assertEquals(EXPECTED_FILE_PATH, uploadQuery.getFilepath());
assertEquals(EXPECTED_BRAND_ID, uploadQuery.getBrandId());
assertEquals(EXPECTED_FILE_NAME, uploadQuery.getFilename());
assertEquals(EXPECTED_ASSET_NAME, uploadQuery.getAssetName());
}

@Test
Expand Down

0 comments on commit 170a564

Please sign in to comment.