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
99 changes: 99 additions & 0 deletions src/main/java/com/crowdin/client/tasks/TasksApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,14 @@
import com.crowdin.client.core.model.ResponseList;
import com.crowdin.client.core.model.ResponseObject;
import com.crowdin.client.tasks.model.AddTaskRequest;
import com.crowdin.client.tasks.model.AddTaskSettingsTemplateRequest;
import com.crowdin.client.tasks.model.Status;
import com.crowdin.client.tasks.model.Task;
import com.crowdin.client.tasks.model.TaskResponseList;
import com.crowdin.client.tasks.model.TaskResponseObject;
import com.crowdin.client.tasks.model.TaskSettingsTemplate;
import com.crowdin.client.tasks.model.TaskSettingsTemplateResponseList;
import com.crowdin.client.tasks.model.TaskSettingsTemplateResponseObject;

import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -160,4 +164,99 @@ public ResponseObject<Task> editTaskArchivedStatus(Long taskId, Long projectId,
TaskResponseObject taskResponseObject = this.httpClient.patch(this.url + "/user/tasks/" + taskId, request, new HttpRequestConfig(queryParams), TaskResponseObject.class);
return ResponseObject.of(taskResponseObject.getData());
}

//<editor-fold desc="Task Settings Templates">

/**
* @param projectId project identifier (filter)
* @param limit maximum number of items to retrieve (default 25)
* @param offset starting offset in the collection (default 0)
* @return list of task settings templates
* @see <ul>
* <li><a href="https://developer.crowdin.com/api/v2/#operation/api.projects.tasks.settings-templates.getMany" target="_blank"><b>API Documentation</b></a></li>
* <li><a href="https://developer.crowdin.com/enterprise/api/v2/#operation/api.projects.tasks.settings-templates.getMany" target="_blank"><b>Enterprise API Documentation</b></a></li>
* </ul>
*/
public ResponseList<TaskSettingsTemplate> listTaskSettingsTemplates(Long projectId, Integer limit, Integer offset) {
String url = formUrl_taskSettingsTemplates(projectId);
Map<String, Optional<Object>> queryParams = HttpRequestConfig.buildUrlParams(
"limit", Optional.ofNullable(limit),
"offset", Optional.ofNullable(offset)
);
TaskSettingsTemplateResponseList responseList = this.httpClient.get(url, new HttpRequestConfig(queryParams), TaskSettingsTemplateResponseList.class);
return TaskSettingsTemplateResponseList.to(responseList);
}

/**
* @param projectId project identifier
* @param request request object
* @return newly created task settings template
* @see <ul>
* <li><a href="https://developer.crowdin.com/api/v2/#operation/api.projects.tasks.settings-templates.post" target="_blank"><b>API Documentation</b></a></li>
* <li><a href="https://developer.crowdin.com/enterprise/api/v2/#operation/api.projects.tasks.settings-templates.post" target="_blank"><b>Enterprise API Documentation</b></a></li>
* </ul>
*/
public ResponseObject<TaskSettingsTemplate> addTaskSettingsTemplate(Long projectId, AddTaskSettingsTemplateRequest request) {
String url = formUrl_taskSettingsTemplates(projectId);
TaskSettingsTemplateResponseObject responseObject = this.httpClient.post(url, request, new HttpRequestConfig(), TaskSettingsTemplateResponseObject.class);
return ResponseObject.of(responseObject.getData());
}

/**
* @param projectId project identifier
* @param taskSettingsTemplateId task settings template identifier
* @return task settings template
* @see <ul>
* <li><a href="https://developer.crowdin.com/api/v2/#operation/api.projects.tasks.settings-templates.get" target="_blank"><b>API Documentation</b></a></li>
* <li><a href="https://developer.crowdin.com/enterprise/api/v2/#operation/api.projects.tasks.settings-templates.get" target="_blank"><b>Enterprise API Documentation</b></a></li>
* </ul>
*/
public ResponseObject<TaskSettingsTemplate> getTaskSettingsTemplate(Long projectId, Long taskSettingsTemplateId) {
String url = formUrl_taskSettingsTemplateId(projectId, taskSettingsTemplateId);
TaskSettingsTemplateResponseObject responseObject = this.httpClient.get(url, new HttpRequestConfig(), TaskSettingsTemplateResponseObject.class);
return ResponseObject.of(responseObject.getData());
}

/**
* @param projectId project identifier
* @param taskSettingsTemplateId task settings template identifier
* @see <ul>
* <li><a href="https://developer.crowdin.com/api/v2/#operation/api.projects.tasks.settings-templates.delete" target="_blank"><b>API Documentation</b></a></li>
* <li><a href="https://developer.crowdin.com/enterprise/api/v2/#operation/api.projects.tasks.settings-templates.delete" target="_blank"><b>Enterprise API Documentation</b></a></li>
* </ul>
*/
public void deleteTaskSettingsTemplate(Long projectId, Long taskSettingsTemplateId) {
String url = formUrl_taskSettingsTemplateId(projectId, taskSettingsTemplateId);
this.httpClient.delete(url, new HttpRequestConfig(), Void.class);
}

/**
* @param projectId project identifier
* @param taskSettingsTemplateId task settings template identifier
* @param request request object
* @return updated task settings template
* @see <ul>
* <li><a href="https://developer.crowdin.com/api/v2/#operation/api.projects.tasks.settings-templates.patch" target="_blank"><b>API Documentation</b></a></li>
* <li><a href="https://developer.crowdin.com/enterprise/api/v2/#operation/api.projects.tasks.settings-templates.patch" target="_blank"><b>Enterprise API Documentation</b></a></li>
* </ul>
*/
public ResponseObject<TaskSettingsTemplate> editTaskSettingsTemplate(Long projectId, Long taskSettingsTemplateId, List<PatchRequest> request) {
String url = formUrl_taskSettingsTemplateId(projectId, taskSettingsTemplateId);
TaskSettingsTemplateResponseObject responseObject = this.httpClient.patch(url, request, new HttpRequestConfig(), TaskSettingsTemplateResponseObject.class);
return ResponseObject.of(responseObject.getData());
}

//<editor-fold desc="Helper methods">

private String formUrl_taskSettingsTemplates(Long projectId) {
return this.url + "/projects/" + projectId + "/tasks/settings-templates";
}

private String formUrl_taskSettingsTemplateId(Long projectId, Long taskSettingsTemplateId) {
return this.url + "/projects/" + projectId + "/tasks/settings-templates/" + taskSettingsTemplateId;
}

//</editor-fold>

//</editor-fold>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.crowdin.client.tasks.model;

import lombok.Data;

@Data
public class AddTaskSettingsTemplateRequest {
private String name;
private TaskSettingsTemplateConfig config;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.crowdin.client.tasks.model;

import lombok.Data;

import java.util.List;

@Data
public class LanguageReference {
private String languageId;
private List<Integer> userIds;
private List<Integer> teamIds;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.crowdin.client.tasks.model;

import lombok.Data;

import java.util.Date;

@Data
public class TaskSettingsTemplate {
private Long id;
private String name;
private TaskSettingsTemplateConfig config;
private Date createdAt;
private Date updatedAt;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.crowdin.client.tasks.model;

import lombok.Data;

import java.util.List;

@Data
public class TaskSettingsTemplateConfig {
private List<LanguageReference> languages;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.crowdin.client.tasks.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 TaskSettingsTemplateResponseList {
private List<TaskSettingsTemplateResponseObject> data;
private Pagination pagination;

public static ResponseList<TaskSettingsTemplate> to(TaskSettingsTemplateResponseList responseList) {
return ResponseList.of(
responseList.getData().stream()
.map(TaskSettingsTemplateResponseObject::getData)
.map(ResponseObject::of)
.collect(Collectors.toList()),
responseList.getPagination()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.crowdin.client.tasks.model;

import lombok.Data;

@Data
public class TaskSettingsTemplateResponseObject {
private TaskSettingsTemplate data;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
package com.crowdin.client.tasks;

import com.crowdin.client.core.model.PatchOperation;
import com.crowdin.client.core.model.PatchRequest;
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.tasks.model.AddTaskSettingsTemplateRequest;
import com.crowdin.client.tasks.model.LanguageReference;
import com.crowdin.client.tasks.model.TaskSettingsTemplate;
import com.crowdin.client.tasks.model.TaskSettingsTemplateConfig;

import lombok.SneakyThrows;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPatch;
import org.apache.http.client.methods.HttpPost;
import org.junit.jupiter.api.Test;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

import static org.junit.jupiter.api.Assertions.*;

public class TaskSettingsTemplatesApiTest extends TestClient {
private final Long projectId = 1L;
private final Long taskSettingsTemplateId = 1L;

@Override
public List<RequestMock> getMocks() {
return Arrays.asList(
// LIST
RequestMock.build(
formUrl_taskSettingsTemplates(projectId),
HttpGet.METHOD_NAME,
"api/tasks/settings-templates/listTaskSettingsTemplatesResponse.json",
new HashMap<String, Integer>() {{
put("limit", 20);
put("offset", 10);
}}
),

// ADD
RequestMock.build(
formUrl_taskSettingsTemplates(projectId),
HttpPost.METHOD_NAME,
"api/tasks/settings-templates/addTaskSettingsTemplateRequest.json",
"api/tasks/settings-templates/commonResponses_single.json"
),

// GET
RequestMock.build(
formUrl_taskSettingsTemplateId(projectId, taskSettingsTemplateId),
HttpGet.METHOD_NAME,
"api/tasks/settings-templates/commonResponses_single.json"
),

// DELETE
RequestMock.build(
formUrl_taskSettingsTemplateId(projectId, taskSettingsTemplateId),
HttpDelete.METHOD_NAME
),

// PATCH
RequestMock.build(
formUrl_taskSettingsTemplateId(projectId, taskSettingsTemplateId),
HttpPatch.METHOD_NAME,
"api/tasks/settings-templates/editTaskSettingsTemplateRequest.json",
"api/tasks/settings-templates/commonResponses_single.json"
)
);
}

//<editor-fold desc="Form Url methods for mocks">
private String formUrl_taskSettingsTemplates(Long projectId) {
return this.url + "/projects/" + projectId + "/tasks/settings-templates";
}

private String formUrl_taskSettingsTemplateId(Long projectId, Long taskSettingsTemplateId) {
return this.url + "/projects/" + projectId + "/tasks/settings-templates/" + taskSettingsTemplateId;
}
//</editor-fold>

@Test
public void listTaskSettingsTemplates() {
ResponseList<TaskSettingsTemplate> response = this.getTasksApi().listTaskSettingsTemplates(projectId, 20, 10);
assertTaskSettingsTemplate(response.getData().get(0).getData());
}

@Test
public void addTaskSettingsTemplate() {
AddTaskSettingsTemplateRequest request = new AddTaskSettingsTemplateRequest() {{
setName("Perfect name");
setConfig(new TaskSettingsTemplateConfig() {{
setLanguages(Collections.singletonList(new LanguageReference() {{
setLanguageId("uk");
setUserIds(Arrays.asList(1, 2, 3));
setTeamIds(Arrays.asList(4, 5, 6));
}}));
}});
}};

ResponseObject<TaskSettingsTemplate> response = this.getTasksApi().addTaskSettingsTemplate(projectId, request);
assertTaskSettingsTemplate(response.getData());
}

@Test
public void getTaskSettingsTemplate() {
ResponseObject<TaskSettingsTemplate> response = this.getTasksApi().getTaskSettingsTemplate(projectId, taskSettingsTemplateId);
assertTaskSettingsTemplate(response.getData());
}

@Test
public void deleteTaskSettingsTemplate() {
this.getTasksApi().deleteTaskSettingsTemplate(projectId, taskSettingsTemplateId);
}

@Test
public void editTaskSettingsTemplate() {
List<PatchRequest> request = new ArrayList<PatchRequest>() {{
add(new PatchRequest() {{
setOp(PatchOperation.REPLACE);
setPath("/name");
setValue("New name");
}});
add(new PatchRequest() {{
setOp(PatchOperation.REPLACE);
setPath("/config");
setValue(new TaskSettingsTemplateConfig() {{
setLanguages(Collections.singletonList(new LanguageReference() {{
setLanguageId("uk");
setUserIds(Arrays.asList(1, 2, 3));
setTeamIds(Arrays.asList(4, 5, 6));
}}));
}});
}});
}};

ResponseObject<TaskSettingsTemplate> response = this.getTasksApi().editTaskSettingsTemplate(projectId, taskSettingsTemplateId, request);
assertTaskSettingsTemplate(response.getData());
}

@SneakyThrows
private static void assertTaskSettingsTemplate(TaskSettingsTemplate template) {
assertNotNull(template);

assertEquals("Default template", template.getName());

assertNotNull(template.getConfig());
assertNotNull(template.getConfig().getLanguages());
assertFalse(template.getConfig().getLanguages().isEmpty());

LanguageReference languageReference = template.getConfig().getLanguages().get(0);
assertEquals("uk", languageReference.getLanguageId());

assertNotNull(languageReference.getUserIds());
assertEquals(Arrays.asList(1, 2, 3), languageReference.getUserIds());

assertNotNull(languageReference.getTeamIds());
assertEquals(Arrays.asList(4, 5, 6), languageReference.getTeamIds());

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
assertEquals(sdf.parse("2019-09-23T11:26:54+00:00"), template.getCreatedAt());
assertEquals(sdf.parse("2019-09-23T11:26:54+00:00"), template.getUpdatedAt());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"name": "Perfect name",
"config": {
"languages": [
{
"languageId": "uk",
"userIds": [
1, 2, 3
],
"teamIds": [
4, 5, 6
]
}
]
}
}
Loading