From 49424a27bad4dc3eb881d704fae80bf6b96ac619 Mon Sep 17 00:00:00 2001 From: Yevheniy Oliynyk Date: Sat, 25 Jan 2025 18:36:21 +0100 Subject: [PATCH] feat: reports api updates --- .../core/http/impl/json/DateDeserializer.java | 5 + .../impl/json/JacksonJsonTransformer.java | 3 + .../crowdin/client/reports/ReportsApi.java | 66 +++++++++++++- ...tributionRawDataGenerateReportRequest.java | 42 +++++++++ ...ationPostEditingGenerateReportRequest.java | 23 +---- .../model/GenerateGroupReportRequest.java | 82 +---------------- .../client/reports/model/IndividualRate.java | 13 +++ .../ListOrganizationReportSettingsParams.java | 13 +++ .../client/reports/model/MatchType.java | 8 +- .../client/reports/model/NetRateSchemes.java | 13 +++ ...rganizationReportSettingsTemplateList.java | 26 ++++++ ...nReportSettingsTemplateResponseObject.java | 9 ++ ...ranslateAccuracyGenerateReportRequest.java | 3 +- ...nslateEfficiencyGenerateReportRequest.java | 12 --- .../reports/model/ReportSettingsTemplate.java | 17 ++-- .../TopMembersGenerateReportRequest.java | 6 +- ...ranslateAccuracyGenerateReportRequest.java | 26 ++++++ ...nCostsPostEndingGenerateReportRequest.java | 48 ++++++++++ .../client/framework/TestHttpClient.java | 5 +- .../client/reports/GroupReportsApiTest.java | 27 ++---- .../client/reports/ReportsApiTest.java | 91 +++++++++++++++++-- .../reports/addReportSettingsTemplate.json | 6 -- .../addUserReportSettingsTemplate.json | 6 -- ...istOrganizationReportSettingsTemplate.json | 43 +++++++++ .../organizationReportSettingsTemplate.json | 36 ++++++++ 25 files changed, 468 insertions(+), 161 deletions(-) create mode 100644 src/main/java/com/crowdin/client/reports/model/ContributionRawDataGenerateReportRequest.java create mode 100644 src/main/java/com/crowdin/client/reports/model/IndividualRate.java create mode 100644 src/main/java/com/crowdin/client/reports/model/ListOrganizationReportSettingsParams.java create mode 100644 src/main/java/com/crowdin/client/reports/model/NetRateSchemes.java create mode 100644 src/main/java/com/crowdin/client/reports/model/OrganizationReportSettingsTemplateList.java create mode 100644 src/main/java/com/crowdin/client/reports/model/OrganizationReportSettingsTemplateResponseObject.java delete mode 100644 src/main/java/com/crowdin/client/reports/model/PreTranslateEfficiencyGenerateReportRequest.java create mode 100644 src/main/java/com/crowdin/client/reports/model/TranslateAccuracyGenerateReportRequest.java create mode 100644 src/main/java/com/crowdin/client/reports/model/TranslationCostsPostEndingGenerateReportRequest.java create mode 100644 src/test/resources/api/reports/listOrganizationReportSettingsTemplate.json create mode 100644 src/test/resources/api/reports/organizationReportSettingsTemplate.json diff --git a/src/main/java/com/crowdin/client/core/http/impl/json/DateDeserializer.java b/src/main/java/com/crowdin/client/core/http/impl/json/DateDeserializer.java index 4b73fd203..4c620724c 100644 --- a/src/main/java/com/crowdin/client/core/http/impl/json/DateDeserializer.java +++ b/src/main/java/com/crowdin/client/core/http/impl/json/DateDeserializer.java @@ -19,6 +19,11 @@ public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOExce return null; } + return deserializeDate(date); + } + + @SneakyThrows + public static Date deserializeDate(String date) { try { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); return format.parse(date); diff --git a/src/main/java/com/crowdin/client/core/http/impl/json/JacksonJsonTransformer.java b/src/main/java/com/crowdin/client/core/http/impl/json/JacksonJsonTransformer.java index 5c91dc4ad..3d6ec8d03 100644 --- a/src/main/java/com/crowdin/client/core/http/impl/json/JacksonJsonTransformer.java +++ b/src/main/java/com/crowdin/client/core/http/impl/json/JacksonJsonTransformer.java @@ -72,4 +72,7 @@ public String convert(T obj) { return this.objectMapper.writeValueAsString(obj); } + public ObjectMapper getObjectMapper() { + return this.objectMapper; + } } diff --git a/src/main/java/com/crowdin/client/reports/ReportsApi.java b/src/main/java/com/crowdin/client/reports/ReportsApi.java index d7535223e..b77b3cc0e 100644 --- a/src/main/java/com/crowdin/client/reports/ReportsApi.java +++ b/src/main/java/com/crowdin/client/reports/ReportsApi.java @@ -101,6 +101,70 @@ public ResponseObject downloadOrganizationReport(String reportId) return ResponseObject.of(responseObject.getData()); } + /** + * @return list of report settings template + * @see + */ + public ResponseList listOrganizationReportSettingsTemplates(ListOrganizationReportSettingsParams params) throws HttpException, HttpBadRequestException { + Map> queryParams = HttpRequestConfig.buildUrlParams( + "projectId", Optional.ofNullable(params.getProjectId()), + "groupId", Optional.ofNullable(params.getGroupId()), + "limit", Optional.ofNullable(params.getLimit()), + "offset", Optional.ofNullable(params.getOffset()) + ); + OrganizationReportSettingsTemplateList reportSettingsTemplateList = this.httpClient.get(this.url + "/reports/settings-templates", new HttpRequestConfig(queryParams), OrganizationReportSettingsTemplateList.class); + return OrganizationReportSettingsTemplateList.to(reportSettingsTemplateList); + } + + /** + * @param request request object + * @return report settings template + * @see + */ + public ResponseObject addOrganizationReportSettingsTemplate(ReportSettingsTemplate.OrganizationReportSettingsTemplate request) throws HttpException, HttpBadRequestException { + OrganizationReportSettingsTemplateResponseObject responseObject = this.httpClient.post(this.url + "/reports/settings-templates", request, new HttpRequestConfig(), OrganizationReportSettingsTemplateResponseObject.class); + return ResponseObject.of(responseObject.getData()); + } + + /** + * @param reportSettingsTemplateId report settings template identifier + * @return report settings template + * @see + */ + public ResponseObject getOrganizationReportSettingsTemplate(Long reportSettingsTemplateId) throws HttpException, HttpBadRequestException { + OrganizationReportSettingsTemplateResponseObject responseObject = this.httpClient.get(this.url + "/reports/settings-templates/" + reportSettingsTemplateId, new HttpRequestConfig(), OrganizationReportSettingsTemplateResponseObject.class); + return ResponseObject.of(responseObject.getData()); + } + + /** + * @param reportSettingsTemplateId report settings template identifier + * @param request request object + * @return report settings template + * @see + */ + public ResponseObject editOrganizationReportSettingsTemplate(Long reportSettingsTemplateId, List request) throws HttpException, HttpBadRequestException { + OrganizationReportSettingsTemplateResponseObject responseObject = this.httpClient.patch(this.url + "/reports/settings-templates/" + reportSettingsTemplateId, request, new HttpRequestConfig(), OrganizationReportSettingsTemplateResponseObject.class); + return ResponseObject.of(responseObject.getData()); + } + + /** + * @param reportSettingsTemplateId report settings template identifier + * @see + */ + public void deleteOrganizationReportSettingsTemplate(Long reportSettingsTemplateId) throws HttpException, HttpBadRequestException { + this.httpClient.delete(this.url + "/reports/settings-templates/" + reportSettingsTemplateId, new HttpRequestConfig(), Void.class); + } + /** * @param projectId project identifier * @param request request object @@ -214,7 +278,7 @@ public ResponseObject editReportSettingsTemplate(Long pr * */ public void deleteReportSettingsTemplate(Long projectId, Long reportSettingsTemplateId) throws HttpException, HttpBadRequestException { - this.httpClient.delete(this.url + "/projects/" + projectId + "/settings-templates/" + reportSettingsTemplateId, new HttpRequestConfig(), Void.class); + this.httpClient.delete(this.url + "/projects/" + projectId + "/reports/settings-templates/" + reportSettingsTemplateId, new HttpRequestConfig(), Void.class); } // -- USER REPORTS -- // diff --git a/src/main/java/com/crowdin/client/reports/model/ContributionRawDataGenerateReportRequest.java b/src/main/java/com/crowdin/client/reports/model/ContributionRawDataGenerateReportRequest.java new file mode 100644 index 000000000..16dcc9128 --- /dev/null +++ b/src/main/java/com/crowdin/client/reports/model/ContributionRawDataGenerateReportRequest.java @@ -0,0 +1,42 @@ +package com.crowdin.client.reports.model; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = true) +public class ContributionRawDataGenerateReportRequest extends GenerateReportRequest { + private String name = "contribution-raw-data"; + private Schema schema; + + @Data + public static class Schema { + private String mode; + private Unit unit; + private List columns; + private List tmIds; + private List mtIds; + private List aiPromptIds; + private Date dateFrom; + private Date dateTo; + } + + @Data + @EqualsAndHashCode(callSuper = true) + public static class GeneralSchema extends Schema { + private String languageId; + private Long userId; + private List fileIds; + private List directoryIds; + private List branchIds; + } + + @Data + @EqualsAndHashCode(callSuper = true) + public static class ByTaskSchema extends Schema { + private Long taskId; + } +} diff --git a/src/main/java/com/crowdin/client/reports/model/CostEstimationPostEditingGenerateReportRequest.java b/src/main/java/com/crowdin/client/reports/model/CostEstimationPostEditingGenerateReportRequest.java index 19e4294a3..8a8f7eb11 100644 --- a/src/main/java/com/crowdin/client/reports/model/CostEstimationPostEditingGenerateReportRequest.java +++ b/src/main/java/com/crowdin/client/reports/model/CostEstimationPostEditingGenerateReportRequest.java @@ -17,6 +17,9 @@ public static class Schema { private Unit unit; private Currency currency; private ReportsFormat format; + private BaseRatesForm baseRates; + private List individualRates; + private NetRateSchemes netRateSchemes; private Boolean calculateInternalMatches; private Boolean includePreTranslatedStrings; } @@ -24,9 +27,6 @@ public static class Schema { @Data @EqualsAndHashCode(callSuper = true) public static class GeneralSchema extends Schema { - private BaseRatesForm baseRates; - private List individualRates; - private NetRateSchemes netRateSchemes; private String languageId; private List fileIds; private List directoryIds; @@ -35,27 +35,12 @@ public static class GeneralSchema extends Schema { private Date dateTo; private List labelIds; private LabelIncludeType labelIncludeType; + private Long workflowStepId; } @Data @EqualsAndHashCode(callSuper = true) public static class ByTaskSchema extends Schema { - private BaseRatesForm baseRates; - private List individualRates; - private NetRateSchemes netRateSchemes; private Long taskId; } - - @Data - public static class IndividualRate { - private List languageIds; - private List userIds; - private float fullTranslation; - private float proofread; - } - - @Data - public static class NetRateSchemes { - private List tmMatch; - } } diff --git a/src/main/java/com/crowdin/client/reports/model/GenerateGroupReportRequest.java b/src/main/java/com/crowdin/client/reports/model/GenerateGroupReportRequest.java index 61cfca1e7..10e5ca32e 100644 --- a/src/main/java/com/crowdin/client/reports/model/GenerateGroupReportRequest.java +++ b/src/main/java/com/crowdin/client/reports/model/GenerateGroupReportRequest.java @@ -19,7 +19,7 @@ public static abstract class Schema { @Data @EqualsAndHashCode(callSuper = true) - public static class GroupTranslationCostsPerEditingSchema extends Schema { + public static class GroupTranslationCostsPostEditingSchema extends Schema { private List projectIds; private Unit unit; private Currency currency; @@ -27,73 +27,12 @@ public static class GroupTranslationCostsPerEditingSchema extends Schema { private BaseRatesForm baseRates; private List individualRates; private NetRateSchemes netRateSchemes; + private Boolean excludeApprovalsForEditedTranslations; + private Boolean preTranslatedStringsCategorizationAdjustment; private GroupingParameter groupBy; private Date dateFrom; private Date dateTo; - private List languageId; private List userIds; - private List branchIds; - private List labelIds; - private LabelIncludeType labelIncludeType; - } - - @Data - @EqualsAndHashCode(callSuper = true) - public static class GroupTranslationCostsPerEditingByTaskSchema extends Schema { - private Unit unit; - private Currency currency; - private ReportsFormat format; - private BaseRatesForm baseRates; - private List individualRates; - private NetRateSchemes netRateSchemes; - private Long taskId; - } - - @Data - @EqualsAndHashCode(callSuper = true) - public static class CostsEstimationSchema extends Schema { - private List projectIds; - private Unit unit; - private Currency currency; - private ReportsFormat format; - private BaseRatesForm baseRates; - private List individualRates; - private NetRateSchemes netRateSchemes; - private Boolean calculateInternalMatches; - private Boolean includePreTranslatedStrings; - private String languageId; - private List branchIds; - private Date dateFrom; - private Date dateTo; - private List labelIds; - private LabelIncludeType labelIncludeType; - } - - @Data - @EqualsAndHashCode(callSuper = true) - public static class CostsEstimationByTaskSchema extends Schema { - private List projectIds; - private Unit unit; - private Currency currency; - private ReportsFormat format; - private BaseRatesForm baseRates; - private List individualRates; - private NetRateSchemes netRateSchemes; - private Boolean calculateInternalMatches; - private Boolean includePreTranslatedStrings; - private Long taskId; - } - - @Data - @EqualsAndHashCode(callSuper = true) - public static class GroupTranslationCostSchema extends Schema { - private List projectIds; - private Unit unit; - private Currency currency; - private ReportsFormat format; - private GroupingParameter groupBy; - private Date dateFrom; - private Date dateTo; } @Data @@ -107,19 +46,4 @@ public static class GroupTopMembersSchema extends Schema { private Date dateFrom; private Date dateTo; } - - @Data - public static class IndividualRate { - private List languageIds; - private List userIds; - private Float fullTranslation; - private Float proofread; - } - - @Data - public static class NetRateSchemes { - private List tmMatch; - private List mtMatch; - private List suggestionMatch; - } } diff --git a/src/main/java/com/crowdin/client/reports/model/IndividualRate.java b/src/main/java/com/crowdin/client/reports/model/IndividualRate.java new file mode 100644 index 000000000..76a138403 --- /dev/null +++ b/src/main/java/com/crowdin/client/reports/model/IndividualRate.java @@ -0,0 +1,13 @@ +package com.crowdin.client.reports.model; + +import lombok.Data; + +import java.util.List; + +@Data +public class IndividualRate { + private List languageIds; + private List userIds; + private Float fullTranslation; + private Float proofread; +} diff --git a/src/main/java/com/crowdin/client/reports/model/ListOrganizationReportSettingsParams.java b/src/main/java/com/crowdin/client/reports/model/ListOrganizationReportSettingsParams.java new file mode 100644 index 000000000..ad300d0f4 --- /dev/null +++ b/src/main/java/com/crowdin/client/reports/model/ListOrganizationReportSettingsParams.java @@ -0,0 +1,13 @@ +package com.crowdin.client.reports.model; + +import com.crowdin.client.core.model.Pagination; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class ListOrganizationReportSettingsParams extends Pagination { + + private Long projectId; + private Long groupId; +} diff --git a/src/main/java/com/crowdin/client/reports/model/MatchType.java b/src/main/java/com/crowdin/client/reports/model/MatchType.java index f0cc88e6d..105b5baa0 100644 --- a/src/main/java/com/crowdin/client/reports/model/MatchType.java +++ b/src/main/java/com/crowdin/client/reports/model/MatchType.java @@ -6,7 +6,13 @@ public enum MatchType implements EnumConverter { PERFECT("perfect"), OPTION_100("100"), OPTION_99_82("99-82"), - OPTION_81_60("81-60"); + OPTION_99_95("99-95"), + OPTION_94_90("94-90"), + OPTION_89_80("89-80"), + OPTION_81_60("81-60"), + TM_MATCH("tm_match"), + APPROVAL("approval"), + NO_MATCH("no_match"); private String value; diff --git a/src/main/java/com/crowdin/client/reports/model/NetRateSchemes.java b/src/main/java/com/crowdin/client/reports/model/NetRateSchemes.java new file mode 100644 index 000000000..34bce49b9 --- /dev/null +++ b/src/main/java/com/crowdin/client/reports/model/NetRateSchemes.java @@ -0,0 +1,13 @@ +package com.crowdin.client.reports.model; + +import lombok.Data; + +import java.util.List; + +@Data +public class NetRateSchemes { + private List tmMatch; + private List mtMatch; + private List suggestionMatch; + private List aiMatch; +} diff --git a/src/main/java/com/crowdin/client/reports/model/OrganizationReportSettingsTemplateList.java b/src/main/java/com/crowdin/client/reports/model/OrganizationReportSettingsTemplateList.java new file mode 100644 index 000000000..10ac7093d --- /dev/null +++ b/src/main/java/com/crowdin/client/reports/model/OrganizationReportSettingsTemplateList.java @@ -0,0 +1,26 @@ +package com.crowdin.client.reports.model; + +import com.crowdin.client.core.model.Pagination; +import com.crowdin.client.core.model.ResponseList; +import com.crowdin.client.core.model.ResponseObject; +import lombok.Data; + +import java.util.List; +import java.util.stream.Collectors; + +@Data +public class OrganizationReportSettingsTemplateList { + + private List data; + private Pagination pagination; + + public static ResponseList to(OrganizationReportSettingsTemplateList reportSettingsTemplateList) { + return ResponseList.of( + reportSettingsTemplateList.getData().stream() + .map(OrganizationReportSettingsTemplateResponseObject::getData) + .map(ResponseObject::of) + .collect(Collectors.toList()), + reportSettingsTemplateList.getPagination() + ); + } +} diff --git a/src/main/java/com/crowdin/client/reports/model/OrganizationReportSettingsTemplateResponseObject.java b/src/main/java/com/crowdin/client/reports/model/OrganizationReportSettingsTemplateResponseObject.java new file mode 100644 index 000000000..4ed3008d5 --- /dev/null +++ b/src/main/java/com/crowdin/client/reports/model/OrganizationReportSettingsTemplateResponseObject.java @@ -0,0 +1,9 @@ +package com.crowdin.client.reports.model; + +import lombok.Data; + +@Data +public class OrganizationReportSettingsTemplateResponseObject { + + private ReportSettingsTemplate.OrganizationReportSettingsTemplate data; +} diff --git a/src/main/java/com/crowdin/client/reports/model/PreTranslateAccuracyGenerateReportRequest.java b/src/main/java/com/crowdin/client/reports/model/PreTranslateAccuracyGenerateReportRequest.java index eddea95dc..5dd101a59 100644 --- a/src/main/java/com/crowdin/client/reports/model/PreTranslateAccuracyGenerateReportRequest.java +++ b/src/main/java/com/crowdin/client/reports/model/PreTranslateAccuracyGenerateReportRequest.java @@ -9,7 +9,8 @@ @Data @EqualsAndHashCode(callSuper = true) public class PreTranslateAccuracyGenerateReportRequest extends GenerateReportRequest { - private String name = "pre-translate-accuracy"; + //'pre-translate-efficiency' | 'pre-translate-accuracy' + private String name; private Schema schema; @Data diff --git a/src/main/java/com/crowdin/client/reports/model/PreTranslateEfficiencyGenerateReportRequest.java b/src/main/java/com/crowdin/client/reports/model/PreTranslateEfficiencyGenerateReportRequest.java deleted file mode 100644 index 41835d5e2..000000000 --- a/src/main/java/com/crowdin/client/reports/model/PreTranslateEfficiencyGenerateReportRequest.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.crowdin.client.reports.model; - -/** - * @deprecated Use {@link PreTranslateAccuracyGenerateReportRequest} instead - */ -@Deprecated -public class PreTranslateEfficiencyGenerateReportRequest extends PreTranslateAccuracyGenerateReportRequest { - public PreTranslateEfficiencyGenerateReportRequest() { - super(); - this.setName("pre-translate-efficiency"); - } -} diff --git a/src/main/java/com/crowdin/client/reports/model/ReportSettingsTemplate.java b/src/main/java/com/crowdin/client/reports/model/ReportSettingsTemplate.java index 1a8765a67..8a6b3986f 100644 --- a/src/main/java/com/crowdin/client/reports/model/ReportSettingsTemplate.java +++ b/src/main/java/com/crowdin/client/reports/model/ReportSettingsTemplate.java @@ -2,6 +2,7 @@ import com.crowdin.client.core.model.EnumConverter; import lombok.Data; +import lombok.EqualsAndHashCode; import java.util.Date; import java.util.List; @@ -18,6 +19,15 @@ public class ReportSettingsTemplate { private Date createdAt; private Date updatedAt; private Boolean isPublic; + private Boolean isGlobal; + + @EqualsAndHashCode(callSuper = true) + @Data + public static class OrganizationReportSettingsTemplate extends ReportSettingsTemplate { + + private Long projectId; + private Long groupId; + } @Data public static class Config { @@ -31,13 +41,6 @@ public static class RegularRate { private double value; } - @Data - public static class IndividualRate { - private List languageIds; - private List userIds; - private List rates; - } - public enum Mode implements EnumConverter { NO_MATCH, TM_MATCH; diff --git a/src/main/java/com/crowdin/client/reports/model/TopMembersGenerateReportRequest.java b/src/main/java/com/crowdin/client/reports/model/TopMembersGenerateReportRequest.java index 3c833bf4c..bc42fd7f6 100644 --- a/src/main/java/com/crowdin/client/reports/model/TopMembersGenerateReportRequest.java +++ b/src/main/java/com/crowdin/client/reports/model/TopMembersGenerateReportRequest.java @@ -3,11 +3,13 @@ import lombok.Data; import lombok.EqualsAndHashCode; +import java.util.Date; + @Data @EqualsAndHashCode(callSuper = true) public class TopMembersGenerateReportRequest extends GenerateReportRequest { - private String name; + private String name = "top-members"; private Schema schema; @Data @@ -15,6 +17,8 @@ public static class Schema { private Unit unit; private String languageId; private ReportsFormat format; + private Date dateFrom; + private Date dateTo; } } diff --git a/src/main/java/com/crowdin/client/reports/model/TranslateAccuracyGenerateReportRequest.java b/src/main/java/com/crowdin/client/reports/model/TranslateAccuracyGenerateReportRequest.java new file mode 100644 index 000000000..dfcf308b9 --- /dev/null +++ b/src/main/java/com/crowdin/client/reports/model/TranslateAccuracyGenerateReportRequest.java @@ -0,0 +1,26 @@ +package com.crowdin.client.reports.model; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = true) +public class TranslateAccuracyGenerateReportRequest extends GenerateReportRequest { + private String name = "translator-accuracy"; + private Schema schema; + + @Data + public static class Schema { + private Unit unit; + private ReportsFormat format; + private List postEditingCategories; + private String languageId; + private List userIds; + private Date dateFrom; + private Date dateTo; + } + +} diff --git a/src/main/java/com/crowdin/client/reports/model/TranslationCostsPostEndingGenerateReportRequest.java b/src/main/java/com/crowdin/client/reports/model/TranslationCostsPostEndingGenerateReportRequest.java new file mode 100644 index 000000000..42ae7ab64 --- /dev/null +++ b/src/main/java/com/crowdin/client/reports/model/TranslationCostsPostEndingGenerateReportRequest.java @@ -0,0 +1,48 @@ +package com.crowdin.client.reports.model; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = true) +public class TranslationCostsPostEndingGenerateReportRequest extends GenerateReportRequest { + private String name = "translation-costs-pe"; + private Schema schema; + + @Data + public static class Schema { + private Unit unit; + private Currency currency; + private ReportsFormat format; + private BaseRatesForm baseRates; + private List individualRates; + private NetRateSchemes netRateSchemes; + private Boolean excludeApprovalsForEditedTranslations; + private Boolean preTranslatedStringsCategorizationAdjustment; + } + + @Data + @EqualsAndHashCode(callSuper = true) + public static class GeneralSchema extends Schema { + private String groupBy; + private Date dateFrom; + private Date dateTo; + private String languageId; + private List userIds; + private List fileIds; + private List directoryIds; + private List branchIds; + private List labelIds; + private LabelIncludeType labelIncludeType; + private Long workflowStepId; + } + + @Data + @EqualsAndHashCode(callSuper = true) + public static class ByTaskSchema extends Schema { + private Long taskId; + } +} diff --git a/src/test/java/com/crowdin/client/framework/TestHttpClient.java b/src/test/java/com/crowdin/client/framework/TestHttpClient.java index 88eef67b2..84a774ab2 100644 --- a/src/test/java/com/crowdin/client/framework/TestHttpClient.java +++ b/src/test/java/com/crowdin/client/framework/TestHttpClient.java @@ -2,7 +2,6 @@ import com.crowdin.client.core.http.HttpClient; import com.crowdin.client.core.http.HttpRequestConfig; -import com.crowdin.client.core.http.JsonTransformer; import com.crowdin.client.core.http.exceptions.HttpBadRequestException; import com.crowdin.client.core.http.exceptions.HttpException; import com.crowdin.client.core.http.impl.json.JacksonJsonTransformer; @@ -25,8 +24,8 @@ public class TestHttpClient implements HttpClient { private Map> requestMocks = new HashMap<>(); - private JsonTransformer jsonTransformer = new JacksonJsonTransformer(); - private ObjectMapper objectMapper = new ObjectMapper(); + private JacksonJsonTransformer jsonTransformer = new JacksonJsonTransformer(); + private ObjectMapper objectMapper = jsonTransformer.getObjectMapper(); public void initializeMocks(List requestMocks) { this.requestMocks = requestMocks.stream().collect( diff --git a/src/test/java/com/crowdin/client/reports/GroupReportsApiTest.java b/src/test/java/com/crowdin/client/reports/GroupReportsApiTest.java index 31f5918df..08065b3b7 100644 --- a/src/test/java/com/crowdin/client/reports/GroupReportsApiTest.java +++ b/src/test/java/com/crowdin/client/reports/GroupReportsApiTest.java @@ -1,24 +1,16 @@ package com.crowdin.client.reports; +import com.crowdin.client.core.http.impl.json.DateDeserializer; import com.crowdin.client.core.model.DownloadLink; import com.crowdin.client.core.model.ResponseObject; import com.crowdin.client.framework.RequestMock; import com.crowdin.client.framework.TestClient; -import com.crowdin.client.reports.model.BaseRatesForm; -import com.crowdin.client.reports.model.Currency; -import com.crowdin.client.reports.model.GenerateGroupReportRequest; -import com.crowdin.client.reports.model.GroupReportStatus; -import com.crowdin.client.reports.model.GroupingParameter; -import com.crowdin.client.reports.model.Match; -import com.crowdin.client.reports.model.MatchType; -import com.crowdin.client.reports.model.ReportsFormat; -import com.crowdin.client.reports.model.Unit; +import com.crowdin.client.reports.model.*; import lombok.SneakyThrows; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.junit.jupiter.api.Test; -import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -29,7 +21,6 @@ public class GroupReportsApiTest extends TestClient { private final Long groupId = 1L; private final String reportId = "50fb3506-4127-4ba8-8296-f97dc7e3e0c3"; - private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX"); @Override public List getMocks() { @@ -48,7 +39,7 @@ public void generateGroupReport_TranslationCostsPostEditing() { GenerateGroupReportRequest request = new GenerateGroupReportRequest(); request.setName("group-translation-costs-pe"); request.setSchema( - new GenerateGroupReportRequest.GroupTranslationCostsPerEditingSchema(){{ + new GenerateGroupReportRequest.GroupTranslationCostsPostEditingSchema(){{ setProjectIds(Arrays.asList(1L, 2L, 3L)); setUnit(Unit.WORDS); setCurrency(Currency.USD); @@ -57,13 +48,13 @@ public void generateGroupReport_TranslationCostsPostEditing() { setFullTranslation(0.1f); setProofread(0.12f); }}); - setIndividualRates(Collections.singletonList(new GenerateGroupReportRequest.IndividualRate() {{ + setIndividualRates(Collections.singletonList(new IndividualRate() {{ setLanguageIds(Collections.singletonList("uk")); setUserIds(Collections.singletonList(1L)); setFullTranslation(0.1f); setProofread(0.12f); }})); - setNetRateSchemes(new GenerateGroupReportRequest.NetRateSchemes() {{ + setNetRateSchemes(new NetRateSchemes() {{ setTmMatch(Collections.singletonList(new Match() {{ setMatchType(MatchType.PERFECT); setPrice(0.1f); @@ -140,10 +131,10 @@ private void assertGroupReportStatus(GroupReportStatus reportStatus) { assertEquals("costs-estimation", attributes.getReportName()); assertEquals(Collections.singletonList(0L), attributes.getProjectIds()); - assertEquals(dateFormat.parse("2019-09-23T11:26:54+00:00"), reportStatus.getCreatedAt()); - assertEquals(dateFormat.parse("2019-09-23T11:26:54+00:00"), reportStatus.getUpdatedAt()); - assertEquals(dateFormat.parse("2019-09-23T11:26:54+00:00"), reportStatus.getStartedAt()); - assertEquals(dateFormat.parse("2019-09-23T11:26:54+00:00"), reportStatus.getFinishedAt()); + assertEquals(DateDeserializer.deserializeDate("2019-09-23T11:26:54+00:00"), reportStatus.getCreatedAt()); + assertEquals(DateDeserializer.deserializeDate("2019-09-23T11:26:54+00:00"), reportStatus.getUpdatedAt()); + assertEquals(DateDeserializer.deserializeDate("2019-09-23T11:26:54+00:00"), reportStatus.getStartedAt()); + assertEquals(DateDeserializer.deserializeDate("2019-09-23T11:26:54+00:00"), reportStatus.getFinishedAt()); } private void assertDownloadLink(DownloadLink downloadLink) { diff --git a/src/test/java/com/crowdin/client/reports/ReportsApiTest.java b/src/test/java/com/crowdin/client/reports/ReportsApiTest.java index f749e89ae..b44671e63 100644 --- a/src/test/java/com/crowdin/client/reports/ReportsApiTest.java +++ b/src/test/java/com/crowdin/client/reports/ReportsApiTest.java @@ -62,11 +62,16 @@ public List getMocks() { RequestMock.build(this.url + "/projects/" + projectId + "/reports", HttpPost.METHOD_NAME, "api/reports/generatePreTranslateAccuracyReport.json", "api/reports/preTranslateAccuracyReportStatus.json"), RequestMock.build(this.url + "/projects/" + projectId + "/reports/" + id, HttpGet.METHOD_NAME, "api/reports/reportGenerationStatus.json"), RequestMock.build(this.url + "/projects/" + projectId + "/reports/" + id + "/download", HttpGet.METHOD_NAME, "api/reports/downloadLink.json"), + RequestMock.build(this.url + "/reports/settings-templates", HttpGet.METHOD_NAME, "api/reports/listOrganizationReportSettingsTemplate.json"), + RequestMock.build(this.url + "/reports/settings-templates", HttpPost.METHOD_NAME, "api/reports/addReportSettingsTemplate.json", "api/reports/organizationReportSettingsTemplate.json"), + RequestMock.build(this.url + "/reports/settings-templates/" + reportSettingsTemplateId, HttpGet.METHOD_NAME, "api/reports/organizationReportSettingsTemplate.json"), + RequestMock.build(this.url + "/reports/settings-templates/" + reportSettingsTemplateId, HttpPatch.METHOD_NAME, "api/reports/editReportSettingsTemplate.json", "api/reports/organizationReportSettingsTemplate.json"), + RequestMock.build(this.url + "/reports/settings-templates/" + reportSettingsTemplateId, HttpDelete.METHOD_NAME), RequestMock.build(this.url + "/projects/" + projectId + "/reports/settings-templates", HttpGet.METHOD_NAME, "api/reports/listReportSettingsTemplate.json"), RequestMock.build(this.url + "/projects/" + projectId + "/reports/settings-templates", HttpPost.METHOD_NAME, "api/reports/addReportSettingsTemplate.json", "api/reports/reportSettingsTemplate.json"), RequestMock.build(this.url + "/projects/" + projectId + "/reports/settings-templates/" + reportSettingsTemplateId, HttpGet.METHOD_NAME, "api/reports/reportSettingsTemplate.json"), RequestMock.build(this.url + "/projects/" + projectId + "/reports/settings-templates/" + reportSettingsTemplateId, HttpPatch.METHOD_NAME, "api/reports/editReportSettingsTemplate.json", "api/reports/reportSettingsTemplate.json"), - RequestMock.build(this.url + "/projects/" + projectId + "/settings-templates/" + reportSettingsTemplateId, HttpDelete.METHOD_NAME), + RequestMock.build(this.url + "/projects/" + projectId + "/reports/settings-templates/" + reportSettingsTemplateId, HttpDelete.METHOD_NAME), RequestMock.build(this.url + "/users/" + userId + "/reports/archives/", HttpGet.METHOD_NAME, "api/reports/listReportArchives.json"), RequestMock.build(this.url + "/users/" + userId + "/reports/archives/" + archiveId, HttpGet.METHOD_NAME, "api/reports/reportArchive.json"), RequestMock.build(this.url + "/users/" + userId + "/reports/archives/" + archiveId, HttpDelete.METHOD_NAME), @@ -89,13 +94,12 @@ private ReportSettingsTemplate createSettingsTemplate() { innerRate.setMode(ReportSettingsTemplate.Mode.TM_MATCH); innerRate.setValue(0.1); - ReportSettingsTemplate.IndividualRate individual = new ReportSettingsTemplate.IndividualRate(); + IndividualRate individual = new IndividualRate(); individual.setLanguageIds(Collections.singletonList("uk")); - individual.setUserIds(Collections.singletonList(20)); - individual.setRates(Collections.singletonList(innerRate)); + individual.setUserIds(Collections.singletonList(20L)); List regularRates = Collections.singletonList(regular); - List individualRates = Collections.singletonList(individual); + List individualRates = Collections.singletonList(individual); ReportSettingsTemplate.Config config = new ReportSettingsTemplate.Config(); config.setRegularRates(regularRates); @@ -111,6 +115,36 @@ private ReportSettingsTemplate createSettingsTemplate() { return template; } + private ReportSettingsTemplate.OrganizationReportSettingsTemplate createOrganizationSettingsTemplate() { + ReportSettingsTemplate.RegularRate regular = new ReportSettingsTemplate.RegularRate(); + regular.setMode(ReportSettingsTemplate.Mode.NO_MATCH); + regular.setValue(0.1); + + ReportSettingsTemplate.RegularRate innerRate = new ReportSettingsTemplate.RegularRate(); + innerRate.setMode(ReportSettingsTemplate.Mode.TM_MATCH); + innerRate.setValue(0.1); + + IndividualRate individual = new IndividualRate(); + individual.setLanguageIds(Collections.singletonList("uk")); + individual.setUserIds(Collections.singletonList(20L)); + + List regularRates = Collections.singletonList(regular); + List individualRates = Collections.singletonList(individual); + + ReportSettingsTemplate.Config config = new ReportSettingsTemplate.Config(); + config.setRegularRates(regularRates); + config.setIndividualRates(individualRates); + + ReportSettingsTemplate.OrganizationReportSettingsTemplate template = new ReportSettingsTemplate.OrganizationReportSettingsTemplate(); + template.setName(name); + template.setCurrency(Currency.USD); + template.setUnit(Unit.STRINGS); + template.setConfig(config); + template.setIsPublic(false); + + return template; + } + private Date getDate(int year, int month, int date, int hour, int minute, int second) { calendar.set(year, month, date, hour, minute, second); calendar.set(Calendar.MILLISECOND, 0); @@ -130,11 +164,11 @@ public void generateReportTest() { BaseRatesForm baseRates = new BaseRatesForm(); baseRates.setFullTranslation(fullTranslationRate); baseRates.setProofread(proofreadRate); - CostEstimationPostEditingGenerateReportRequest.IndividualRate individualRate = new CostEstimationPostEditingGenerateReportRequest.IndividualRate(); + IndividualRate individualRate = new IndividualRate(); individualRate.setLanguageIds(singletonList(engLanguageId)); individualRate.setFullTranslation(fullTranslationRate); individualRate.setProofread(proofreadRate); - CostEstimationPostEditingGenerateReportRequest.NetRateSchemes netRateSchemes = new CostEstimationPostEditingGenerateReportRequest.NetRateSchemes(); + NetRateSchemes netRateSchemes = new NetRateSchemes(); Match match = new Match(); match.setMatchType(MatchType.PERFECT); match.setPrice(fullTranslationRate); @@ -166,6 +200,7 @@ public void testGeneratePreTranslateAccuracyReport() { schema.setPostEditingCategories(singletonList(postEditingCategory)); schema.setLanguageId(languageId); request.setSchema(schema); + request.setName("pre-translate-accuracy"); ResponseObject response = this.getReportsApi().generateReport(projectId, request); ReportStatus reportStatus = response.getData(); @@ -189,6 +224,48 @@ public void downloadReportTest() { assertEquals(downloadLinkResponseObject.getData().getUrl(), link); } + @Test + public void listOrganizationReportSettingsTemplateTest() { + ResponseList reportSettingsTemplateResponseList = this.getReportsApi().listOrganizationReportSettingsTemplates(new ListOrganizationReportSettingsParams()); + assertEquals(reportSettingsTemplateResponseList.getData().size(), 1); + assertEquals(reportSettingsTemplateResponseList.getData().get(0).getData().getId(), reportSettingsTemplateId); + assertEquals(reportSettingsTemplateResponseList.getData().get(0).getData().getName(), name); + } + + @Test + public void addOrganizationReportSettingsTemplateTest() { + ReportSettingsTemplate.OrganizationReportSettingsTemplate request = createOrganizationSettingsTemplate(); + ResponseObject reportSettingsTemplateResponseObject = this.getReportsApi().addOrganizationReportSettingsTemplate(request); + ReportSettingsTemplate response = reportSettingsTemplateResponseObject.getData(); + assertEquals(request.getName(), response.getName()); + assertEquals(request.getCurrency(), response.getCurrency()); + assertEquals(request.getUnit(), response.getUnit()); + assertEquals(request.getConfig(), response.getConfig()); + } + + @Test + public void getOrganizationReportSettingsTemplateTest() { + ResponseObject responseObject = this.getReportsApi().getOrganizationReportSettingsTemplate(reportSettingsTemplateId); + assertEquals(responseObject.getData().getId(), reportSettingsTemplateId); + assertEquals(responseObject.getData().getName(), name); + } + + @Test + public void editOrganizationReportSettingsTemplateTest() { + PatchRequest request = new PatchRequest(); + request.setOp(PatchOperation.REPLACE); + request.setValue(name); + request.setPath("name"); + ResponseObject responseObject = this.getReportsApi().editOrganizationReportSettingsTemplate(reportSettingsTemplateId, singletonList(request)); + assertEquals(responseObject.getData().getId(), reportSettingsTemplateId); + assertEquals(responseObject.getData().getName(), name); + } + + @Test + public void deleteOrganizationReportSettingsTemplateTest() { + this.getReportsApi().deleteOrganizationReportSettingsTemplate(reportSettingsTemplateId); + } + @Test public void listReportSettingsTemplateTest() { ResponseList reportSettingsTemplateResponseList = this.getReportsApi().listReportSettingsTemplate(projectId, null, null); diff --git a/src/test/resources/api/reports/addReportSettingsTemplate.json b/src/test/resources/api/reports/addReportSettingsTemplate.json index 431fc7b5f..160d1d0c3 100644 --- a/src/test/resources/api/reports/addReportSettingsTemplate.json +++ b/src/test/resources/api/reports/addReportSettingsTemplate.json @@ -16,12 +16,6 @@ ], "userIds": [ 20 - ], - "rates": [ - { - "mode": "tm_match", - "value": 0.1 - } ] } ] diff --git a/src/test/resources/api/reports/addUserReportSettingsTemplate.json b/src/test/resources/api/reports/addUserReportSettingsTemplate.json index 5e0fde7bc..19dfbdbf2 100644 --- a/src/test/resources/api/reports/addUserReportSettingsTemplate.json +++ b/src/test/resources/api/reports/addUserReportSettingsTemplate.json @@ -16,12 +16,6 @@ ], "userIds": [ 20 - ], - "rates": [ - { - "mode": "tm_match", - "value": 0.1 - } ] } ] diff --git a/src/test/resources/api/reports/listOrganizationReportSettingsTemplate.json b/src/test/resources/api/reports/listOrganizationReportSettingsTemplate.json new file mode 100644 index 000000000..30ab455e0 --- /dev/null +++ b/src/test/resources/api/reports/listOrganizationReportSettingsTemplate.json @@ -0,0 +1,43 @@ +{ + "data": [ + { + "data": { + "id": 2, + "name": "my report template", + "currency": "USD", + "unit": "words", + "mode": "simple", + "config": { + "regularRates": [ + { + "mode": "tm_match", + "value": 0.1 + } + ], + "individualRates": [ + { + "languageIds": [ + "uk" + ], + "userIds": [ + 1 + ], + "rates": [ + { + "mode": "tm_match", + "value": 0.1 + } + ] + } + ] + }, + "createdAt": "2019-09-23T11:26:54+00:00", + "updatedAt": "2019-09-23T11:26:54+00:00" + } + } + ], + "pagination": { + "offset": 0, + "limit": 25 + } +} \ No newline at end of file diff --git a/src/test/resources/api/reports/organizationReportSettingsTemplate.json b/src/test/resources/api/reports/organizationReportSettingsTemplate.json new file mode 100644 index 000000000..72adf4465 --- /dev/null +++ b/src/test/resources/api/reports/organizationReportSettingsTemplate.json @@ -0,0 +1,36 @@ +{ + "data": { + "id": 2, + "name": "my report template", + "currency": "USD", + "unit": "strings", + "mode": "simple", + "config": { + "regularRates": [ + { + "mode": "no_match", + "value": 0.1 + } + ], + "individualRates": [ + { + "languageIds": [ + "uk" + ], + "userIds": [ + 20 + ], + "rates": [ + { + "mode": "tm_match", + "value": 0.1 + } + ] + } + ] + }, + "createdAt": "2022-10-15T11:57:57+00:00", + "updatedAt": "2022-10-17T11:57:57+00:00", + "isPublic": false + } +} \ No newline at end of file