From b3a55b1c5537e99c9e8fdfe3556ce28187f52cc1 Mon Sep 17 00:00:00 2001 From: jjj-n <1357598741@qq.com> Date: Mon, 7 Sep 2026 11:22:57 +0800 Subject: [PATCH] feat: add organization-level concordance search --- .../client/glossaries/GlossariesApi.java | 14 ++++++++++++++ .../SearchOrganizationConcordanceRequest.java | 13 +++++++++++++ .../TranslationMemoryApi.java | 15 +++++++++++++++ .../SearchOrganizationConcordanceRequest.java | 15 +++++++++++++++ .../client/glossaries/GlossariesApiTest.java | 15 ++++++++++++++- .../TranslationMemoryApiTest.java | 18 +++++++++++++++++- .../organizationConcordanceSearchRequest.json | 8 ++++++++ .../organizationConcordanceSearchRequest.json | 10 ++++++++++ 8 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/crowdin/client/glossaries/model/SearchOrganizationConcordanceRequest.java create mode 100644 src/main/java/com/crowdin/client/translationmemory/model/SearchOrganizationConcordanceRequest.java create mode 100644 src/test/resources/api/glossaries/organizationConcordanceSearchRequest.json create mode 100644 src/test/resources/api/translationmemory/organizationConcordanceSearchRequest.json diff --git a/src/main/java/com/crowdin/client/glossaries/GlossariesApi.java b/src/main/java/com/crowdin/client/glossaries/GlossariesApi.java index 0f1e2bdb5..e2df82341 100644 --- a/src/main/java/com/crowdin/client/glossaries/GlossariesApi.java +++ b/src/main/java/com/crowdin/client/glossaries/GlossariesApi.java @@ -36,6 +36,20 @@ public ResponseList searchConcordance(Long projectId, SearchC return SearchConcordanceResponseList.of(searchConcordanceResponseList); } + /** + * @param request request object + * @return list of search results + * @see + */ + public ResponseList searchOrganizationConcordance(SearchOrganizationConcordanceRequest request) throws HttpException, HttpBadRequestException { + SearchConcordanceResponseList searchConcordanceResponseList = + this.httpClient.post(this.url + "/glossaries/concordance", request, new HttpRequestConfig(), SearchConcordanceResponseList.class); + return SearchConcordanceResponseList.of(searchConcordanceResponseList); + } + /** * @param glossaryId glossary identifier * @param limit maximum number of items to retrieve (default 25) diff --git a/src/main/java/com/crowdin/client/glossaries/model/SearchOrganizationConcordanceRequest.java b/src/main/java/com/crowdin/client/glossaries/model/SearchOrganizationConcordanceRequest.java new file mode 100644 index 000000000..6298074d1 --- /dev/null +++ b/src/main/java/com/crowdin/client/glossaries/model/SearchOrganizationConcordanceRequest.java @@ -0,0 +1,13 @@ +package com.crowdin.client.glossaries.model; + +import lombok.Data; + +import java.util.List; + +@Data +public class SearchOrganizationConcordanceRequest { + private String sourceLanguageId; + private String targetLanguageId; + private List expressions; + private Long userId; +} diff --git a/src/main/java/com/crowdin/client/translationmemory/TranslationMemoryApi.java b/src/main/java/com/crowdin/client/translationmemory/TranslationMemoryApi.java index e7242639d..b2be8b264 100644 --- a/src/main/java/com/crowdin/client/translationmemory/TranslationMemoryApi.java +++ b/src/main/java/com/crowdin/client/translationmemory/TranslationMemoryApi.java @@ -11,6 +11,7 @@ import com.crowdin.client.translationmemory.model.SearchConcordanceRequest; import com.crowdin.client.translationmemory.model.SearchConcordanceResponse; import com.crowdin.client.translationmemory.model.SearchConcordanceResponseList; +import com.crowdin.client.translationmemory.model.SearchOrganizationConcordanceRequest; import com.crowdin.client.translationmemory.model.TmSegment; import com.crowdin.client.translationmemory.model.TmSegmentResponseList; import com.crowdin.client.translationmemory.model.TmSegmentResponseObject; @@ -52,6 +53,20 @@ public ResponseList searchConcordance(Long projectId, SearchC return SearchConcordanceResponse.of(searchConcordanceResponse); } + /** + * @param request request object + * @return list of search results + * @see + */ + public ResponseList searchOrganizationConcordance(SearchOrganizationConcordanceRequest request) throws HttpException, HttpBadRequestException { + String url = this.url + "/tms/concordance"; + SearchConcordanceResponseList searchConcordanceResponse = this.httpClient.post(url, request, new HttpRequestConfig(), SearchConcordanceResponseList.class); + return SearchConcordanceResponse.of(searchConcordanceResponse); + } + /** * @param groupId group identifier * @param limit maximum number of items to retrieve (default 25) diff --git a/src/main/java/com/crowdin/client/translationmemory/model/SearchOrganizationConcordanceRequest.java b/src/main/java/com/crowdin/client/translationmemory/model/SearchOrganizationConcordanceRequest.java new file mode 100644 index 000000000..2054d83be --- /dev/null +++ b/src/main/java/com/crowdin/client/translationmemory/model/SearchOrganizationConcordanceRequest.java @@ -0,0 +1,15 @@ +package com.crowdin.client.translationmemory.model; + +import lombok.Data; + +import java.util.List; + +@Data +public class SearchOrganizationConcordanceRequest { + private String sourceLanguageId; + private String targetLanguageId; + private Boolean autoSubstitution; + private Integer minRelevant; + private List expressions; + private Long userId; +} diff --git a/src/test/java/com/crowdin/client/glossaries/GlossariesApiTest.java b/src/test/java/com/crowdin/client/glossaries/GlossariesApiTest.java index d39c41c8d..e04681c2b 100644 --- a/src/test/java/com/crowdin/client/glossaries/GlossariesApiTest.java +++ b/src/test/java/com/crowdin/client/glossaries/GlossariesApiTest.java @@ -72,7 +72,8 @@ public List getMocks() { RequestMock.build(this.url + "/glossaries/" + glossaryId + "/terms/" + termId, HttpGet.METHOD_NAME, "api/glossaries/term.json"), RequestMock.build(this.url + "/glossaries/" + glossaryId + "/terms/" + termId, HttpDelete.METHOD_NAME), RequestMock.build(this.url + "/glossaries/" + glossaryId + "/terms/" + termId, HttpPatch.METHOD_NAME, "api/glossaries/editTerm.json", "api/glossaries/term.json"), - RequestMock.build(this.url + "/projects/" + projectId + "/glossaries/concordance", HttpPost.METHOD_NAME, "api/glossaries/concordanceSearchRequest.json", "api/glossaries/concordanceSearchResponse.json") + RequestMock.build(this.url + "/projects/" + projectId + "/glossaries/concordance", HttpPost.METHOD_NAME, "api/glossaries/concordanceSearchRequest.json", "api/glossaries/concordanceSearchResponse.json"), + RequestMock.build(this.url + "/glossaries/concordance", HttpPost.METHOD_NAME, "api/glossaries/organizationConcordanceSearchRequest.json", "api/glossaries/concordanceSearchResponse.json") ); } @@ -90,6 +91,18 @@ public void concordanceSearchTest() { assertEquals(searchConcordanceResponseList.getData().get(0).getData().getTargetTerms().get(0).getId(), termId); } + @Test + public void searchOrganizationConcordanceTest() { + SearchOrganizationConcordanceRequest request = new SearchOrganizationConcordanceRequest(); + request.setSourceLanguageId("en"); + request.setTargetLanguageId("de"); + request.setExpressions(singletonList("Welcome!")); + request.setUserId(12L); + ResponseList responseList = this.getGlossariesApi().searchOrganizationConcordance(request); + assertEquals(1, responseList.getData().size()); + assertEquals(glossaryId, responseList.getData().get(0).getData().getGlossary().getId()); + } + @Test public void listConceptsTest() { ResponseList conceptResponseList = this.getGlossariesApi().listConcepts(glossaryId, null, null); diff --git a/src/test/java/com/crowdin/client/translationmemory/TranslationMemoryApiTest.java b/src/test/java/com/crowdin/client/translationmemory/TranslationMemoryApiTest.java index 7ef6ec545..8dcd72094 100644 --- a/src/test/java/com/crowdin/client/translationmemory/TranslationMemoryApiTest.java +++ b/src/test/java/com/crowdin/client/translationmemory/TranslationMemoryApiTest.java @@ -10,6 +10,7 @@ import com.crowdin.client.translationmemory.model.AddTranslationMemoryRequest; import com.crowdin.client.translationmemory.model.SearchConcordance; import com.crowdin.client.translationmemory.model.SearchConcordanceRequest; +import com.crowdin.client.translationmemory.model.SearchOrganizationConcordanceRequest; import com.crowdin.client.translationmemory.model.TranslationMemory; import com.crowdin.client.translationmemory.model.TranslationMemoryExportRequest; import com.crowdin.client.translationmemory.model.TranslationMemoryExportStatus; @@ -54,7 +55,8 @@ public List getMocks() { RequestMock.build(this.url + "/tms/" + tmId + "/imports", HttpPost.METHOD_NAME, "api/translationmemory/importTm.json", "api/translationmemory/tmImportStatus.json"), RequestMock.build(this.url + "/tms/" + tmId + "/imports/" + importId, HttpGet.METHOD_NAME, "api/translationmemory/tmImportStatus.json"), RequestMock.build(String.format("%s/tms/%d/segments", this.url, tmId), HttpDelete.METHOD_NAME), - RequestMock.build(String.format("%s/projects/%d/tms/concordance", this.url, projectId), HttpPost.METHOD_NAME, "api/translationmemory/concordanceSearchRequest.json", "api/translationmemory/concordanceSearchResponse.json") + RequestMock.build(String.format("%s/projects/%d/tms/concordance", this.url, projectId), HttpPost.METHOD_NAME, "api/translationmemory/concordanceSearchRequest.json", "api/translationmemory/concordanceSearchResponse.json"), + RequestMock.build(this.url + "/tms/concordance", HttpPost.METHOD_NAME, "api/translationmemory/organizationConcordanceSearchRequest.json", "api/translationmemory/concordanceSearchResponse.json") ); } @@ -75,6 +77,20 @@ public void searchConcordanceTest() { assertEquals(searchConcordanceResponseList.getData().get(0).getData().getSubstituted(), "62→100"); } + @Test + public void searchOrganizationConcordanceTest() { + SearchOrganizationConcordanceRequest request = new SearchOrganizationConcordanceRequest(); + request.setSourceLanguageId("en"); + request.setTargetLanguageId("de"); + request.setAutoSubstitution(true); + request.setMinRelevant(60); + request.setExpressions(singletonList("Welcome!")); + request.setUserId(12L); + ResponseList responseList = this.getTranslationMemoryApi().searchOrganizationConcordance(request); + assertEquals(1, responseList.getData().size()); + assertEquals(tmId, responseList.getData().get(0).getData().getTm().getId()); + } + @Test public void listTmsTest() { ResponseList translationMemoryResponseList = this.getTranslationMemoryApi().listTms(null, null, null, null); diff --git a/src/test/resources/api/glossaries/organizationConcordanceSearchRequest.json b/src/test/resources/api/glossaries/organizationConcordanceSearchRequest.json new file mode 100644 index 000000000..05e9045ff --- /dev/null +++ b/src/test/resources/api/glossaries/organizationConcordanceSearchRequest.json @@ -0,0 +1,8 @@ +{ + "sourceLanguageId": "en", + "targetLanguageId": "de", + "expressions": [ + "Welcome!" + ], + "userId": 12 +} diff --git a/src/test/resources/api/translationmemory/organizationConcordanceSearchRequest.json b/src/test/resources/api/translationmemory/organizationConcordanceSearchRequest.json new file mode 100644 index 000000000..d4cdc1cf4 --- /dev/null +++ b/src/test/resources/api/translationmemory/organizationConcordanceSearchRequest.json @@ -0,0 +1,10 @@ +{ + "sourceLanguageId": "en", + "targetLanguageId": "de", + "autoSubstitution": true, + "minRelevant": 60, + "expressions": [ + "Welcome!" + ], + "userId": 12 +}