Skip to content

Commit 974ec8d

Browse files
feat: add post method for files zip into files api (#126)
1 parent f4ef254 commit 974ec8d

File tree

5 files changed

+141
-5
lines changed

5 files changed

+141
-5
lines changed

smartling-files-api/src/main/java/com/smartling/api/files/v2/FilesApi.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.smartling.api.files.v2.pto.DeleteFilePTO;
44
import com.smartling.api.files.v2.pto.DownloadAllFileTranslationsPTO;
5+
import com.smartling.api.files.v2.pto.DownloadMultipleFilesTranslationsPTO;
56
import com.smartling.api.files.v2.pto.DownloadMultipleTranslationsPTO;
67
import com.smartling.api.files.v2.pto.DownloadTranslationPTO;
78
import com.smartling.api.files.v2.pto.ExportTranslationsPTO;
@@ -19,10 +20,10 @@
1920
import com.smartling.api.files.v2.pto.RenameFilePto;
2021
import com.smartling.api.files.v2.pto.UploadFilePTO;
2122
import com.smartling.api.files.v2.pto.UploadFileResponse;
23+
import com.smartling.api.files.v2.resteasy.ext.TranslatedFileMultipart;
2224
import com.smartling.api.v2.client.exception.server.DetailedErrorMessage;
2325
import com.smartling.api.v2.response.EmptyData;
2426
import com.smartling.api.v2.response.ListResponse;
25-
import com.smartling.api.files.v2.resteasy.ext.TranslatedFileMultipart;
2627
import org.jboss.resteasy.annotations.providers.multipart.MultipartForm;
2728

2829
import javax.ws.rs.BeanParam;
@@ -33,7 +34,6 @@
3334
import javax.ws.rs.PathParam;
3435
import javax.ws.rs.Produces;
3536
import javax.ws.rs.QueryParam;
36-
3737
import java.io.InputStream;
3838

3939
import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
@@ -79,11 +79,26 @@ public interface FilesApi extends AutoCloseable
7979
@Produces(WILDCARD)
8080
InputStream downloadAllFileTranslations(@PathParam("projectId") String projectId, @BeanParam DownloadAllFileTranslationsPTO downloadAllFileTranslationsPTO);
8181

82+
/**
83+
* @deprecated use downloadMultipleFileTranslations with POST method
84+
*/
85+
@Deprecated
8286
@GET
8387
@Path("/files-api/v2/projects/{projectId}/files/zip")
8488
@Produces(WILDCARD)
8589
InputStream downloadMultipleFileTranslations(@PathParam("projectId") String projectId, @BeanParam DownloadMultipleTranslationsPTO downloadMultipleTranslationsPTO);
8690

91+
/**
92+
* Download multiple translated files as zip archive
93+
*
94+
* @return {@link InputStream} for zip archive with translated files, if files found for the given file filter;
95+
* null, if no files found for the given file filter.
96+
*/
97+
@POST
98+
@Path("/files-api/v2/projects/{projectId}/files/zip")
99+
@Produces(WILDCARD)
100+
InputStream downloadMultipleFileTranslations(@PathParam("projectId") String projectId, DownloadMultipleFilesTranslationsPTO downloadMultipleTranslationsPTO);
101+
87102
@GET
88103
@Path("/files-api/v2/projects/{projectId}/files/list")
89104
ListResponse<FileItemPTO> getFilesList(@PathParam("projectId") String projectId, @BeanParam GetFilesListPTO getFilesListPTO);
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.smartling.api.files.v2.pto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
import lombok.Singular;
8+
9+
import java.util.List;
10+
11+
@Data
12+
@NoArgsConstructor
13+
@AllArgsConstructor
14+
@Builder
15+
public class DownloadMultipleFilesTranslationsPTO
16+
{
17+
@Singular("file")
18+
private List<FileLocalePTO> files;
19+
private RetrievalType retrievalType;
20+
private Boolean includeOriginalStrings;
21+
private FileNameMode fileNameMode;
22+
private LocaleMode localeMode;
23+
private String zipFileName;
24+
private FileFilter fileFilter;
25+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.smartling.api.files.v2.pto;
2+
3+
public enum FileFilter
4+
{
5+
/**
6+
* All requested files will be included in the response
7+
*/
8+
ALL_FILES,
9+
/**
10+
* Only fully published files will be included in the response.
11+
*/
12+
PUBLISHED_FILES_ONLY
13+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.smartling.api.files.v2.pto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
import lombok.Singular;
8+
9+
import java.util.List;
10+
11+
@Data
12+
@NoArgsConstructor
13+
@AllArgsConstructor
14+
@Builder
15+
public class FileLocalePTO
16+
{
17+
private String fileUri;
18+
@Singular("localeId")
19+
private List<String> localeIds;
20+
}

smartling-files-api/src/test/java/com/smartling/api/files/v2/FilesApiIntTest.java

Lines changed: 66 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
package com.smartling.api.files.v2;
22

33
import com.github.tomakehurst.wiremock.junit.WireMockRule;
4+
import com.smartling.api.files.v2.pto.DownloadMultipleFilesTranslationsPTO;
45
import com.smartling.api.files.v2.pto.DownloadTranslationPTO;
6+
import com.smartling.api.files.v2.pto.FileFilter;
57
import com.smartling.api.files.v2.pto.FileLocaleLastModifiedPTO;
8+
import com.smartling.api.files.v2.pto.FileLocalePTO;
69
import com.smartling.api.files.v2.pto.FileLocaleStatusResponse;
10+
import com.smartling.api.files.v2.pto.FileNameMode;
711
import com.smartling.api.files.v2.pto.GetFileLastModifiedPTO;
12+
import com.smartling.api.files.v2.pto.LocaleMode;
813
import com.smartling.api.files.v2.pto.UploadFilePTO;
914
import com.smartling.api.files.v2.pto.UploadFileResponse;
1015
import com.smartling.api.files.v2.resteasy.ext.TranslatedFileMultipart;
@@ -19,25 +24,27 @@
1924
import java.io.ByteArrayInputStream;
2025
import java.io.InputStream;
2126
import java.net.URL;
22-
import java.util.Arrays;
2327
import java.util.HashMap;
2428
import java.util.Map;
2529
import java.util.UUID;
2630

2731
import static com.github.tomakehurst.wiremock.client.WireMock.aMultipart;
2832
import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
2933
import static com.github.tomakehurst.wiremock.client.WireMock.equalTo;
34+
import static com.github.tomakehurst.wiremock.client.WireMock.equalToJson;
3035
import static com.github.tomakehurst.wiremock.client.WireMock.get;
3136
import static com.github.tomakehurst.wiremock.client.WireMock.getRequestedFor;
3237
import static com.github.tomakehurst.wiremock.client.WireMock.post;
3338
import static com.github.tomakehurst.wiremock.client.WireMock.postRequestedFor;
3439
import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
3540
import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo;
3641
import static com.github.tomakehurst.wiremock.client.WireMock.urlPathMatching;
37-
import static com.smartling.api.v2.tests.wiremock.SmartlingWireMock.success;
3842
import static com.smartling.api.files.v2.pto.FileType.JSON;
3943
import static com.smartling.api.files.v2.pto.RetrievalType.PUBLISHED;
44+
import static com.smartling.api.v2.tests.wiremock.SmartlingWireMock.postJson;
45+
import static com.smartling.api.v2.tests.wiremock.SmartlingWireMock.success;
4046
import static java.nio.charset.StandardCharsets.UTF_8;
47+
import static java.util.Arrays.asList;
4148
import static org.junit.Assert.assertEquals;
4249

4350
public class FilesApiIntTest
@@ -153,7 +160,7 @@ public void shouldUploadFile() throws Exception
153160
.fileUri(FILE_URI)
154161
.file(new ByteArrayInputStream(rawBody.getBytes()))
155162
.directives(directives)
156-
.localeIdsToAuthorize(Arrays.asList("de-DE", "fr"))
163+
.localeIdsToAuthorize(asList("de-DE", "fr"))
157164
.build());
158165

159166
assertEquals(uploadFileResponse.getFileUri(), FILE_URI);
@@ -260,4 +267,60 @@ public void shouldGetFileLocaleStatus() throws Exception
260267
.withQueryParam("fileUri", equalTo(FILE_URI))
261268
);
262269
}
270+
271+
@Test
272+
public void shouldRetrieveMultipleFilesTranslations() throws Exception
273+
{
274+
final String rawResponseBody = UUID.randomUUID().toString();
275+
276+
final FileLocalePTO firstFileLocalePTO = FileLocalePTO.builder()
277+
.fileUri(FILE_URI + "1")
278+
.localeIds(asList("de-DE", "fr"))
279+
.build();
280+
281+
final FileLocalePTO secondFileLocalePTO = FileLocalePTO.builder()
282+
.fileUri(FILE_URI + "2")
283+
.localeIds(asList("es-ES", "uk-UA", "zh-CN"))
284+
.build();
285+
286+
final DownloadMultipleFilesTranslationsPTO requestBody = DownloadMultipleFilesTranslationsPTO.builder()
287+
.files(asList(firstFileLocalePTO, secondFileLocalePTO))
288+
.retrievalType(PUBLISHED)
289+
.includeOriginalStrings(true)
290+
.fileNameMode(FileNameMode.TRIM_LEADING)
291+
.localeMode(LocaleMode.LOCALE_IN_NAME)
292+
.zipFileName("archive.zip")
293+
.fileFilter(FileFilter.PUBLISHED_FILES_ONLY)
294+
.build();
295+
296+
smartlingApi.stubFor(postJson(urlPathMatching("/files-api/v2/projects/.+/files/zip"))
297+
.withRequestBody(equalToJson("{\n" +
298+
" \"files\": [{\n" +
299+
" \"fileUri\": \"" + FILE_URI + "1\",\n" +
300+
" \"localeIds\": [\"de-DE\", \"fr\"]\n" +
301+
" },{\n" +
302+
" \"fileUri\": \"" + FILE_URI + "2\",\n" +
303+
" \"localeIds\": [\"es-ES\", \"uk-UA\", \"zh-CN\"]\n" +
304+
" }],\n" +
305+
" \"retrievalType\": \"PUBLISHED\",\n" +
306+
" \"includeOriginalStrings\": true,\n" +
307+
" \"fileNameMode\": \"TRIM_LEADING\",\n" +
308+
" \"localeMode\": \"LOCALE_IN_NAME\",\n" +
309+
" \"zipFileName\": \"archive.zip\",\n" +
310+
" \"fileFilter\": \"PUBLISHED_FILES_ONLY\"\n" +
311+
"}")
312+
)
313+
.willReturn(aResponse()
314+
.withHeader("Content-Type", "application/octet-stream")
315+
.withBody(rawResponseBody)
316+
)
317+
);
318+
319+
final InputStream response = filesApi.downloadMultipleFileTranslations(
320+
PROJECT_ID,
321+
requestBody
322+
);
323+
324+
assertEquals(IOUtils.toString(response, UTF_8), rawResponseBody);
325+
}
263326
}

0 commit comments

Comments
 (0)