Procházet zdrojové kódy

feat: 创建gitlab user

370774330@qq.com před 5 roky
rodič
revize
f0b6d0647c

+ 11 - 0
web/src/main/java/seecoder/devcloud/web/controller/user/UserController.java

@@ -1,10 +1,13 @@
 package seecoder.devcloud.web.controller.user;
 
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+import seecoder.devcloud.common.exceptions.ServiceException;
 import seecoder.devcloud.web.model.vo.Response;
+import seecoder.devcloud.web.model.vo.user.GitlabUserCreateVO;
 import seecoder.devcloud.web.model.vo.user.UserVO;
 import seecoder.devcloud.web.service.user.UserService;
 
@@ -25,6 +28,14 @@ public class UserController {
         this.userService = userService;
     }
 
+    @ApiOperation(value = "创建gitlab用户", httpMethod = "POST")
+    @PostMapping("/gitlab")
+    @ApiImplicitParam(value = "vo",dataType = "object", paramType = "body")
+    public Response createGitlabUser(@RequestBody GitlabUserCreateVO vo) throws ServiceException {
+        userService.createGitlabUser(vo);
+        return Response.buildSuccess();
+    }
+
     @ApiOperation(value = "获取当前登陆的用户信息", httpMethod = "GET")
     @GetMapping("/self")
     public Response<UserVO> getLoginUser(){

+ 26 - 0
web/src/main/java/seecoder/devcloud/web/dao/user/UserMapper.java

@@ -0,0 +1,26 @@
+package seecoder.devcloud.web.dao.user;
+
+import org.apache.ibatis.annotations.InsertProvider;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.UpdateProvider;
+import seecoder.devcloud.web.dao.provider.GeneralInsertUpdateSqlProvider;
+import seecoder.devcloud.web.model.po.user.UserPO;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/3/21
+ * @description:
+ */
+@Mapper
+public interface UserMapper {
+
+    @InsertProvider(type = GeneralInsertUpdateSqlProvider.class, method = "insert")
+    int insert(UserPO userPO, String... ignoredCols);
+
+    @UpdateProvider(type= GeneralInsertUpdateSqlProvider.class, method="updateById")
+    int updateUser(UserPO userPO);
+
+    @Select("select * from user where id = #{id}")
+    UserPO select(Integer id);
+}

+ 6 - 0
web/src/main/java/seecoder/devcloud/web/model/po/user/UserPO.java

@@ -29,6 +29,12 @@ public class UserPO implements UserDetails {
 
 	private UserIdentity role;
 
+	/**
+	 * 是否关联了gitlab账户
+	 */
+	@Builder.Default
+	private boolean withGitlab = false;
+
 	@Override
 	public Collection<? extends GrantedAuthority> getAuthorities() {
 		return Collections.singleton(WebSecurityConstants.getAuthority(role));

+ 22 - 0
web/src/main/java/seecoder/devcloud/web/model/vo/user/GitlabUserCreateVO.java

@@ -0,0 +1,22 @@
+package seecoder.devcloud.web.model.vo.user;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/3/21
+ * @description:
+ */
+@Data
+@ApiModel("创建gitlab用户")
+public class GitlabUserCreateVO {
+
+    @ApiModelProperty("用户名")
+    private String username;
+    @ApiModelProperty("密码")
+    private String password;
+    @ApiModelProperty("邮件")
+    private String email;
+}

+ 2 - 0
web/src/main/java/seecoder/devcloud/web/model/vo/user/UserVO.java

@@ -24,6 +24,8 @@ public class UserVO {
     private String email;
     @ApiModelProperty("角色")
     private UserIdentity role;
+    @ApiModelProperty("是否有对应gitlab账户了, true代表有")
+    private boolean withGitlab;
 
     public UserVO(UserPO userPO) {
         BeanUtils.copyProperties(userPO,this);

+ 38 - 3
web/src/main/java/seecoder/devcloud/web/service/impl/user/UserServiceImpl.java

@@ -1,14 +1,18 @@
 package seecoder.devcloud.web.service.impl.user;
 
 
+import com.nju.edu.gitlab.SeecoderGitlabApi;
+import com.nju.edu.gitlab.SeecoderGitlabException;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.security.core.userdetails.UsernameNotFoundException;
 import org.springframework.stereotype.Service;
-
+import seecoder.devcloud.common.exceptions.ServiceException;
+import seecoder.devcloud.web.dao.user.UserMapper;
 import seecoder.devcloud.web.model.po.user.UserPO;
+import seecoder.devcloud.web.model.vo.user.GitlabUserCreateVO;
 import seecoder.devcloud.web.model.vo.user.UserVO;
 import seecoder.devcloud.web.service.user.UserService;
 
@@ -16,9 +20,40 @@ import seecoder.devcloud.web.service.user.UserService;
 @Slf4j
 public class UserServiceImpl implements UserService, UserDetailsService {
 
+	private final UserMapper userMapper;
+
+	private final SeecoderGitlabApi seecoderGitlabApi;
+
+	@Autowired
+	public UserServiceImpl(UserMapper userMapper, SeecoderGitlabApi seecoderGitlabApi) {
+		this.userMapper = userMapper;
+		this.seecoderGitlabApi = seecoderGitlabApi;
+	}
+
+	@Override
+	public UserVO createGitlabUser(GitlabUserCreateVO vo) throws ServiceException {
+		try {
+			seecoderGitlabApi.createGitlabUser(vo.getUsername(),vo.getPassword(),vo.getEmail());
+		} catch (SeecoderGitlabException e) {
+			throw new ServiceException("创建gitlab用户失败",e);
+		}
+		UserPO loginUser = UserService.loginUser();
+		loginUser.setWithGitlab(true);
+		userMapper.updateUser(loginUser);
+		return new UserVO(loginUser);
+	}
+
 	@Override
 	public UserVO getLoginUser(){
-		UserPO loginUser = (UserPO) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+		//注意登陆用户没有同步withGitlab字段
+		UserPO loginUser = UserService.loginUser();
+		//todo 查gitlab账户存在吗
+		UserPO userPO = userMapper.select(loginUser.getId());
+		if (null == userPO){
+			userMapper.insert(loginUser);
+		} else if (!userPO.equals(loginUser)){
+			userMapper.updateUser(loginUser);
+		}
 		return new UserVO(loginUser);
 	}
 

+ 5 - 0
web/src/main/java/seecoder/devcloud/web/service/user/UserService.java

@@ -2,11 +2,16 @@ package seecoder.devcloud.web.service.user;
 
 
 import org.springframework.security.core.context.SecurityContextHolder;
+import seecoder.devcloud.common.exceptions.ServiceException;
 import seecoder.devcloud.web.model.po.user.UserPO;
+import seecoder.devcloud.web.model.vo.user.GitlabUserCreateVO;
 import seecoder.devcloud.web.model.vo.user.UserVO;
 
 public interface UserService {
 
+    UserVO createGitlabUser(GitlabUserCreateVO vo) throws ServiceException;
+
+
     UserVO getLoginUser();
 
     /**