package com.sweetzpot.stravazpot.upload.request; import com.sweetzpot.stravazpot.upload.api.UploadAPI; import com.sweetzpot.stravazpot.upload.model.DataType; import com.sweetzpot.stravazpot.upload.model.UploadActivityType; import com.sweetzpot.stravazpot.upload.model.UploadStatus; import com.sweetzpot.stravazpot.upload.rest.UploadRest; import java.io.File; import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.RequestBody; import retrofit2.Call; public class UploadFileRequest { private final File file; private final UploadRest restService; private final UploadAPI uploadAPI; private UploadActivityType activityType; private String name; private String description; private boolean isPrivate; private boolean hasTrainer; private boolean isCommute; private DataType dataType; private String externalID; public UploadFileRequest(File file, UploadRest restService, UploadAPI uploadAPI) { this.file = file; this.restService = restService; this.uploadAPI = uploadAPI; } public UploadFileRequest withDataType(DataType dataType) { this.dataType = dataType; return this; } public UploadFileRequest withActivityType(UploadActivityType activityType) { this.activityType = activityType; return this; } public UploadFileRequest withName(String name) { this.name = name; return this; } public UploadFileRequest withDescription(String description) { this.description = description; return this; } public UploadFileRequest isPrivate(boolean isPrivate) { this.isPrivate = isPrivate; return this; } public UploadFileRequest hasTrainer(boolean hasTrainer) { this.hasTrainer = hasTrainer; return this; } public UploadFileRequest isCommute(boolean isCommute) { this.isCommute = isCommute; return this; } public UploadFileRequest withExternalID(String externalID) { this.externalID = externalID; return this; } public UploadStatus execute() { RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file); MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), requestFile); Call<UploadStatus> call = restService.upload( requestBodyFromString(activityType.toString()), requestBodyFromString(name), requestBodyFromString(description), booleanToInt(isPrivate), booleanToInt(hasTrainer), booleanToInt(isCommute), requestBodyFromString(dataType.toString()), requestBodyFromString(externalID), body); return uploadAPI.execute(call); } private RequestBody requestBodyFromString(String str) { return RequestBody.create(MultipartBody.FORM, str); } private Integer booleanToInt(boolean b) { return b ? 1 : 0; } }