diff --git a/src/main/java/com/crowdin/client/translationstatus/TranslationStatusApi.java b/src/main/java/com/crowdin/client/translationstatus/TranslationStatusApi.java index 8fcd970fb..513ddce3e 100644 --- a/src/main/java/com/crowdin/client/translationstatus/TranslationStatusApi.java +++ b/src/main/java/com/crowdin/client/translationstatus/TranslationStatusApi.java @@ -7,6 +7,7 @@ import com.crowdin.client.core.model.ClientConfig; import com.crowdin.client.core.model.Credentials; import com.crowdin.client.core.model.ResponseList; +import com.crowdin.client.core.model.ResponseObject; import com.crowdin.client.translationstatus.model.Category; import com.crowdin.client.translationstatus.model.FileBranchProgress; import com.crowdin.client.translationstatus.model.FileProgressResponseList; @@ -14,6 +15,9 @@ import com.crowdin.client.translationstatus.model.LanguageProgressResponseList; import com.crowdin.client.translationstatus.model.QaCheck; import com.crowdin.client.translationstatus.model.QaCheckResponseList; +import com.crowdin.client.translationstatus.model.QaCheckRevalidation; +import com.crowdin.client.translationstatus.model.QaCheckRevalidationRequest; +import com.crowdin.client.translationstatus.model.QaCheckRevalidationResponseObject; import com.crowdin.client.translationstatus.model.Validation; import java.util.Map; @@ -152,4 +156,46 @@ public ResponseList listQaCheckIssues(Long projectId, Integer limit, In QaCheckResponseList qaCheckResponseList = this.httpClient.get(builtUrl, new HttpRequestConfig(queryParams), QaCheckResponseList.class); return QaCheckResponseList.to(qaCheckResponseList); } + + /** + * @param projectId project identifier + * @param revalidationId qa checks revalidation identifier + * @return status of qa checks revalidation job + * @see + */ + public ResponseObject getQaChecksRevalidationStatus(Long projectId, String revalidationId) throws HttpException, HttpBadRequestException { + QaCheckRevalidationResponseObject qaCheckRevalidationResponseObject = this.httpClient.get(this.url + "/projects/" + projectId + "/qa-checks/revalidate/" + revalidationId, new HttpRequestConfig(), QaCheckRevalidationResponseObject.class); + + return ResponseObject.of(qaCheckRevalidationResponseObject.getData()); + } + + /** + * @param projectId project identifier + * @param request QaCheckRevalidationRequest + * @return QaCheckRevalidation + * @see + */ + public ResponseObject revalidateQaChecks(Long projectId, QaCheckRevalidationRequest request) throws HttpException, HttpBadRequestException { + QaCheckRevalidationResponseObject qaCheckRevalidationResponseObject = this.httpClient.post(this.url + "/projects/" + projectId + "/qa-checks/revalidate", request, new HttpRequestConfig(), QaCheckRevalidationResponseObject.class); + + return ResponseObject.of(qaCheckRevalidationResponseObject.getData()); + } + + /** + * @param projectId project identifier + * @param revalidationId qa checks revalidation identifier + * @see + */ + public void cancelQaChecksRevalidation(Long projectId, String revalidationId) throws HttpException, HttpBadRequestException { + this.httpClient.delete(this.url + "/projects/" + projectId + "/qa-checks/revalidate/" + revalidationId, new HttpRequestConfig(), Void.class); + } } diff --git a/src/main/java/com/crowdin/client/translationstatus/model/QaCheckRevalidation.java b/src/main/java/com/crowdin/client/translationstatus/model/QaCheckRevalidation.java new file mode 100644 index 000000000..3bf4bebb0 --- /dev/null +++ b/src/main/java/com/crowdin/client/translationstatus/model/QaCheckRevalidation.java @@ -0,0 +1,25 @@ +package com.crowdin.client.translationstatus.model; + +import lombok.Data; + +import java.util.Date; +import java.util.List; + +@Data +public class QaCheckRevalidation { + private String identifier; + private String status; + private Long progress; + private Attributes attributes; + private Date createdAt; + private Date updatedAt; + private Date startedAt; + private Date finishedAt; + + @Data + public static class Attributes { + private List languageIds; + private List qaCheckCategories; + private Boolean failedOnly; + } +} diff --git a/src/main/java/com/crowdin/client/translationstatus/model/QaCheckRevalidationRequest.java b/src/main/java/com/crowdin/client/translationstatus/model/QaCheckRevalidationRequest.java new file mode 100644 index 000000000..06d347098 --- /dev/null +++ b/src/main/java/com/crowdin/client/translationstatus/model/QaCheckRevalidationRequest.java @@ -0,0 +1,13 @@ +package com.crowdin.client.translationstatus.model; + +import lombok.Data; + +import java.util.List; + +@Data +public class QaCheckRevalidationRequest { + + private List qaCheckCategories; + private List languageIds; + private Boolean failedOnly; +} diff --git a/src/main/java/com/crowdin/client/translationstatus/model/QaCheckRevalidationResponseObject.java b/src/main/java/com/crowdin/client/translationstatus/model/QaCheckRevalidationResponseObject.java new file mode 100644 index 000000000..01f6bc0d7 --- /dev/null +++ b/src/main/java/com/crowdin/client/translationstatus/model/QaCheckRevalidationResponseObject.java @@ -0,0 +1,9 @@ +package com.crowdin.client.translationstatus.model; + +import lombok.Data; + +@Data +public class QaCheckRevalidationResponseObject { + + private QaCheckRevalidation data; +} diff --git a/src/test/java/com/crowdin/client/translationstatus/TranslationStatusApiTest.java b/src/test/java/com/crowdin/client/translationstatus/TranslationStatusApiTest.java index d62e8813c..e71de5c3a 100644 --- a/src/test/java/com/crowdin/client/translationstatus/TranslationStatusApiTest.java +++ b/src/test/java/com/crowdin/client/translationstatus/TranslationStatusApiTest.java @@ -1,15 +1,23 @@ package com.crowdin.client.translationstatus; import com.crowdin.client.core.model.ResponseList; +import com.crowdin.client.core.model.ResponseObject; import com.crowdin.client.framework.RequestMock; import com.crowdin.client.framework.TestClient; import com.crowdin.client.translationstatus.model.FileBranchProgress; import com.crowdin.client.translationstatus.model.LanguageProgress; import com.crowdin.client.translationstatus.model.QaCheck; +import com.crowdin.client.translationstatus.model.QaCheckRevalidation; +import com.crowdin.client.translationstatus.model.QaCheckRevalidationRequest; +import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; import org.junit.jupiter.api.Test; import java.util.Arrays; +import java.util.Calendar; +import java.util.Collections; +import java.util.Date; import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -17,6 +25,7 @@ public class TranslationStatusApiTest extends TestClient { private final Long projectId = 2L; + private final String revalidationId = "b5215a34-1305-4b21-8054-fc2eb252842f"; private final Long branchId = 3L; private final Long directoryId = 4L; private final Long fileId = 5L; @@ -30,7 +39,10 @@ public List getMocks() { RequestMock.build(this.url + "/projects/" + projectId + "/files/" + fileId + "/languages/progress", HttpGet.METHOD_NAME, "api/translationstatus/fileProgress.json"), RequestMock.build(this.url + "/projects/" + projectId + "/languages/" + languageId + "/progress", HttpGet.METHOD_NAME, "api/translationstatus/languageProgress.json"), RequestMock.build(this.url + "/projects/" + projectId + "/languages/progress", HttpGet.METHOD_NAME, "api/translationstatus/projectProgress.json"), - RequestMock.build(this.url + "/projects/" + projectId + "/qa-checks", HttpGet.METHOD_NAME, "api/translationstatus/listQaChecks.json") + RequestMock.build(this.url + "/projects/" + projectId + "/qa-checks", HttpGet.METHOD_NAME, "api/translationstatus/listQaChecks.json"), + RequestMock.build(this.url + "/projects/" + projectId + "/qa-checks/revalidate/" + revalidationId, HttpGet.METHOD_NAME, "api/translationstatus/qaChecksRevalidation.json"), + RequestMock.build(this.url + "/projects/" + projectId + "/qa-checks/revalidate", HttpPost.METHOD_NAME, "api/translationstatus/qaChecksRevalidationRequest.json","api/translationstatus/qaChecksRevalidation.json"), + RequestMock.build(this.url + "/projects/" + projectId + "/qa-checks/revalidate/" + revalidationId, HttpDelete.METHOD_NAME) ); } @@ -80,4 +92,37 @@ public void listQaCheckIssuesTest() { assertEquals(qaCheckResponseList.getData().size(), 1); assertEquals(qaCheckResponseList.getData().get(0).getData().getLanguageId(), languageId); } + + @Test + public void getQaChecksRevalidationStatusTest() { + ResponseObject qaCheckRevalidationResponseObject = this.getTranslationStatusApi().getQaChecksRevalidationStatus(projectId, revalidationId); + assertEquals(qaCheckRevalidationResponseObject.getData().getStatus(), "created"); + assertEquals(qaCheckRevalidationResponseObject.getData().getProgress(), 0L); + assertEquals(qaCheckRevalidationResponseObject.getData().getAttributes().getLanguageIds(), Arrays.asList("uk", "fr")); + assertEquals(qaCheckRevalidationResponseObject.getData().getAttributes().getFailedOnly(), false); + Date createdDate = new Date(2025 - 1900, Calendar.SEPTEMBER, 23, 11, 51, 8); + assertEquals(qaCheckRevalidationResponseObject.getData().getCreatedAt(), createdDate); + } + + @Test + public void revalidateQaChecksTest() { + QaCheckRevalidationRequest request = new QaCheckRevalidationRequest(); + request.setLanguageIds(Arrays.asList("uk", "fr")); + request.setQaCheckCategories(Collections.singletonList("ai")); + request.setFailedOnly(true); + ResponseObject qaCheckRevalidationResponseObject = this.getTranslationStatusApi().revalidateQaChecks(projectId, request); + assertEquals(qaCheckRevalidationResponseObject.getData().getIdentifier(), revalidationId); + assertEquals(qaCheckRevalidationResponseObject.getData().getStatus(), "created"); + assertEquals(qaCheckRevalidationResponseObject.getData().getProgress(), 0L); + assertEquals(qaCheckRevalidationResponseObject.getData().getAttributes().getLanguageIds(), Arrays.asList("uk", "fr")); + assertEquals(qaCheckRevalidationResponseObject.getData().getAttributes().getQaCheckCategories(), Collections.singletonList("ai")); + assertEquals(qaCheckRevalidationResponseObject.getData().getAttributes().getFailedOnly(), false); + Date createdDate = new Date(2025 - 1900, Calendar.SEPTEMBER, 23, 11, 51, 8); + assertEquals(qaCheckRevalidationResponseObject.getData().getCreatedAt(), createdDate); + } + + @Test + public void cancelQaChecksRevalidationTest() { + this.getTranslationStatusApi().cancelQaChecksRevalidation(projectId, revalidationId); + } } diff --git a/src/test/resources/api/translationstatus/qaChecksRevalidation.json b/src/test/resources/api/translationstatus/qaChecksRevalidation.json new file mode 100644 index 000000000..8bed17718 --- /dev/null +++ b/src/test/resources/api/translationstatus/qaChecksRevalidation.json @@ -0,0 +1,21 @@ +{ + "data": { + "identifier": "b5215a34-1305-4b21-8054-fc2eb252842f", + "status": "created", + "progress": 0, + "attributes": { + "languageIds": [ + "uk", + "fr" + ], + "qaCheckCategories": [ + "ai" + ], + "failedOnly": false + }, + "createdAt": "2025-09-23T11:51:08+00:00", + "updatedAt": "2025-09-23T11:51:08+00:00", + "startedAt": "2025-09-23T11:51:08+00:00", + "finishedAt": null + } +} \ No newline at end of file diff --git a/src/test/resources/api/translationstatus/qaChecksRevalidationRequest.json b/src/test/resources/api/translationstatus/qaChecksRevalidationRequest.json new file mode 100644 index 000000000..38c899739 --- /dev/null +++ b/src/test/resources/api/translationstatus/qaChecksRevalidationRequest.json @@ -0,0 +1,10 @@ +{ + "qaCheckCategories": [ + "ai" + ], + "languageIds": [ + "uk", + "fr" + ], + "failedOnly": true +} \ No newline at end of file