|
|
@@ -0,0 +1,79 @@
|
|
|
+package com.nju.edu.gitlab.service.impl;
|
|
|
+
|
|
|
+import com.nju.edu.gitlab.service.api.UserService;
|
|
|
+import com.nju.edu.gitlab.service.vo.GitlabUser;
|
|
|
+import com.nju.edu.gitlab.util.Tools;
|
|
|
+import com.nju.edu.gitlab.web.dto.ChangePasswordDTO;
|
|
|
+import com.nju.edu.gitlab.web.dto.GitlabUserDTO;
|
|
|
+import org.gitlab4j.api.GitLabApi;
|
|
|
+import org.gitlab4j.api.GitLabApiException;
|
|
|
+import org.gitlab4j.api.models.*;
|
|
|
+import org.gitlab4j.api.models.ImpersonationToken.Scope;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+
|
|
|
+@Component
|
|
|
+public class UserServiceImpl implements UserService {
|
|
|
+ private final GitLabApi gitlabApi;
|
|
|
+
|
|
|
+ @Value("${gitlab.host}")
|
|
|
+ private String gitlabHost;
|
|
|
+ @Value("${gitlab.token}")
|
|
|
+ private String token;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ public UserServiceImpl() {
|
|
|
+ this.gitlabApi = new GitLabApi(gitlabHost,token);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public synchronized GitlabUser createGitlabUser(GitlabUserDTO gitlabUserDTO) throws GitLabApiException {
|
|
|
+ String username=gitlabUserDTO.getUsername();
|
|
|
+ String password=gitlabUserDTO.getPassword();
|
|
|
+ String email= gitlabUserDTO.getEmail();
|
|
|
+ User user=new User();
|
|
|
+ user.setName(username);
|
|
|
+ user.setUsername(username);
|
|
|
+ user.setEmail(email);
|
|
|
+ user.setSkipConfirmation(true);
|
|
|
+ user=gitlabApi.getUserApi().createUser(user,password,1000);
|
|
|
+ GitlabUser gitlabUser=new GitlabUser();
|
|
|
+ gitlabUser.setUserId(user.getId());
|
|
|
+ gitlabUser.setNamespaceId(fetchNameSpaceId(username));
|
|
|
+ gitlabUser.setToken(createToken(user.getId()));
|
|
|
+ return gitlabUser;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public synchronized boolean changePassword(ChangePasswordDTO changePasswordDTO) throws GitLabApiException {
|
|
|
+ int userId=changePasswordDTO.getUserId();
|
|
|
+ String password=changePasswordDTO.getPassword();
|
|
|
+ User user=gitlabApi.getUserApi().getUser(userId);
|
|
|
+ gitlabApi.getUserApi().modifyUser(user,password,user.getProjectsLimit());
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public synchronized boolean deleteUser(int userId) throws GitLabApiException {
|
|
|
+ gitlabApi.getUserApi().deleteUser(userId);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ private String createToken(int userId) throws GitLabApiException {
|
|
|
+ Scope[] scopes = new Scope[]{Scope.API};
|
|
|
+ ImpersonationToken token;
|
|
|
+ token = gitlabApi.getUserApi().createImpersonationToken(userId, "AES-" + Tools.randomUUID(), null, scopes);
|
|
|
+ return token.getToken();
|
|
|
+ }
|
|
|
+
|
|
|
+ private Integer fetchNameSpaceId(String username) throws GitLabApiException {
|
|
|
+ Namespace namespace;
|
|
|
+ namespace = gitlabApi.getNamespaceApi().findNamespaces(username)
|
|
|
+ .stream()
|
|
|
+ .filter(ns -> "user".equals(ns.getKind()))
|
|
|
+ .reduce((ns1, ns2) -> ns1.getId() > ns2.getId() ? ns1 : ns2)
|
|
|
+ .orElse(null);
|
|
|
+ return namespace != null ? namespace.getId() : null;
|
|
|
+ }
|
|
|
+}
|