Skip to content

Commit 4805484

Browse files
feat: add support for revalidate qa checks (#359)
1 parent d871581 commit 4805484

7 files changed

Lines changed: 170 additions & 1 deletion

File tree

src/main/java/com/crowdin/client/translationstatus/TranslationStatusApi.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,17 @@
77
import com.crowdin.client.core.model.ClientConfig;
88
import com.crowdin.client.core.model.Credentials;
99
import com.crowdin.client.core.model.ResponseList;
10+
import com.crowdin.client.core.model.ResponseObject;
1011
import com.crowdin.client.translationstatus.model.Category;
1112
import com.crowdin.client.translationstatus.model.FileBranchProgress;
1213
import com.crowdin.client.translationstatus.model.FileProgressResponseList;
1314
import com.crowdin.client.translationstatus.model.LanguageProgress;
1415
import com.crowdin.client.translationstatus.model.LanguageProgressResponseList;
1516
import com.crowdin.client.translationstatus.model.QaCheck;
1617
import com.crowdin.client.translationstatus.model.QaCheckResponseList;
18+
import com.crowdin.client.translationstatus.model.QaCheckRevalidation;
19+
import com.crowdin.client.translationstatus.model.QaCheckRevalidationRequest;
20+
import com.crowdin.client.translationstatus.model.QaCheckRevalidationResponseObject;
1721
import com.crowdin.client.translationstatus.model.Validation;
1822

1923
import java.util.Map;
@@ -152,4 +156,46 @@ public ResponseList<QaCheck> listQaCheckIssues(Long projectId, Integer limit, In
152156
QaCheckResponseList qaCheckResponseList = this.httpClient.get(builtUrl, new HttpRequestConfig(queryParams), QaCheckResponseList.class);
153157
return QaCheckResponseList.to(qaCheckResponseList);
154158
}
159+
160+
/**
161+
* @param projectId project identifier
162+
* @param revalidationId qa checks revalidation identifier
163+
* @return status of qa checks revalidation job
164+
* @see <ul>
165+
* <li><a href="https://support.crowdin.com/developer/api/v2/#operation/api.projects.qa-checks.revalidate.get" target="_blank"><b>API Documentation</b></a></li>
166+
* <li><a href="https://support.crowdin.com/developer/enterprise/api/v2/#operation/api.projects.qa-checks.revalidate.get" target="_blank"><b>Enterprise API Documentation</b></a></li>
167+
* </ul>
168+
*/
169+
public ResponseObject<QaCheckRevalidation> getQaChecksRevalidationStatus(Long projectId, String revalidationId) throws HttpException, HttpBadRequestException {
170+
QaCheckRevalidationResponseObject qaCheckRevalidationResponseObject = this.httpClient.get(this.url + "/projects/" + projectId + "/qa-checks/revalidate/" + revalidationId, new HttpRequestConfig(), QaCheckRevalidationResponseObject.class);
171+
172+
return ResponseObject.of(qaCheckRevalidationResponseObject.getData());
173+
}
174+
175+
/**
176+
* @param projectId project identifier
177+
* @param request QaCheckRevalidationRequest
178+
* @return QaCheckRevalidation
179+
* @see <ul>
180+
* <li><a href="https://support.crowdin.com/developer/api/v2/#operation/api.projects.qa-checks.revalidate.post" target="_blank"><b>API Documentation</b></a></li>
181+
* <li><a href="https://support.crowdin.com/developer/enterprise/api/v2/#operation/api.projects.qa-checks.revalidate.post" target="_blank"><b>Enterprise API Documentation</b></a></li>
182+
* </ul>
183+
*/
184+
public ResponseObject<QaCheckRevalidation> revalidateQaChecks(Long projectId, QaCheckRevalidationRequest request) throws HttpException, HttpBadRequestException {
185+
QaCheckRevalidationResponseObject qaCheckRevalidationResponseObject = this.httpClient.post(this.url + "/projects/" + projectId + "/qa-checks/revalidate", request, new HttpRequestConfig(), QaCheckRevalidationResponseObject.class);
186+
187+
return ResponseObject.of(qaCheckRevalidationResponseObject.getData());
188+
}
189+
190+
/**
191+
* @param projectId project identifier
192+
* @param revalidationId qa checks revalidation identifier
193+
* @see <ul>
194+
* <li><a href="https://support.crowdin.com/developer/api/v2/#operation/api.projects.qa-checks.revalidate.delete" target="_blank"><b>API Documentation</b></a></li>
195+
* <li><a href="https://support.crowdin.com/developer/enterprise/api/v2/#operation/api.projects.qa-checks.revalidate.delete" target="_blank"><b>Enterprise API Documentation</b></a></li>
196+
* </ul>
197+
*/
198+
public void cancelQaChecksRevalidation(Long projectId, String revalidationId) throws HttpException, HttpBadRequestException {
199+
this.httpClient.delete(this.url + "/projects/" + projectId + "/qa-checks/revalidate/" + revalidationId, new HttpRequestConfig(), Void.class);
200+
}
155201
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.crowdin.client.translationstatus.model;
2+
3+
import lombok.Data;
4+
5+
import java.util.Date;
6+
import java.util.List;
7+
8+
@Data
9+
public class QaCheckRevalidation {
10+
private String identifier;
11+
private String status;
12+
private Long progress;
13+
private Attributes attributes;
14+
private Date createdAt;
15+
private Date updatedAt;
16+
private Date startedAt;
17+
private Date finishedAt;
18+
19+
@Data
20+
public static class Attributes {
21+
private List<String> languageIds;
22+
private List<String> qaCheckCategories;
23+
private Boolean failedOnly;
24+
}
25+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.crowdin.client.translationstatus.model;
2+
3+
import lombok.Data;
4+
5+
import java.util.List;
6+
7+
@Data
8+
public class QaCheckRevalidationRequest {
9+
10+
private List<String> qaCheckCategories;
11+
private List<String> languageIds;
12+
private Boolean failedOnly;
13+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.crowdin.client.translationstatus.model;
2+
3+
import lombok.Data;
4+
5+
@Data
6+
public class QaCheckRevalidationResponseObject {
7+
8+
private QaCheckRevalidation data;
9+
}

src/test/java/com/crowdin/client/translationstatus/TranslationStatusApiTest.java

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,31 @@
11
package com.crowdin.client.translationstatus;
22

33
import com.crowdin.client.core.model.ResponseList;
4+
import com.crowdin.client.core.model.ResponseObject;
45
import com.crowdin.client.framework.RequestMock;
56
import com.crowdin.client.framework.TestClient;
67
import com.crowdin.client.translationstatus.model.FileBranchProgress;
78
import com.crowdin.client.translationstatus.model.LanguageProgress;
89
import com.crowdin.client.translationstatus.model.QaCheck;
10+
import com.crowdin.client.translationstatus.model.QaCheckRevalidation;
11+
import com.crowdin.client.translationstatus.model.QaCheckRevalidationRequest;
12+
import org.apache.http.client.methods.HttpDelete;
913
import org.apache.http.client.methods.HttpGet;
14+
import org.apache.http.client.methods.HttpPost;
1015
import org.junit.jupiter.api.Test;
1116

1217
import java.util.Arrays;
18+
import java.util.Calendar;
19+
import java.util.Collections;
20+
import java.util.Date;
1321
import java.util.List;
1422

1523
import static org.junit.jupiter.api.Assertions.assertEquals;
1624

1725
public class TranslationStatusApiTest extends TestClient {
1826

1927
private final Long projectId = 2L;
28+
private final String revalidationId = "b5215a34-1305-4b21-8054-fc2eb252842f";
2029
private final Long branchId = 3L;
2130
private final Long directoryId = 4L;
2231
private final Long fileId = 5L;
@@ -30,7 +39,10 @@ public List<RequestMock> getMocks() {
3039
RequestMock.build(this.url + "/projects/" + projectId + "/files/" + fileId + "/languages/progress", HttpGet.METHOD_NAME, "api/translationstatus/fileProgress.json"),
3140
RequestMock.build(this.url + "/projects/" + projectId + "/languages/" + languageId + "/progress", HttpGet.METHOD_NAME, "api/translationstatus/languageProgress.json"),
3241
RequestMock.build(this.url + "/projects/" + projectId + "/languages/progress", HttpGet.METHOD_NAME, "api/translationstatus/projectProgress.json"),
33-
RequestMock.build(this.url + "/projects/" + projectId + "/qa-checks", HttpGet.METHOD_NAME, "api/translationstatus/listQaChecks.json")
42+
RequestMock.build(this.url + "/projects/" + projectId + "/qa-checks", HttpGet.METHOD_NAME, "api/translationstatus/listQaChecks.json"),
43+
RequestMock.build(this.url + "/projects/" + projectId + "/qa-checks/revalidate/" + revalidationId, HttpGet.METHOD_NAME, "api/translationstatus/qaChecksRevalidation.json"),
44+
RequestMock.build(this.url + "/projects/" + projectId + "/qa-checks/revalidate", HttpPost.METHOD_NAME, "api/translationstatus/qaChecksRevalidationRequest.json","api/translationstatus/qaChecksRevalidation.json"),
45+
RequestMock.build(this.url + "/projects/" + projectId + "/qa-checks/revalidate/" + revalidationId, HttpDelete.METHOD_NAME)
3446
);
3547
}
3648

@@ -80,4 +92,37 @@ public void listQaCheckIssuesTest() {
8092
assertEquals(qaCheckResponseList.getData().size(), 1);
8193
assertEquals(qaCheckResponseList.getData().get(0).getData().getLanguageId(), languageId);
8294
}
95+
96+
@Test
97+
public void getQaChecksRevalidationStatusTest() {
98+
ResponseObject<QaCheckRevalidation> qaCheckRevalidationResponseObject = this.getTranslationStatusApi().getQaChecksRevalidationStatus(projectId, revalidationId);
99+
assertEquals(qaCheckRevalidationResponseObject.getData().getStatus(), "created");
100+
assertEquals(qaCheckRevalidationResponseObject.getData().getProgress(), 0L);
101+
assertEquals(qaCheckRevalidationResponseObject.getData().getAttributes().getLanguageIds(), Arrays.asList("uk", "fr"));
102+
assertEquals(qaCheckRevalidationResponseObject.getData().getAttributes().getFailedOnly(), false);
103+
Date createdDate = new Date(2025 - 1900, Calendar.SEPTEMBER, 23, 11, 51, 8);
104+
assertEquals(qaCheckRevalidationResponseObject.getData().getCreatedAt(), createdDate);
105+
}
106+
107+
@Test
108+
public void revalidateQaChecksTest() {
109+
QaCheckRevalidationRequest request = new QaCheckRevalidationRequest();
110+
request.setLanguageIds(Arrays.asList("uk", "fr"));
111+
request.setQaCheckCategories(Collections.singletonList("ai"));
112+
request.setFailedOnly(true);
113+
ResponseObject<QaCheckRevalidation> qaCheckRevalidationResponseObject = this.getTranslationStatusApi().revalidateQaChecks(projectId, request);
114+
assertEquals(qaCheckRevalidationResponseObject.getData().getIdentifier(), revalidationId);
115+
assertEquals(qaCheckRevalidationResponseObject.getData().getStatus(), "created");
116+
assertEquals(qaCheckRevalidationResponseObject.getData().getProgress(), 0L);
117+
assertEquals(qaCheckRevalidationResponseObject.getData().getAttributes().getLanguageIds(), Arrays.asList("uk", "fr"));
118+
assertEquals(qaCheckRevalidationResponseObject.getData().getAttributes().getQaCheckCategories(), Collections.singletonList("ai"));
119+
assertEquals(qaCheckRevalidationResponseObject.getData().getAttributes().getFailedOnly(), false);
120+
Date createdDate = new Date(2025 - 1900, Calendar.SEPTEMBER, 23, 11, 51, 8);
121+
assertEquals(qaCheckRevalidationResponseObject.getData().getCreatedAt(), createdDate);
122+
}
123+
124+
@Test
125+
public void cancelQaChecksRevalidationTest() {
126+
this.getTranslationStatusApi().cancelQaChecksRevalidation(projectId, revalidationId);
127+
}
83128
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"data": {
3+
"identifier": "b5215a34-1305-4b21-8054-fc2eb252842f",
4+
"status": "created",
5+
"progress": 0,
6+
"attributes": {
7+
"languageIds": [
8+
"uk",
9+
"fr"
10+
],
11+
"qaCheckCategories": [
12+
"ai"
13+
],
14+
"failedOnly": false
15+
},
16+
"createdAt": "2025-09-23T11:51:08+00:00",
17+
"updatedAt": "2025-09-23T11:51:08+00:00",
18+
"startedAt": "2025-09-23T11:51:08+00:00",
19+
"finishedAt": null
20+
}
21+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"qaCheckCategories": [
3+
"ai"
4+
],
5+
"languageIds": [
6+
"uk",
7+
"fr"
8+
],
9+
"failedOnly": true
10+
}

0 commit comments

Comments
 (0)