Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions src/main/java/com/crowdin/client/Client.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.crowdin.client;

import com.crowdin.client.advisors.AdvisorsApi;
import com.crowdin.client.ai.AIApi;
import com.crowdin.client.applications.ApplicationsApi;
import com.crowdin.client.branches.BranchesApi;
Expand All @@ -17,6 +18,8 @@
import com.crowdin.client.languages.LanguagesApi;
import com.crowdin.client.machinetranslationengines.MachineTranslationEnginesApi;
import com.crowdin.client.notifications.NotificationsApi;
import com.crowdin.client.organization.OrganizationApi;
import com.crowdin.client.placeholders.PlaceholdersApi;
import com.crowdin.client.projectsgroups.ProjectsGroupsApi;
import com.crowdin.client.reports.ReportsApi;
import com.crowdin.client.screenshots.ScreenshotsApi;
Expand Down Expand Up @@ -78,6 +81,9 @@ public class Client extends CrowdinApi {
private final AIApi aiApi;
private final StringCorrectionsApi stringCorrectionsApi;
private final StyleGuidesApi styleGuidesApi;
private final AdvisorsApi advisorsApi;
private final PlaceholdersApi placeholdersApi;
private final OrganizationApi organizationApi;

public Client(Credentials credentials) {
super(credentials);
Expand Down Expand Up @@ -116,6 +122,9 @@ public Client(Credentials credentials) {
this.aiApi = new AIApi(credentials);
this.stringCorrectionsApi = new StringCorrectionsApi(credentials);
this.styleGuidesApi = new StyleGuidesApi(credentials);
this.advisorsApi = new AdvisorsApi(credentials);
this.placeholdersApi = new PlaceholdersApi(credentials);
this.organizationApi = new OrganizationApi(credentials);
}

public Client(Credentials credentials, ClientConfig clientConfig) {
Expand Down Expand Up @@ -155,6 +164,9 @@ public Client(Credentials credentials, ClientConfig clientConfig) {
this.aiApi = new AIApi(credentials, clientConfig);
this.stringCorrectionsApi = new StringCorrectionsApi(credentials, clientConfig);
this.styleGuidesApi = new StyleGuidesApi(credentials, clientConfig);
this.advisorsApi = new AdvisorsApi(credentials, clientConfig);
this.placeholdersApi = new PlaceholdersApi(credentials, clientConfig);
this.organizationApi = new OrganizationApi(credentials, clientConfig);
}

}
124 changes: 124 additions & 0 deletions src/main/java/com/crowdin/client/advisors/AdvisorsApi.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
package com.crowdin.client.advisors;

import com.crowdin.client.advisors.model.AdvisorCheck;
import com.crowdin.client.advisors.model.AdvisorCheckResponseObject;
import com.crowdin.client.advisors.model.AdvisorInsight;
import com.crowdin.client.advisors.model.AdvisorInsightResponseList;
import com.crowdin.client.advisors.model.AdvisorInsightResponseObject;
import com.crowdin.client.advisors.model.ListAdvisorInsightsParams;
import com.crowdin.client.advisors.model.RunAdvisorCheckRequest;
import com.crowdin.client.advisors.model.UpsertAdvisorInsightRequest;
import com.crowdin.client.core.CrowdinApi;
import com.crowdin.client.core.http.HttpRequestConfig;
import com.crowdin.client.core.http.exceptions.HttpBadRequestException;
import com.crowdin.client.core.http.exceptions.HttpException;
import com.crowdin.client.core.model.ClientConfig;
import com.crowdin.client.core.model.Credentials;
import com.crowdin.client.core.model.PatchRequest;
import com.crowdin.client.core.model.ResponseList;
import com.crowdin.client.core.model.ResponseObject;

import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

public class AdvisorsApi extends CrowdinApi {
public AdvisorsApi(Credentials credentials) {
super(credentials);
}

public AdvisorsApi(Credentials credentials, ClientConfig clientConfig) {
super(credentials, clientConfig);
}

/**
* @param projectId project identifier
* @param request request object
* @return advisor check job descriptor
* @see <ul>
* <li><a href="https://developer.crowdin.com/api/v2/#operation/api.projects.advisors.checks.post" target="_blank"><b>API Documentation</b></a></li>
* <li><a href="https://developer.crowdin.com/enterprise/api/v2/#operation/api.projects.advisors.checks.post" target="_blank"><b>Enterprise API Documentation</b></a></li>
* </ul>
*/
public ResponseObject<AdvisorCheck> runAdvisorCheck(Long projectId, RunAdvisorCheckRequest request) throws HttpException, HttpBadRequestException {
AdvisorCheckResponseObject advisorCheckResponseObject = this.httpClient.post(this.url + "/projects/" + projectId + "/advisors/checks", request, new HttpRequestConfig(), AdvisorCheckResponseObject.class);
return ResponseObject.of(advisorCheckResponseObject.getData());
}

/**
* @param projectId project identifier
* @param checkId advisor check identifier
* @return advisor check job descriptor
* @see <ul>
* <li><a href="https://developer.crowdin.com/api/v2/#operation/api.projects.advisors.checks.get" target="_blank"><b>API Documentation</b></a></li>
* <li><a href="https://developer.crowdin.com/enterprise/api/v2/#operation/api.projects.advisors.checks.get" target="_blank"><b>Enterprise API Documentation</b></a></li>
* </ul>
*/
public ResponseObject<AdvisorCheck> getAdvisorCheck(Long projectId, String checkId) throws HttpException, HttpBadRequestException {
AdvisorCheckResponseObject advisorCheckResponseObject = this.httpClient.get(this.url + "/projects/" + projectId + "/advisors/checks/" + checkId, new HttpRequestConfig(), AdvisorCheckResponseObject.class);
return ResponseObject.of(advisorCheckResponseObject.getData());
}

/**
* @param projectId project identifier
* @param params query params
* @return list of advisor insights; the pagination is an {@link com.crowdin.client.advisors.model.AdvisorInsightPagination} which also carries the total count
* @see <ul>
* <li><a href="https://developer.crowdin.com/api/v2/#operation/api.projects.advisors.insights.getMany" target="_blank"><b>API Documentation</b></a></li>
* <li><a href="https://developer.crowdin.com/enterprise/api/v2/#operation/api.projects.advisors.insights.getMany" target="_blank"><b>Enterprise API Documentation</b></a></li>
* </ul>
*/
public ResponseList<AdvisorInsight> listAdvisorInsights(Long projectId, ListAdvisorInsightsParams params) throws HttpException, HttpBadRequestException {
ListAdvisorInsightsParams query = Optional.ofNullable(params).orElse(new ListAdvisorInsightsParams());
Map<String, Optional<Object>> queryParams = HttpRequestConfig.buildUrlParams(
"limit", Optional.ofNullable(query.getLimit()),
"offset", Optional.ofNullable(query.getOffset()),
"isDismissed", Optional.ofNullable(query.getIsDismissed()),
"status", Optional.ofNullable(
query.getStatus() == null ? null : query.getStatus().stream()
.map(status -> status.to(status))
.collect(Collectors.joining(","))
),
"outcome", Optional.ofNullable(
query.getOutcome() == null ? null : query.getOutcome().stream()
.map(outcome -> outcome.to(outcome))
.collect(Collectors.joining(","))
)
);
AdvisorInsightResponseList advisorInsightResponseList = this.httpClient.get(this.url + "/projects/" + projectId + "/advisors/insights", new HttpRequestConfig(queryParams), AdvisorInsightResponseList.class);
return AdvisorInsightResponseList.to(advisorInsightResponseList);
}

/**
* @param projectId project identifier
* @param insightId insight identifier
* @param request request object (only the {@code /isDismissed} path is supported)
* @return updated advisor insight
* @see <ul>
* <li><a href="https://developer.crowdin.com/api/v2/#operation/api.projects.advisors.insights.patch" target="_blank"><b>API Documentation</b></a></li>
* <li><a href="https://developer.crowdin.com/enterprise/api/v2/#operation/api.projects.advisors.insights.patch" target="_blank"><b>Enterprise API Documentation</b></a></li>
* </ul>
*/
public ResponseObject<AdvisorInsight> editAdvisorInsight(Long projectId, Long insightId, List<PatchRequest> request) throws HttpException, HttpBadRequestException {
AdvisorInsightResponseObject advisorInsightResponseObject = this.httpClient.patch(this.url + "/projects/" + projectId + "/advisors/insights/" + insightId, request, new HttpRequestConfig(), AdvisorInsightResponseObject.class);
return ResponseObject.of(advisorInsightResponseObject.getData());
}

/**
* Publishes the result of an application's {@code advisor-inspector} module check.
* Subsequent calls for the same module overwrite the previous insight.
*
* @param projectId project identifier
* @param applicationIdentifier application identifier
* @param moduleKey application module key
* @param request request object
* @see <ul>
* <li><a href="https://developer.crowdin.com/api/v2/#operation/api.projects.applications.modules.advisors.insights.put" target="_blank"><b>API Documentation</b></a></li>
* <li><a href="https://developer.crowdin.com/enterprise/api/v2/#operation/api.projects.applications.modules.advisors.insights.put" target="_blank"><b>Enterprise API Documentation</b></a></li>
* </ul>
*/
public void upsertApplicationAdvisorInsight(Long projectId, String applicationIdentifier, String moduleKey, UpsertAdvisorInsightRequest request) throws HttpException, HttpBadRequestException {
this.httpClient.put(this.url + "/projects/" + projectId + "/applications/" + applicationIdentifier + "/modules/" + moduleKey + "/advisors/insights", request, new HttpRequestConfig(), Void.class);
}
}
21 changes: 21 additions & 0 deletions src/main/java/com/crowdin/client/advisors/model/AdvisorAiMode.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.crowdin.client.advisors.model;

import com.crowdin.client.core.model.EnumConverter;

public enum AdvisorAiMode implements EnumConverter<AdvisorAiMode> {
AUTO, ALL;

public static AdvisorAiMode from(String value) {
for (AdvisorAiMode v : AdvisorAiMode.values()) {
if (v.name().equalsIgnoreCase(value)) {
return v;
}
}
return null;
}

@Override
public String to(AdvisorAiMode value) {
return value.name().toLowerCase();
}
}
13 changes: 13 additions & 0 deletions src/main/java/com/crowdin/client/advisors/model/AdvisorAiRun.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.crowdin.client.advisors.model;

import lombok.Data;

import java.util.Date;

@Data
public class AdvisorAiRun {

private AdvisorAiMode mode;
private Long promptId;
private Date at;
}
21 changes: 21 additions & 0 deletions src/main/java/com/crowdin/client/advisors/model/AdvisorCheck.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.crowdin.client.advisors.model;

import lombok.Data;

import java.util.Date;

@Data
public class AdvisorCheck {

private String identifier;
/**
* Status of the underlying job (e.g. created, in_progress, done, failed)
*/
private String status;
private Integer progress;
private AdvisorCheckAttributes attributes;
private Date createdAt;
private Date updatedAt;
private Date startedAt;
private Date finishedAt;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.crowdin.client.advisors.model;

import lombok.Data;

import java.util.List;

@Data
public class AdvisorCheckAttributes {

private String category;
private List<AdvisorCheckInspector> inspectors;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.crowdin.client.advisors.model;

import lombok.Data;

@Data
public class AdvisorCheckInspector {

private String key;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.crowdin.client.advisors.model;

import lombok.Data;

@Data
public class AdvisorCheckResponseObject {

private AdvisorCheck data;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.crowdin.client.advisors.model;

import com.crowdin.client.core.http.impl.json.EmptyArrayToNullDeserializer;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import lombok.Data;

import java.util.Date;
import java.util.List;
import java.util.Map;

@Data
public class AdvisorInsight {

private Long id;
private String inspectorKey;
private String category;
private Boolean isDismissed;
private AdvisorInsightStatus status;
private AdvisorInsightOutcome outcome;
private AdvisorInsightSeverity severity;
private AdvisorRefreshPolicy refreshPolicy;
private List<AdvisorInsightMetric> metrics;
private List<AdvisorInsightRecommendation> recommendations;
private Date checkedAt;
private AdvisorAiRun lastAiRun;
@JsonDeserialize(using = EmptyArrayToNullDeserializer.class)
private Map<String, Object> payload;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.crowdin.client.advisors.model;

import lombok.Data;

import java.util.Date;

@Data
public class AdvisorInsightMetric {

private String key;
private Double value;
private AdvisorMetricUnit unit;
private Double threshold;
private AdvisorMetricTone tone;
private AdvisorMetricSource source;
private Date checkedAt;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.crowdin.client.advisors.model;

import com.crowdin.client.core.model.EnumConverter;

public enum AdvisorInsightOutcome implements EnumConverter<AdvisorInsightOutcome> {
FLAGGED, CLEAR, NOT_APPLICABLE;

public static AdvisorInsightOutcome from(String value) {
for (AdvisorInsightOutcome v : AdvisorInsightOutcome.values()) {
if (v.name().equalsIgnoreCase(value)) {
return v;
}
}
return null;
}

@Override
public String to(AdvisorInsightOutcome value) {
return value.name().toLowerCase();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.crowdin.client.advisors.model;

import com.crowdin.client.core.model.Pagination;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;

/**
* Pagination returned by List Advisor Insights, which additionally carries the {@link #total} number of insights.
* {@link com.crowdin.client.core.model.ResponseList} exposes it as {@link Pagination}; cast it to this class to read the total.
*/
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class AdvisorInsightPagination extends Pagination {

private Integer total;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.crowdin.client.advisors.model;

import com.crowdin.client.core.http.impl.json.EmptyArrayToNullDeserializer;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import lombok.Data;

import java.util.Map;

@Data
public class AdvisorInsightRecommendation {

private String id;
private Boolean primary;
@JsonDeserialize(using = EmptyArrayToNullDeserializer.class)
private Map<String, Object> params;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.crowdin.client.advisors.model;

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 AdvisorInsightResponseList {

private List<AdvisorInsightResponseObject> data;
private AdvisorInsightPagination pagination;

public static ResponseList<AdvisorInsight> to(AdvisorInsightResponseList advisorInsightResponseList) {
return ResponseList.of(
advisorInsightResponseList.getData().stream()
.map(AdvisorInsightResponseObject::getData)
.map(ResponseObject::of)
.collect(Collectors.toList()),
advisorInsightResponseList.getPagination()
);
}
}
Loading
Loading