Skip to content

Commit 6ffbf6a

Browse files
feat: add Accounts API (#100)
1 parent d74a9f9 commit 6ffbf6a

File tree

14 files changed

+349
-0
lines changed

14 files changed

+349
-0
lines changed

.github/CODEOWNERS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Global owners
22
* @foo4u @bloy-smartling @vlinetskiysml @AlexArcher
33

4+
smartling-accounts-api/ @dimitrystd @vfisyuk-smartling
45
smartling-authorization-api/ @foo4u
56
smartling-jobs-api/ @foo4u @vlinetskiysml @andreyfurdylo @PavloMyrotiuk @ishulyak-smartling
67
smartling-job-batches-api/ @dimitrystd @dkBrazz @sl-mmuradov @rmalyona @iskrypka-smartling

pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@
171171

172172
<!-- list in alphabetical order, except api-sdk-all -->
173173
<modules>
174+
<module>smartling-accounts-api</module>
174175
<module>samrtling-api-test-utils</module>
175176
<module>smartling-api-commons</module>
176177
<module>smartling-attachments-api</module>

smartling-accounts-api/pom.xml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<parent>
8+
<groupId>com.smartling.api</groupId>
9+
<artifactId>smartling-sdk-parent</artifactId>
10+
<version>1.8.1-SNAPSHOT</version>
11+
</parent>
12+
13+
<artifactId>smartling-accounts-api</artifactId>
14+
<version>1.8.1-SNAPSHOT</version>
15+
<name>Smartling Accounts API</name>
16+
17+
<dependencies>
18+
<dependency>
19+
<groupId>com.smartling.api</groupId>
20+
<artifactId>smartling-api-commons</artifactId>
21+
<version>1.8.1-SNAPSHOT</version>
22+
</dependency>
23+
</dependencies>
24+
</project>
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.smartling.api.accounts.v2;
2+
3+
import com.smartling.api.accounts.v2.pto.GetProjectsListPTO;
4+
import com.smartling.api.accounts.v2.pto.ProjectDetailsPTO;
5+
import com.smartling.api.v2.response.ListResponse;
6+
7+
import javax.ws.rs.BeanParam;
8+
import javax.ws.rs.Consumes;
9+
import javax.ws.rs.GET;
10+
import javax.ws.rs.Path;
11+
import javax.ws.rs.PathParam;
12+
import javax.ws.rs.Produces;
13+
import javax.ws.rs.core.MediaType;
14+
15+
@Path("/accounts-api/v2")
16+
@Produces(MediaType.APPLICATION_JSON)
17+
@Consumes(MediaType.APPLICATION_JSON)
18+
public interface AccountsApi
19+
{
20+
/**
21+
* Returns the list of projects for an account.
22+
*
23+
* @param accountUid the account’s unique identifier.
24+
* @param getProjectsListPTO filters and pagination parameters (see {@link GetProjectsListPTO})
25+
* @return list of the account projects
26+
*/
27+
@GET
28+
@Path("/accounts/{accountUid}/projects")
29+
ListResponse<ProjectDetailsPTO> getProjectsByAccount(
30+
@PathParam("accountUid") String accountUid,
31+
@BeanParam GetProjectsListPTO getProjectsListPTO
32+
);
33+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.smartling.api.accounts.v2;
2+
3+
import com.smartling.api.v2.client.AbstractApiFactory;
4+
import com.smartling.api.v2.client.ClientFactory;
5+
6+
public class AccountsApiFactory extends AbstractApiFactory<AccountsApi>
7+
{
8+
public AccountsApiFactory()
9+
{
10+
super();
11+
}
12+
13+
public AccountsApiFactory(ClientFactory clientFactory)
14+
{
15+
super(clientFactory);
16+
}
17+
18+
@Override
19+
protected Class<AccountsApi> getApiClass()
20+
{
21+
return AccountsApi.class;
22+
}
23+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.smartling.api.accounts.v2.pto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
import lombok.EqualsAndHashCode;
6+
import lombok.NoArgsConstructor;
7+
import lombok.experimental.SuperBuilder;
8+
9+
import javax.ws.rs.QueryParam;
10+
11+
/**
12+
* Filters and pagination parameters for List projects API.
13+
*/
14+
@EqualsAndHashCode(callSuper = true)
15+
@Data
16+
@NoArgsConstructor
17+
@AllArgsConstructor
18+
@SuperBuilder
19+
public class GetProjectsListPTO extends PaginationPTO {
20+
/**
21+
* Substring search of the name of the project. Search is case-insensitive.
22+
*/
23+
@QueryParam("projectNameFilter")
24+
private String projectNameFilter;
25+
26+
/**
27+
* Indicator whether archived projects should be returned. Defaults to {@code false} if not specified.
28+
*/
29+
@QueryParam("includeArchived")
30+
private Boolean includeArchived;
31+
32+
/**
33+
* Indicator for the type of the project.
34+
*/
35+
@QueryParam("projectTypeCode")
36+
private String projectTypeCode;
37+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.smartling.api.accounts.v2.pto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
import lombok.NoArgsConstructor;
6+
import lombok.experimental.SuperBuilder;
7+
8+
import javax.ws.rs.QueryParam;
9+
10+
/**
11+
* Standard Smartling limit and offset to paginate through results.
12+
*/
13+
@Data
14+
@NoArgsConstructor
15+
@AllArgsConstructor
16+
@SuperBuilder
17+
public class PaginationPTO
18+
{
19+
/**
20+
* Standard Smartling offset to paginate through results.
21+
*/
22+
@QueryParam("offset")
23+
private Integer offset;
24+
25+
/**
26+
* Standard Smartling limit to paginate through results. 500 projects are returned by default if not specified.
27+
*/
28+
@QueryParam("limit")
29+
private Integer limit;
30+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.smartling.api.accounts.v2.pto;
2+
3+
import com.smartling.api.v2.response.ResponseData;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Builder;
6+
import lombok.Data;
7+
import lombok.NoArgsConstructor;
8+
9+
@Builder
10+
@NoArgsConstructor
11+
@AllArgsConstructor
12+
@Data
13+
public class ProjectDetailsPTO implements ResponseData
14+
{
15+
private String accountUid;
16+
private Boolean archived;
17+
private String packageUid;
18+
private String projectId;
19+
private String projectName;
20+
private String projectTypeCode;
21+
private String sourceLocaleDescription;
22+
private String sourceLocaleId;
23+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
artifactId=${project.artifactId}
2+
version=${project.version}
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package com.smartling.api.accounts.v2;
2+
3+
import com.smartling.api.accounts.v2.pto.GetProjectsListPTO;
4+
import com.smartling.api.accounts.v2.pto.ProjectDetailsPTO;
5+
import com.smartling.api.v2.client.ClientConfiguration;
6+
import com.smartling.api.v2.client.DefaultClientConfiguration;
7+
import com.smartling.api.v2.client.auth.BearerAuthStaticTokenFilter;
8+
import com.smartling.api.v2.response.ListResponse;
9+
import okhttp3.mockwebserver.MockResponse;
10+
import okhttp3.mockwebserver.MockWebServer;
11+
import okhttp3.mockwebserver.RecordedRequest;
12+
import org.apache.commons.io.IOUtils;
13+
import org.apache.http.HttpStatus;
14+
import org.junit.After;
15+
import org.junit.Before;
16+
import org.junit.Test;
17+
18+
import javax.ws.rs.core.HttpHeaders;
19+
import java.io.IOException;
20+
import java.nio.charset.StandardCharsets;
21+
22+
import static org.hamcrest.CoreMatchers.containsString;
23+
import static org.hamcrest.CoreMatchers.is;
24+
import static org.hamcrest.MatcherAssert.assertThat;
25+
26+
public class AccountsApiTest {
27+
private final static String TOKEN = "token";
28+
private final static String ACCOUNT_UID = "2f23eaae9";
29+
30+
private MockWebServer mockWebServer;
31+
private AccountsApi accountsApi;
32+
33+
@Before
34+
public void setUp() throws Exception
35+
{
36+
mockWebServer = new MockWebServer();
37+
mockWebServer.start();
38+
39+
final AccountsApiFactory factory = new AccountsApiFactory();
40+
final BearerAuthStaticTokenFilter tokenFilter = new BearerAuthStaticTokenFilter(TOKEN);
41+
final ClientConfiguration config = DefaultClientConfiguration.builder()
42+
.baseUrl(mockWebServer.url("/").url())
43+
.build();
44+
45+
accountsApi = factory.buildApi(tokenFilter, config);
46+
}
47+
48+
@After
49+
public void tearDown() throws Exception
50+
{
51+
mockWebServer.shutdown();
52+
}
53+
54+
@Test
55+
public void getProjectsByAccount() throws InterruptedException, IOException
56+
{
57+
mockResponse(HttpStatus.SC_OK, "/projectsByAccountResponse.json");
58+
59+
final ListResponse<ProjectDetailsPTO> projects = accountsApi.getProjectsByAccount(
60+
ACCOUNT_UID,
61+
GetProjectsListPTO.builder()
62+
.projectNameFilter("name")
63+
.includeArchived(true)
64+
.projectTypeCode("GDN")
65+
.offset(10)
66+
.limit(5)
67+
.build()
68+
);
69+
70+
final RecordedRequest request = mockWebServer.takeRequest();
71+
72+
String requestPath = request.getPath();
73+
74+
assertThat(request.getMethod(), is("GET"));
75+
assertThat(requestPath, containsString("/accounts-api/v2/accounts/" + ACCOUNT_UID + "/projects"));
76+
assertThat(requestPath, containsString("projectNameFilter=name"));
77+
assertThat(requestPath, containsString("includeArchived=true"));
78+
assertThat(requestPath, containsString("offset=10"));
79+
assertThat(requestPath, containsString("limit=5"));
80+
assertThat(requestPath, containsString("projectTypeCode=GDN"));
81+
82+
assertThat(projects.getTotalCount(), is(2L));
83+
assertThat(projects.getItems().size(), is(2));
84+
assertThat(projects.getItems().get(0), is(ProjectDetailsPTO.builder()
85+
.accountUid(ACCOUNT_UID)
86+
.archived(true)
87+
.packageUid("8dab856631c8")
88+
.projectId("2ab430ac1")
89+
.projectName("Crawler Creator Test")
90+
.projectTypeCode("GDN")
91+
.sourceLocaleDescription("English (United States) [en-US]")
92+
.sourceLocaleId("en-US")
93+
.build()));
94+
assertThat(projects.getItems().get(1), is(ProjectDetailsPTO.builder()
95+
.accountUid(ACCOUNT_UID)
96+
.archived(false)
97+
.packageUid("8dab856631c8")
98+
.projectId("f58140a34")
99+
.projectName("GDN Protected Test")
100+
.projectTypeCode("GDN")
101+
.sourceLocaleDescription("English (United States) [en-US]")
102+
.sourceLocaleId("en-US")
103+
.build()));
104+
}
105+
106+
@SuppressWarnings("SameParameterValue")
107+
private void mockResponse(final int httpStatusCode, final String responseResourceName) throws IOException
108+
{
109+
String responseBody = IOUtils.resourceToString(responseResourceName, StandardCharsets.UTF_8);
110+
111+
final MockResponse response = new MockResponse()
112+
.setResponseCode(httpStatusCode)
113+
.setHeader(HttpHeaders.CONTENT_LENGTH, responseBody.length())
114+
.setHeader(HttpHeaders.CONTENT_TYPE, "application/json; charset=utf-8")
115+
.setBody(responseBody);
116+
117+
mockWebServer.enqueue(response);
118+
}
119+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
{
2+
"response": {
3+
"code": "SUCCESS",
4+
"data": {
5+
"totalCount": 2,
6+
"items": [
7+
{
8+
"projectId": "2ab430ac1",
9+
"projectName": "Crawler Creator Test",
10+
"accountUid": "2f23eaae9",
11+
"archived": true,
12+
"projectTypeCode": "GDN",
13+
"projectTypeDisplayValue": null,
14+
"packageUid": "8dab856631c8",
15+
"sourceLocaleId": "en-US",
16+
"sourceLocaleDescription": "English (United States) [en-US]"
17+
},
18+
{
19+
"projectId": "f58140a34",
20+
"projectName": "GDN Protected Test",
21+
"accountUid": "2f23eaae9",
22+
"archived": false,
23+
"projectTypeCode": "GDN",
24+
"projectTypeDisplayValue": null,
25+
"packageUid": "8dab856631c8",
26+
"sourceLocaleId": "en-US",
27+
"sourceLocaleDescription": "English (United States) [en-US]"
28+
}
29+
]
30+
}
31+
}
32+
}

smartling-api-sdk-all/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@
1111
<packaging>jar</packaging>
1212
<name>Smartling API SDK</name>
1313
<dependencies>
14+
<dependency>
15+
<groupId>com.smartling.api</groupId>
16+
<artifactId>smartling-accounts-api</artifactId>
17+
<version>1.8.1-SNAPSHOT</version>
18+
</dependency>
1419
<dependency>
1520
<groupId>com.smartling.api</groupId>
1621
<artifactId>smartling-issues-api</artifactId>

smartling-api-sdk-all/src/main/java/com/smartling/api/sdk/SmartlingApi.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.smartling.api.sdk;
22

3+
import com.smartling.api.accounts.v2.AccountsApi;
34
import com.smartling.api.attachments.v2.AttachmentsApi;
45
import com.smartling.api.contexts.v2.ContextsApi;
56
import com.smartling.api.files.v2.FilesApi;
@@ -17,6 +18,14 @@
1718
*/
1819
public interface SmartlingApi
1920
{
21+
/**
22+
* Returns an API for working with Smartling
23+
* <a href="https://api-reference.smartling.com/#tag/Account-and-Projects">accounts</a>.
24+
*
25+
* @return {@link AccountsApi}
26+
*/
27+
AccountsApi accountsApi();
28+
2029
/**
2130
* Returns an API to for working with Smartling
2231
* <a href="https://api-reference.smartling.com/#tag/Issues">issues</a>.

0 commit comments

Comments
 (0)