Commit eac251a8 authored by Greg Messner's avatar Greg Messner
Browse files

Initial commit for support of the Applications API (#338).

parent 15e3818f
package org.gitlab4j.api;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.Response;
import org.gitlab4j.api.models.Application;
/**
* This class implements the client side API for the GitLab Applications API.
* See <a href="https://docs.gitlab.com/ce/api/applications.html">Applications API at GitLab</a> for more information.
*/
public class ApplicationsApi extends AbstractApi {
public ApplicationsApi(GitLabApi gitLabApi) {
super(gitLabApi);
}
/**
* Get all OATH applications.
*
* @return a List of OAUTH Application instances
* @throws GitLabApiException if any exception occurs
*/
public List<Application> getApplications() throws GitLabApiException {
return (getApplications(getDefaultPerPage()).all());
}
/**
* Get all OAUTH applications using the specified page and per page setting
*
* @param page the page to get
* @param perPage the number of items per page
* @return a list of OAUTH Applications in the specified range
* @throws GitLabApiException if any exception occurs
*/
public List<Application> getApplications(int page, int perPage) throws GitLabApiException {
Response response = get(javax.ws.rs.core.Response.Status.OK, getPageQueryParams(page, perPage), "applications");
return (response.readEntity(new GenericType<List<Application>>() {}));
}
/**
* Get a Pager of all OAUTH applications.
*
* @param itemsPerPage the number of items per page
* @return a Pager of Application instances in the specified range
* @throws GitLabApiException if any exception occurs
*/
public Pager<Application> getApplications(int itemsPerPage) throws GitLabApiException {
return (new Pager<Application>(this, Application.class, itemsPerPage, null, "applications"));
}
/**
* Get a Stream of all OAUTH Application instances.
*
* @return a Stream of OAUTH Application instances
* @throws GitLabApiException if any exception occurs
*/
public Stream<Application> getApplicationsStream() throws GitLabApiException {
return (getApplications(getDefaultPerPage()).stream());
}
/**
* Create an OAUTH Application.
*
* @param name the name for the OAUTH Application
* @param redirectUri the redirect URI for the OAUTH Application
* @param scopes the scopes of the application (api, read_user, sudo, read_repository, openid, profile, email)
* @return the created Application instance
* @throws GitLabApiException if any exception occurs
*/
public Application createApplication(String name, String redirectUri, List<ApplicationScope> scopes) throws GitLabApiException {
if (scopes == null || scopes.isEmpty()) {
throw new GitLabApiException("scopes cannot be null or empty");
}
String scopesString = scopes.stream().map(ApplicationScope::toString).collect(Collectors.joining(","));
GitLabApiForm formData = new GitLabApiForm()
.withParam("name", name, true)
.withParam("redirect_uri", redirectUri, true)
.withParam("scopes", scopesString, true);
Response response = post(Response.Status.CREATED, formData, "applications");
return (response.readEntity(Application.class));
}
/**
* Delete the specified OAUTH Application.
*
* @param applicationId the ID of the OUAUTH Application to delete
* @throws GitLabApiException if any exception occurs
*/
public void deleteApplication(Integer applicationId) throws GitLabApiException {
delete(Response.Status.NO_CONTENT, null, "applications", applicationId);
}
}
package org.gitlab4j.api.models;
public class Application {
private Integer id;
private String applicationId;
private String applicationName;
private String callbackUrl;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getApplicationId() {
return applicationId;
}
public void setApplicationId(String applicationId) {
this.applicationId = applicationId;
}
public String getApplicationName() {
return applicationName;
}
public void setApplicationName(String applicationName) {
this.applicationName = applicationName;
}
public String getCallbackUrl() {
return callbackUrl;
}
public void setCallbackUrl(String callbackUrl) {
this.callbackUrl = callbackUrl;
}
}
/*
* The MIT License (MIT)
*
* Copyright (c) 2017 Greg Messner <greg@messners.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package org.gitlab4j.api;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeNotNull;
import java.util.Arrays;
import java.util.List;
import org.gitlab4j.api.Constants.ApplicationScope;
import org.gitlab4j.api.models.Application;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.experimental.categories.Category;
/**
* In order for these tests to run you must set the following properties in test-gitlab4j.properties
* <p>
* TEST_HOST_URL
* TEST_PRIVATE_TOKEN
* <p>
* If any of the above are NULL, all tests in this class will be skipped.
*/
@Category(IntegrationTest.class)
public class TestApplications extends AbstractIntegrationTest {
private static final String TEST_APPLICATION_NAME = "Test Application for GitLab4J-API";
private static final String TEST_APPLICATION_REDIRECT = "http://example.com/application";
private static final List<ApplicationScope> TEST_APPLICATION_SCOPES =
Arrays.asList(ApplicationScope.SUDO, ApplicationScope.EMAIL);
private static GitLabApi gitLabApi;
public TestApplications() {
super();
}
@BeforeClass
public static void setup() {
// Must setup the connection to the GitLab test server
gitLabApi = baseTestSetup();
if (gitLabApi != null) {
try {
List<Application> apps = gitLabApi.getApplicationsApi().getApplications();
for (Application app : apps) {
if (TEST_APPLICATION_NAME.equals(app.getApplicationName())) {
gitLabApi.getApplicationsApi().deleteApplication(app.getId());
}
}
} catch (Exception ignore) {}
}
}
@AfterClass
public static void teardown() throws GitLabApiException {
}
@Before
public void beforeMethod() {
assumeNotNull(gitLabApi);
}
@Test
public void testGetApplications() throws GitLabApiException {
List<Application> apps = gitLabApi.getApplicationsApi().getApplications();
assertNotNull(apps);
}
@Test
public void testAddAndDeleteApplication() throws GitLabApiException {
List<Application> apps = gitLabApi.getApplicationsApi().getApplications();
int appCount = apps.size();
Application app = gitLabApi.getApplicationsApi().createApplication(TEST_APPLICATION_NAME, TEST_APPLICATION_REDIRECT, TEST_APPLICATION_SCOPES);
assertNotNull(app);
apps = gitLabApi.getApplicationsApi().getApplications();
assertTrue(apps.size() == appCount + 1);
Application found = apps.stream().filter(a -> TEST_APPLICATION_NAME.equals(a.getApplicationName())).findAny().orElse(null);
assertNotNull(found);
gitLabApi.getApplicationsApi().deleteApplication(app.getId());
apps = gitLabApi.getApplicationsApi().getApplications();
assertTrue(apps.size() == appCount);
found = apps.stream().filter(a -> TEST_APPLICATION_NAME.equals(a.getApplicationName())).findAny().orElse(null);
assertNull(found);
}
}
[
{
"id": 1,
"application_id": "5832fc6e14300a0d962240a8144466eef4ee93ef0d218477e55f11cf12fc3737",
"application_name": "MyApplication",
"callback_url": "http://redirect.uri"
}
]
\ No newline at end of file
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment