diff --git a/src/main/java/org/gitlab4j/api/UserApi.java b/src/main/java/org/gitlab4j/api/UserApi.java index ce52527c89071f6f486c9b67a4542acc859a65d6..5d0bb99561763f79533b61eb1b71cce30c5239ff 100644 --- a/src/main/java/org/gitlab4j/api/UserApi.java +++ b/src/main/java/org/gitlab4j/api/UserApi.java @@ -904,21 +904,7 @@ public class UserApi extends AbstractApi { * @throws GitLabApiException if any exception occurs */ public ImpersonationToken createImpersonationToken(Object userIdOrUsername, String name, Date expiresAt, Scope[] scopes) throws GitLabApiException { - - if (scopes == null || scopes.length == 0) { - throw new RuntimeException("scopes cannot be null or empty"); - } - - GitLabApiForm formData = new GitLabApiForm() - .withParam("name", name, true) - .withParam("expires_at", expiresAt); - - for (Scope scope : scopes) { - formData.withParam("scopes[]", scope.toString()); - } - - Response response = post(Response.Status.CREATED, formData, "users", getUserIdOrUsername(userIdOrUsername), "impersonation_tokens"); - return (response.readEntity(ImpersonationToken.class)); + return createPersonalAccessTokenOrImpersonationToken(userIdOrUsername, name, expiresAt, scopes, true); } /** @@ -940,6 +926,43 @@ public class UserApi extends AbstractApi { delete(expectedStatus, null, "users", getUserIdOrUsername(userIdOrUsername), "impersonation_tokens", tokenId); } + /** + * Create a personal access token. Available only for admin users. + * + *
GitLab Endpoint: POST /users/:user_id/personal_access_tokens
+ *
+ * @param userIdOrUsername the user in the form of an Integer(ID), String(username), or User instance
+ * @param name the name of the personal access token, required
+ * @param expiresAt the expiration date of the personal access token, optional
+ * @param scopes an array of scopes of the personal access token
+ * @return the created PersonalAccessToken instance
+ * @throws GitLabApiException if any exception occurs
+ */
+ public ImpersonationToken createPersonalAccessToken(Object userIdOrUsername, String name, Date expiresAt, Scope[] scopes) throws GitLabApiException {
+ return createPersonalAccessTokenOrImpersonationToken(userIdOrUsername, name, expiresAt, scopes, false);
+ }
+
+ // as per https://docs.gitlab.com/ee/api/README.html#impersonation-tokens, impersonation tokens are a type of
+ // personal access token
+ private ImpersonationToken createPersonalAccessTokenOrImpersonationToken(Object userIdOrUsername, String name, Date expiresAt, Scope[] scopes, boolean impersonation) throws GitLabApiException {
+
+ if (scopes == null || scopes.length == 0) {
+ throw new RuntimeException("scopes cannot be null or empty");
+ }
+
+ GitLabApiForm formData = new GitLabApiForm()
+ .withParam("name", name, true)
+ .withParam("expires_at", expiresAt);
+
+ for (Scope scope : scopes) {
+ formData.withParam("scopes[]", scope.toString());
+ }
+
+ String tokenTypePathArg = impersonation ? "impersonation_tokens" : "personal_access_tokens";
+ Response response = post(Response.Status.CREATED, formData, "users", getUserIdOrUsername(userIdOrUsername), tokenTypePathArg);
+ return (response.readEntity(ImpersonationToken.class));
+ }
+
/**
* Populate the REST form with data from the User instance.
*
diff --git a/src/main/java/org/gitlab4j/api/models/ImpersonationToken.java b/src/main/java/org/gitlab4j/api/models/ImpersonationToken.java
index 60b35ebb3997049c22a74df3043736766c07bcad..6c8a005de536f7feb249681958b9ab2ecb04ae47 100644
--- a/src/main/java/org/gitlab4j/api/models/ImpersonationToken.java
+++ b/src/main/java/org/gitlab4j/api/models/ImpersonationToken.java
@@ -14,7 +14,7 @@ public class ImpersonationToken {
/** Enum to specify the scope of an ImpersonationToken. */
public enum Scope {
- API, READ_USER, READ_REPOSITORY, WRITE_REPOSITORY, READ_REGISTRY, SUDO;
+ API, READ_API, READ_USER, READ_REPOSITORY, WRITE_REPOSITORY, READ_REGISTRY, WRITE_REGISTRY, SUDO;
private static JacksonJsonEnumHelper