From 714880cdc972b027091c57ca117e4b78fac133f0 Mon Sep 17 00:00:00 2001 From: selahattinozdmr Date: Mon, 14 Sep 2026 16:54:16 +0300 Subject: [PATCH] feat: add originalWordsCount and syncScope to Task model Task now exposes originalWordsCount (word count preserved from task creation, even after source strings are later removed) and, for Crowdin Enterprise, a nullable syncScope object (syncedWords, pendingWords, skippedWords) reflecting sync state with a linked organization/project task. Task.creatorId is already Long and Status is already a string enum in this client, so those parts of the upstream change are already correct here. The inter-organizational task patch path is a plain String on PatchRequest, so the new /generateCostEstimate, /generateTranslationCost, and /reportSettingsTemplateId paths need no client change. An organization-level "List Tasks" (api.tasks.getMany) endpoint isn't implemented in this client yet, so this only updates the Task model shared by the endpoints that do exist (project tasks, user tasks). Fixes #401 --- .../java/com/crowdin/client/tasks/model/Task.java | 13 +++++++++++++ .../java/com/crowdin/client/tasks/TasksApiTest.java | 4 ++++ src/test/resources/api/tasks/enterpriseTask.json | 6 ++++++ 3 files changed, 23 insertions(+) diff --git a/src/main/java/com/crowdin/client/tasks/model/Task.java b/src/main/java/com/crowdin/client/tasks/model/Task.java index 92c75ea64..df3215351 100644 --- a/src/main/java/com/crowdin/client/tasks/model/Task.java +++ b/src/main/java/com/crowdin/client/tasks/model/Task.java @@ -31,6 +31,7 @@ public class Task { private String translationUrl; private String webUrl; private Integer wordsCount; + private Integer originalWordsCount; private Integer filesCount; private Integer commentsCount; private Date deadline; @@ -45,4 +46,16 @@ public class Task { private List targetLanguages; private Object fields; private Long precedingTaskId; + /** + * Enterprise only. Null when the task is fully synced, not shared, or the counterpart + * task is unavailable. + */ + private SyncScope syncScope; + + @Data + public static class SyncScope { + private Integer syncedWords; + private Integer pendingWords; + private Integer skippedWords; + } } diff --git a/src/test/java/com/crowdin/client/tasks/TasksApiTest.java b/src/test/java/com/crowdin/client/tasks/TasksApiTest.java index b879fd5cf..752410959 100644 --- a/src/test/java/com/crowdin/client/tasks/TasksApiTest.java +++ b/src/test/java/com/crowdin/client/tasks/TasksApiTest.java @@ -352,6 +352,10 @@ public void addStringsBasedEnterpriseTaskTest() { assertEquals(taskId, taskResponseObject.getData().getId()); assertEquals(status, taskResponseObject.getData().getStatus()); assertEquals(fields, taskResponseObject.getData().getFields()); + assertEquals(30, taskResponseObject.getData().getOriginalWordsCount()); + assertEquals(10, taskResponseObject.getData().getSyncScope().getSyncedWords()); + assertEquals(5, taskResponseObject.getData().getSyncScope().getPendingWords()); + assertEquals(2, taskResponseObject.getData().getSyncScope().getSkippedWords()); } @Test diff --git a/src/test/resources/api/tasks/enterpriseTask.json b/src/test/resources/api/tasks/enterpriseTask.json index 9be5a35f0..4b55cc4ec 100644 --- a/src/test/resources/api/tasks/enterpriseTask.json +++ b/src/test/resources/api/tasks/enterpriseTask.json @@ -38,6 +38,7 @@ "translationUrl": "/proofread/9092638ac9f2a2d1b5571d08edc53763/all/en-fr/10?task=dac37aff364d83899128e68afe0de4994", "webUrl": "https://crowdin.com/project/example-project/tasks/1", "wordsCount": 24, + "originalWordsCount": 30, "commentsCount": 0, "deadline": "2019-09-27T07:00:14+00:00", "startedAt": "2019-09-27T07:00:14+00:00", @@ -106,6 +107,11 @@ ], "fields": { "test-key": "test-value" + }, + "syncScope": { + "syncedWords": 10, + "pendingWords": 5, + "skippedWords": 2 } } } \ No newline at end of file