diff --git a/src/main/java/org/gitlab4j/api/ApplicationsApi.java b/src/main/java/org/gitlab4j/api/ApplicationsApi.java new file mode 100644 index 0000000000000000000000000000000000000000..80cbc0997a8913ed33148bee69d9f7df3da58e41 --- /dev/null +++ b/src/main/java/org/gitlab4j/api/ApplicationsApi.java @@ -0,0 +1,99 @@ +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 Applications API at GitLab 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 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 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>() {})); + } + + /** + * 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 getApplications(int itemsPerPage) throws GitLabApiException { + return (new Pager(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 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 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); + } +} diff --git a/src/main/java/org/gitlab4j/api/models/Application.java b/src/main/java/org/gitlab4j/api/models/Application.java new file mode 100644 index 0000000000000000000000000000000000000000..789c649d6f632dadf5bf11628aadf798ec38711b --- /dev/null +++ b/src/main/java/org/gitlab4j/api/models/Application.java @@ -0,0 +1,41 @@ +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; + } +} diff --git a/src/test/java/org/gitlab4j/api/TestApplications.java b/src/test/java/org/gitlab4j/api/TestApplications.java new file mode 100644 index 0000000000000000000000000000000000000000..8a0ca9c1c101f92dcb114b052e4f64cc8c97fb1d --- /dev/null +++ b/src/test/java/org/gitlab4j/api/TestApplications.java @@ -0,0 +1,117 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2017 Greg Messner + * + * 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 + *

+ * TEST_HOST_URL + * TEST_PRIVATE_TOKEN + *

+ * 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 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 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 apps = gitLabApi.getApplicationsApi().getApplications(); + assertNotNull(apps); + } + + @Test + public void testAddAndDeleteApplication() throws GitLabApiException { + + List 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); + } +} diff --git a/src/test/resources/org/gitlab4j/api/applications.json b/src/test/resources/org/gitlab4j/api/applications.json new file mode 100644 index 0000000000000000000000000000000000000000..8753bc25402e57365d874d065ef1ba9fb849a339 --- /dev/null +++ b/src/test/resources/org/gitlab4j/api/applications.json @@ -0,0 +1,8 @@ +[ + { + "id": 1, + "application_id": "5832fc6e14300a0d962240a8144466eef4ee93ef0d218477e55f11cf12fc3737", + "application_name": "MyApplication", + "callback_url": "http://redirect.uri" + } +] \ No newline at end of file