Skip to content

Commit a20de55

Browse files
feat: add support for group managers and teams (#313)
* Introduced new endpoints to manage group managers and group teams (listing, updating, and retrieving). * Added and integrated new models for seamless functionality. * Added unit tests and mock API resources to ensure correct functionality.
1 parent 0bf008b commit a20de55

16 files changed

+389
-0
lines changed

src/main/java/com/crowdin/client/teams/TeamsApi.java

+48
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
import com.crowdin.client.teams.model.TeamMemberResponseList;
2121
import com.crowdin.client.teams.model.TeamResponseList;
2222
import com.crowdin.client.teams.model.TeamResponseObject;
23+
import com.crowdin.client.teams.model.GroupTeam;
24+
import com.crowdin.client.teams.model.GroupTeamResponseList;
25+
import com.crowdin.client.teams.model.GroupTeamResponseObject;
2326

2427
import java.util.List;
2528
import java.util.Map;
@@ -34,6 +37,51 @@ public TeamsApi(Credentials credentials, ClientConfig clientConfig) {
3437
super(credentials, clientConfig);
3538
}
3639

40+
/**
41+
* List group teams. For Crowdin Enterprise only
42+
* @param groupId group identifier
43+
* @param orderBy
44+
* @return list of group teams
45+
* @see <ul>
46+
* <li><a href="https://developer.crowdin.com/enterprise/api/v2/#operation/api.groups.teams.getMany" target="_blank"><b>Enterprise API Documentation</b></a></li>
47+
* </ul>
48+
*/
49+
public ResponseList<GroupTeam> listGroupTeams(Long groupId, String orderBy) throws HttpException, HttpBadRequestException {
50+
Map<String, Optional<Object>> queryParams = HttpRequestConfig.buildUrlParams(
51+
"orderBy", Optional.ofNullable(orderBy)
52+
);
53+
GroupTeamResponseList response = this.httpClient.get(this.url + "/groups/" + groupId + "/teams", new HttpRequestConfig(queryParams), GroupTeamResponseList.class);
54+
return GroupTeamResponseList.to(response);
55+
}
56+
57+
/**
58+
* Update group teams. For Crowdin Enterprise only
59+
* @param groupId group identifier
60+
* @param request request object
61+
* @return list of updated group teams
62+
* @see <ul>
63+
* <li><a href="https://developer.crowdin.com/enterprise/api/v2/#operation/api.groups.teams.patch" target="_blank"><b>Enterprise API Documentation</b></a></li>
64+
* </ul>
65+
*/
66+
public ResponseList<GroupTeam> updateGroupTeams(Long groupId, List<PatchRequest> request) throws HttpException, HttpBadRequestException {
67+
GroupTeamResponseList response = this.httpClient.patch(this.url + "/groups/" + groupId + "/teams", request, new HttpRequestConfig(), GroupTeamResponseList.class);
68+
return GroupTeamResponseList.to(response);
69+
}
70+
71+
/**
72+
* Get group team. For Crowdin Enterprise only
73+
* @param groupId group identifier
74+
* @param teamId team identifier
75+
* @return group team
76+
* @see <ul>
77+
* <li><a href="https://developer.crowdin.com/enterprise/api/v2/#operation/api.groups.teams.get" target="_blank"><b>Enterprise API Documentation</b></a></li>
78+
* </ul>
79+
*/
80+
public ResponseObject<GroupTeam> getGroupTeam(Long groupId, Long teamId) throws HttpException, HttpBadRequestException {
81+
GroupTeamResponseObject response = this.httpClient.get(this.url + "/groups/" + groupId + "/teams/" + teamId, new HttpRequestConfig(), GroupTeamResponseObject.class);
82+
return ResponseObject.of(response.getData());
83+
}
84+
3785
/**
3886
* @param projectId project identifier
3987
* @param request request object
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.crowdin.client.teams.model;
2+
3+
import lombok.Data;
4+
5+
@Data
6+
public class GroupTeam {
7+
8+
private Long id;
9+
private Team team;
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.crowdin.client.teams.model;
2+
3+
import com.crowdin.client.core.model.Pagination;
4+
import com.crowdin.client.core.model.ResponseList;
5+
import com.crowdin.client.core.model.ResponseObject;
6+
import lombok.Data;
7+
8+
import java.util.List;
9+
import java.util.stream.Collectors;
10+
11+
@Data
12+
public class GroupTeamResponseList {
13+
14+
private List<GroupTeamResponseObject> data;
15+
private Pagination pagination;
16+
17+
public static ResponseList<GroupTeam> to(GroupTeamResponseList groupTeamResponseList) {
18+
return ResponseList.of(
19+
groupTeamResponseList.getData().stream()
20+
.map(GroupTeamResponseObject::getData)
21+
.map(ResponseObject::of)
22+
.collect(Collectors.toList()),
23+
groupTeamResponseList.getPagination()
24+
);
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.crowdin.client.teams.model;
2+
3+
import lombok.Data;
4+
5+
@Data
6+
public class GroupTeamResponseObject {
7+
8+
private GroupTeam data;
9+
}

src/main/java/com/crowdin/client/users/UsersApi.java

+47
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,53 @@ public UsersApi(Credentials credentials, ClientConfig clientConfig) {
2121
super(credentials, clientConfig);
2222
}
2323

24+
/**
25+
* List group managers. For Crowdin Enterprise only
26+
* @param groupId Group Identifier. Get via List Groups
27+
* @param teamIds Defines team ids. It can be one team id or a list of comma-separated ones.
28+
* @param orderBy
29+
* @return list of group managers
30+
* @see <ul>
31+
* <li><a href="https://developer.crowdin.com/enterprise/api/v2/#operation/api.groups.managers.getMany" target="_blank"><b>Enterprise API Documentation</b></a></li>
32+
* </ul>
33+
*/
34+
public ResponseList<GroupManager> listGroupManagers(Long groupId, List<Long> teamIds, String orderBy) throws HttpException, HttpBadRequestException {
35+
Map<String, Optional<Object>> queryParams = HttpRequestConfig.buildUrlParams(
36+
"teamIds", Optional.ofNullable(teamIds),
37+
"orderBy", Optional.ofNullable(orderBy)
38+
);
39+
GroupManagerResponseList response = this.httpClient.get(this.url + "/groups/" + groupId + "/managers", new HttpRequestConfig(queryParams), GroupManagerResponseList.class);
40+
return GroupManagerResponseList.to(response);
41+
}
42+
43+
/**
44+
* Update group managers. For Crowdin Enterprise only
45+
* @param groupId group identifier
46+
* @param request request object
47+
* @return list of updated group managers
48+
* @see <ul>
49+
* <li><a href="https://developer.crowdin.com/enterprise/api/v2/#operation/api.groups.managers.patch" target="_blank"><b>Enterprise API Documentation</b></a></li>
50+
* </ul>
51+
*/
52+
public ResponseList<GroupManager> updateGroupManagers(Long groupId, List<PatchRequest> request) throws HttpException, HttpBadRequestException {
53+
GroupManagerResponseList response = this.httpClient.patch(this.url + "/groups/" + groupId + "/managers", request, new HttpRequestConfig(), GroupManagerResponseList.class);
54+
return GroupManagerResponseList.to(response);
55+
}
56+
57+
/**
58+
* Get group manager. For Crowdin Enterprise only
59+
* @param groupId group identifier
60+
* @param userId user identifier
61+
* @return group manager
62+
* @see <ul>
63+
* <li><a href="https://developer.crowdin.com/enterprise/api/v2/#operation/api.groups.managers.get" target="_blank"><b>Enterprise API Documentation</b></a></li>
64+
* </ul>
65+
*/
66+
public ResponseObject<GroupManager> getGroupManager(Long groupId, Long userId) throws HttpException, HttpBadRequestException {
67+
GroupManagerResponseObject response = this.httpClient.get(this.url + "/groups/" + groupId + "/managers/" + userId, new HttpRequestConfig(), GroupManagerResponseObject.class);
68+
return ResponseObject.of(response.getData());
69+
}
70+
2471
/**
2572
* List project members. For Crowdin Enterprise only
2673
* @param projectId Project Identifier. Get via List Projects
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.crowdin.client.users.model;
2+
3+
import com.crowdin.client.teams.model.GroupTeam;
4+
import lombok.Data;
5+
6+
import java.util.List;
7+
8+
@Data
9+
public class GroupManager {
10+
private Long id;
11+
private User user;
12+
private List<GroupTeam> teams;
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.crowdin.client.users.model;
2+
3+
import com.crowdin.client.core.model.Pagination;
4+
import com.crowdin.client.core.model.ResponseList;
5+
import com.crowdin.client.core.model.ResponseObject;
6+
import lombok.Data;
7+
8+
import java.util.List;
9+
import java.util.stream.Collectors;
10+
11+
@Data
12+
public class GroupManagerResponseList {
13+
private List<GroupManagerResponseObject> data;
14+
private Pagination pagination;
15+
16+
public static ResponseList<GroupManager> to(GroupManagerResponseList groupManagerResponseList) {
17+
return ResponseList.of(
18+
groupManagerResponseList.getData().stream()
19+
.map(GroupManagerResponseObject::getData)
20+
.map(ResponseObject::of)
21+
.collect(Collectors.toList()),
22+
groupManagerResponseList.getPagination()
23+
);
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.crowdin.client.users.model;
2+
3+
import lombok.Data;
4+
5+
@Data
6+
public class GroupManagerResponseObject {
7+
private GroupManager data;
8+
}

src/test/java/com/crowdin/client/teams/TeamsApiTest.java

+43
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import com.crowdin.client.teams.model.ProjectTeamResources;
1515
import com.crowdin.client.teams.model.Team;
1616
import com.crowdin.client.teams.model.TeamMember;
17+
import com.crowdin.client.teams.model.GroupTeam;
1718
import com.crowdin.client.users.model.TranslatorRole;
1819
import com.crowdin.client.users.model.TranslatorRoleName;
1920
import com.crowdin.client.users.model.TranslatorRolePermissions;
@@ -30,18 +31,23 @@
3031
import java.util.Map;
3132

3233
import static java.util.Collections.singletonList;
34+
import static java.util.Collections.singletonMap;
3335
import static org.junit.jupiter.api.Assertions.*;
3436

3537
public class TeamsApiTest extends TestClient {
3638

3739
private final Long projectId = 12L;
3840
private final Long userId = 3L;
3941
private final Long teamId = 1L;
42+
private final Long groupId = 27L;
4043
private final String name = "French";
4144

4245
@Override
4346
public List<RequestMock> getMocks() {
4447
return Arrays.asList(
48+
RequestMock.build(this.url + "/groups/" + groupId + "/teams", HttpGet.METHOD_NAME, "api/teams/listGroupTeams.json"),
49+
RequestMock.build(this.url + "/groups/" + groupId + "/teams", HttpPatch.METHOD_NAME, "api/teams/editGroupTeams.json", "api/teams/listGroupTeams.json"),
50+
RequestMock.build(this.url + "/groups/" + groupId + "/teams/" + teamId, HttpGet.METHOD_NAME, "api/teams/groupTeam.json"),
4551
RequestMock.build(this.url + "/projects/" + projectId + "/teams", HttpPost.METHOD_NAME, "api/teams/addTeamToProjectRequest.json", "api/teams/projectTeamResources.json"),
4652
RequestMock.build(this.url + "/teams", HttpGet.METHOD_NAME, "api/teams/listTeams.json"),
4753
RequestMock.build(this.url + "/teams", HttpPost.METHOD_NAME, "api/teams/addTeamRequest.json", "api/teams/team.json"),
@@ -55,6 +61,43 @@ public List<RequestMock> getMocks() {
5561
);
5662
}
5763

64+
@Test
65+
public void listGroupTeamsTest() {
66+
ResponseList<GroupTeam> response = this.getTeamsApi().listGroupTeams(groupId, null);
67+
assertNotNull(response);
68+
assertEquals(1, response.getData().size());
69+
assertEquals(groupId, response.getData().get(0).getData().getId());
70+
assertEquals(teamId, response.getData().get(0).getData().getTeam().getId());
71+
assertEquals(name, response.getData().get(0).getData().getTeam().getName());
72+
}
73+
74+
@Test
75+
public void updateGroupTeamsTest() {
76+
PatchRequest requestAdd = new PatchRequest();
77+
requestAdd.setOp(PatchOperation.ADD);
78+
requestAdd.setPath("/-");
79+
requestAdd.setValue(singletonMap("teamId", 1));
80+
81+
PatchRequest requestRemove = new PatchRequest();
82+
requestRemove.setOp(PatchOperation.REMOVE);
83+
requestRemove.setPath("/24");
84+
85+
List<PatchRequest> requests = Arrays.asList(requestAdd, requestRemove);
86+
ResponseList<GroupTeam> response = this.getTeamsApi().updateGroupTeams(groupId, requests);
87+
assertNotNull(response);
88+
assertEquals(groupId, response.getData().get(0).getData().getId());
89+
assertEquals(teamId, response.getData().get(0).getData().getTeam().getId());
90+
}
91+
92+
@Test
93+
public void getGroupTeamTest() {
94+
ResponseObject<GroupTeam> response = this.getTeamsApi().getGroupTeam(groupId, teamId);
95+
assertNotNull(response);
96+
assertEquals(groupId, response.getData().getId());
97+
assertEquals(teamId, response.getData().getTeam().getId());
98+
assertEquals(name, response.getData().getTeam().getName());
99+
}
100+
58101
@Test
59102
public void addTeamToProjectTest() {
60103
AddTeamToProjectRequest request = new AddTeamToProjectRequest();

src/test/java/com/crowdin/client/users/UsersApiTest.java

+40
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.util.Map;
1919

2020
import static java.util.Collections.singletonList;
21+
import static java.util.Collections.singletonMap;
2122
import static org.junit.jupiter.api.Assertions.*;
2223

2324
public class UsersApiTest extends TestClient {
@@ -26,6 +27,7 @@ public class UsersApiTest extends TestClient {
2627
private final Long projectId2 = 13L;
2728
private final Long userId = 1L;
2829
private final Long memberId = 3L;
30+
private final Long groupId = 27L;
2931

3032
private final String name = "Smith";
3133

@@ -40,6 +42,9 @@ public class UsersApiTest extends TestClient {
4042
@Override
4143
public List<RequestMock> getMocks() {
4244
return Arrays.asList(
45+
RequestMock.build(this.url + "/groups/" + groupId + "/managers", HttpGet.METHOD_NAME, "api/users/listGroupManagers.json"),
46+
RequestMock.build(this.url + "/groups/" + groupId + "/managers", HttpPatch.METHOD_NAME, "api/users/editGroupManagers.json", "api/users/listGroupManagers.json"),
47+
RequestMock.build(this.url + "/groups/" + groupId + "/managers/" + userId, HttpGet.METHOD_NAME, "api/users/groupManager.json"),
4348
RequestMock.build(String.format("%s/projects/%d/members", this.url, projectId2), HttpGet.METHOD_NAME, "api/users/listProjectMembersEnterprise.json"),
4449
RequestMock.build(this.url + "/projects/" + projectId + "/members", HttpPost.METHOD_NAME, "api/users/addProjectMember.json", "api/users/projectTeamMembers.json"),
4550
RequestMock.build(String.format("%s/projects/%d/members/%d", this.url, projectId, memberId), HttpGet.METHOD_NAME, "api/users/getProjectMemberResponse.json"),
@@ -56,6 +61,41 @@ public List<RequestMock> getMocks() {
5661
);
5762
}
5863

64+
@Test
65+
public void listGroupManagersTest() {
66+
ResponseList<GroupManager> response = this.getUsersApi().listGroupManagers(groupId, null, null);
67+
assertNotNull(response);
68+
assertEquals(1, response.getData().size());
69+
assertEquals(groupId, response.getData().get(0).getData().getId());
70+
assertEquals(userId, response.getData().get(0).getData().getUser().getId());
71+
}
72+
73+
@Test
74+
public void updateGroupManagersTest() {
75+
PatchRequest requestAdd = new PatchRequest();
76+
requestAdd.setOp(PatchOperation.ADD);
77+
requestAdd.setValue(singletonMap("userId", userId));
78+
requestAdd.setPath("/-");
79+
80+
PatchRequest requestRemove = new PatchRequest();
81+
requestRemove.setOp(PatchOperation.REMOVE);
82+
requestRemove.setPath("/24");
83+
84+
List<PatchRequest> requests = Arrays.asList(requestAdd, requestRemove);
85+
ResponseList<GroupManager> responseList = this.getUsersApi().updateGroupManagers(groupId, requests);
86+
assertEquals(1, responseList.getData().size());
87+
assertEquals(userId, responseList.getData().get(0).getData().getUser().getId());
88+
}
89+
90+
@Test
91+
public void getGroupManagerTest() {
92+
ResponseObject<GroupManager> response = this.getUsersApi().getGroupManager(groupId, userId);
93+
assertNotNull(response);
94+
assertNotNull(response.getData());
95+
assertEquals(groupId, response.getData().getId());
96+
assertEquals(userId, response.getData().getUser().getId());
97+
}
98+
5999
@Test
60100
public void listProjectTeamMembersEnterpriseTest() {
61101
ResponseList<ProjectMember> responseList = this.getUsersApi().listProjectMembersEnterprise(this.projectId2, null, null, null, null, null);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
[
2+
{
3+
"op": "add",
4+
"path": "/-",
5+
"value": {
6+
"teamId": 1
7+
}
8+
},
9+
{
10+
"op": "remove",
11+
"path": "/24"
12+
}
13+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"data": {
3+
"id": 27,
4+
"team": {
5+
"id": 1,
6+
"name": "French",
7+
"totalMembers": 8,
8+
"createdAt": "2019-09-23T09:04:29+00:00",
9+
"updatedAt": "2019-09-23T09:04:29+00:00"
10+
}
11+
}
12+
}

0 commit comments

Comments
 (0)