SeecoderGitlabClient.java 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505
  1. package com.nju.edu.gitlab;
  2. import com.fasterxml.jackson.core.JsonProcessingException;
  3. import com.fasterxml.jackson.databind.JsonNode;
  4. import com.fasterxml.jackson.databind.ObjectMapper;
  5. import com.nju.edu.gitlab.dto.*;
  6. import com.nju.edu.gitlab.dto.commit.CommitActionForm;
  7. import com.nju.edu.gitlab.dto.commit.CommitDTO;
  8. import com.nju.edu.gitlab.dto.member.AccessLevelForm;
  9. import com.nju.edu.gitlab.dto.member.GroupMemberDTO;
  10. import com.nju.edu.gitlab.dto.project.ProjectDTO;
  11. import com.nju.edu.gitlab.dto.project.VisibilityForm;
  12. import com.nju.edu.gitlab.vo.BranchVO;
  13. import com.nju.edu.gitlab.vo.DiffVO;
  14. import com.nju.edu.gitlab.vo.GitlabGroup;
  15. import com.nju.edu.gitlab.vo.GitlabUser;
  16. import com.nju.edu.gitlab.vo.commit.CommitVO;
  17. import com.sun.org.slf4j.internal.Logger;
  18. import com.sun.org.slf4j.internal.LoggerFactory;
  19. import okhttp3.*;
  20. import org.gitlab4j.api.models.AccessLevel;
  21. import org.gitlab4j.api.models.CommitAction;
  22. import org.gitlab4j.api.models.Visibility;
  23. import java.io.IOException;
  24. import java.util.ArrayList;
  25. import java.util.HashSet;
  26. import java.util.List;
  27. import java.util.Set;
  28. import java.util.concurrent.TimeUnit;
  29. import java.util.stream.Collectors;
  30. import static com.nju.edu.gitlab.SeecoderGitlabException.BIZ_ERROR_CODE;
  31. public class SeecoderGitlabClient implements SeecoderGitlabApi{
  32. private final Logger logger = LoggerFactory.getLogger(getClass());
  33. private OkHttpClient client;
  34. private String host;
  35. private String token;
  36. public SeecoderGitlabClient(String host,String token){
  37. this.token=token;
  38. this.host=host;
  39. this.client=new OkHttpClient.Builder()
  40. .connectTimeout(60, TimeUnit.SECONDS)
  41. .writeTimeout(60,TimeUnit.SECONDS)
  42. .retryOnConnectionFailure(true)
  43. .build();
  44. }
  45. private <T> T processResponse(ObjectMapper objectMapper, Response response, Class<T> clazz) throws SeecoderGitlabException {
  46. try {
  47. validateResponseStatus(response);
  48. String body = response.body().string();
  49. JsonNode node = objectMapper.readTree(body);
  50. Integer code = Integer.parseInt(node.get("code").asText());
  51. String msg = node.get("msg").asText();
  52. if (code != 0) {
  53. throw new SeecoderGitlabException(BIZ_ERROR_CODE, msg);
  54. }
  55. if (clazz == null) {
  56. return null;
  57. }
  58. if (node.get("result")!=null)
  59. return objectMapper.treeToValue(node.get("result"), clazz);
  60. else
  61. throw SeecoderGitlabException.NOT_FOUND_ERROR;
  62. } catch (IOException e) {
  63. logger.error("IOException", e);
  64. throw SeecoderGitlabException.IO_ERROR;
  65. }
  66. }
  67. private void validateResponseStatus(Response response) throws SeecoderGitlabException {
  68. if (response.code() == 403) {
  69. throw SeecoderGitlabException.UNAHTORIZATION_ERROR;
  70. } else if (response.code() == 500) {
  71. throw SeecoderGitlabException.INTERNAL_SERVER_ERROR;
  72. } else if (response.code() != 200) {
  73. throw SeecoderGitlabException.UNKNOWN_ERROR;
  74. }
  75. }
  76. @Override
  77. public GitlabUser createGitlabUser(String username, String password, String email) throws SeecoderGitlabException {
  78. try {
  79. ObjectMapper objectMapper = new ObjectMapper();
  80. Request.Builder builder = new Request.Builder()
  81. .addHeader("Authorization", token);
  82. GitlabUserDTO gitlabUserDTO=GitlabUserDTO.builder()
  83. .email(email)
  84. .password(password)
  85. .username(username)
  86. .build();
  87. builder = builder
  88. .url(host + "/api/user")
  89. .post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), objectMapper.writeValueAsString(gitlabUserDTO)));
  90. Request request = builder.build();
  91. final Call call = client.newCall(request);
  92. Response response = call.execute();
  93. GitlabUser gitlabUser = processResponse(objectMapper, response, GitlabUser.class);
  94. return gitlabUser;
  95. } catch (JsonProcessingException e) {
  96. logger.error("JSON writeValueAsString error", e);
  97. throw SeecoderGitlabException.JSON_ERROR;
  98. } catch (IOException e) {
  99. logger.error("IOException", e);
  100. throw SeecoderGitlabException.IO_ERROR;
  101. }
  102. }
  103. @Override
  104. public boolean changePassword(int userId, String password) throws SeecoderGitlabException {
  105. try {
  106. ObjectMapper objectMapper = new ObjectMapper();
  107. Request.Builder builder = new Request.Builder()
  108. .addHeader("Authorization", token);
  109. ChangePasswordDTO changePasswordDTO=ChangePasswordDTO.builder()
  110. .password(password)
  111. .userId(userId)
  112. .build();
  113. builder = builder
  114. .url(host + "/api/user/changePassword")
  115. .post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), objectMapper.writeValueAsString(changePasswordDTO)));
  116. Request request = builder.build();
  117. final Call call = client.newCall(request);
  118. Response response = call.execute();
  119. boolean isChanged = processResponse(objectMapper, response, boolean.class);
  120. return isChanged;
  121. } catch (JsonProcessingException e) {
  122. logger.error("JSON writeValueAsString error", e);
  123. throw SeecoderGitlabException.JSON_ERROR;
  124. } catch (IOException e) {
  125. logger.error("IOException", e);
  126. throw SeecoderGitlabException.IO_ERROR;
  127. }
  128. }
  129. @Override
  130. public boolean deleteUser(int userId) throws SeecoderGitlabException {
  131. try {
  132. ObjectMapper objectMapper = new ObjectMapper();
  133. Request.Builder builder = new Request.Builder()
  134. .addHeader("Authorization", token);
  135. builder = builder
  136. .url(host + "/api/user/"+userId)
  137. .delete();
  138. Request request = builder.build();
  139. final Call call = client.newCall(request);
  140. Response response = call.execute();
  141. boolean isDeleted = processResponse(objectMapper, response, boolean.class);
  142. return isDeleted;
  143. } catch (JsonProcessingException e) {
  144. logger.error("JSON writeValueAsString error", e);
  145. throw SeecoderGitlabException.JSON_ERROR;
  146. } catch (IOException e) {
  147. logger.error("IOException", e);
  148. throw SeecoderGitlabException.IO_ERROR;
  149. }
  150. }
  151. @Override
  152. public GitlabGroup createGroup(String groupName) throws SeecoderGitlabException {
  153. try {
  154. ObjectMapper objectMapper = new ObjectMapper();
  155. Request.Builder builder = new Request.Builder()
  156. .addHeader("Authorization", token);
  157. builder = builder
  158. .url(host + "/api/user")
  159. .post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), groupName));
  160. Request request = builder.build();
  161. final Call call = client.newCall(request);
  162. Response response = call.execute();
  163. GitlabGroup gitlabGroup = processResponse(objectMapper, response, GitlabGroup.class);
  164. return gitlabGroup;
  165. } catch (JsonProcessingException e) {
  166. logger.error("JSON writeValueAsString error", e);
  167. throw SeecoderGitlabException.JSON_ERROR;
  168. } catch (IOException e) {
  169. logger.error("IOException", e);
  170. throw SeecoderGitlabException.IO_ERROR;
  171. }
  172. }
  173. @Override
  174. public boolean addMember(int groupId, int userId, AccessLevelForm accessLevelForm) throws SeecoderGitlabException {
  175. try {
  176. ObjectMapper objectMapper = new ObjectMapper();
  177. Request.Builder builder = new Request.Builder()
  178. .addHeader("Authorization", token);
  179. AccessLevel accessLevel=AccessLevel.forValue(accessLevelForm.value);
  180. GroupMemberDTO groupMemberDTO=GroupMemberDTO.builder()
  181. .accessLevel(accessLevel)
  182. .userId(userId)
  183. .groupId(groupId)
  184. .build();
  185. builder = builder
  186. .url(host + "/api/group/addMember")
  187. .post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), objectMapper.writeValueAsString(groupMemberDTO)));
  188. Request request = builder.build();
  189. final Call call = client.newCall(request);
  190. Response response = call.execute();
  191. boolean isAdded = processResponse(objectMapper, response, boolean.class);
  192. return isAdded;
  193. } catch (JsonProcessingException e) {
  194. logger.error("JSON writeValueAsString error", e);
  195. throw SeecoderGitlabException.JSON_ERROR;
  196. } catch (IOException e) {
  197. logger.error("IOException", e);
  198. throw SeecoderGitlabException.IO_ERROR;
  199. }
  200. }
  201. @Override
  202. public Integer createProject(String projectName, VisibilityForm visibilityForm) throws SeecoderGitlabException {
  203. try {
  204. ObjectMapper objectMapper = new ObjectMapper();
  205. Request.Builder builder = new Request.Builder()
  206. .addHeader("Authorization", token);
  207. Visibility visibility=Visibility.forValue(visibilityForm.toString());
  208. ProjectDTO projectDTO= ProjectDTO.builder()
  209. .projectName(projectName)
  210. .visibility(visibility)
  211. .build();
  212. builder = builder
  213. .url(host + "/api/project")
  214. .post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), objectMapper.writeValueAsString(projectDTO)));
  215. Request request = builder.build();
  216. final Call call = client.newCall(request);
  217. Response response = call.execute();
  218. return processResponse(objectMapper, response, Integer.class);
  219. } catch (JsonProcessingException e) {
  220. logger.error("JSON writeValueAsString error", e);
  221. throw SeecoderGitlabException.JSON_ERROR;
  222. } catch (IOException e) {
  223. logger.error("IOException", e);
  224. throw SeecoderGitlabException.IO_ERROR;
  225. }
  226. }
  227. @Override
  228. public Integer forkProject(int projectId, int userId) throws SeecoderGitlabException {
  229. try {
  230. ObjectMapper objectMapper = new ObjectMapper();
  231. Request.Builder builder = new Request.Builder()
  232. .addHeader("Authorization", token);
  233. UserForkDTO userForkDTO= UserForkDTO.builder()
  234. .projectId(projectId)
  235. .userId(userId)
  236. .build();
  237. builder = builder
  238. .url(host + "/api/project/userFork")
  239. .post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), objectMapper.writeValueAsString(userForkDTO)));
  240. Request request = builder.build();
  241. final Call call = client.newCall(request);
  242. Response response = call.execute();
  243. projectId = processResponse(objectMapper, response, Integer.class);
  244. return projectId;
  245. } catch (JsonProcessingException e) {
  246. logger.error("JSON writeValueAsString error", e);
  247. throw SeecoderGitlabException.JSON_ERROR;
  248. } catch (IOException e) {
  249. logger.error("IOException", e);
  250. throw SeecoderGitlabException.IO_ERROR;
  251. }
  252. }
  253. @Override
  254. public Integer forkGroupProject(int projectId, int groupId) throws SeecoderGitlabException {
  255. try {
  256. ObjectMapper objectMapper = new ObjectMapper();
  257. Request.Builder builder = new Request.Builder()
  258. .addHeader("Authorization", token);
  259. GroupForkDTO groupForkDTO= GroupForkDTO.builder()
  260. .projectId(projectId)
  261. .groupId(groupId)
  262. .build();
  263. builder = builder
  264. .url(host + "/api/project/groupFork")
  265. .post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), objectMapper.writeValueAsString(groupForkDTO)));
  266. Request request = builder.build();
  267. final Call call = client.newCall(request);
  268. Response response = call.execute();
  269. projectId = processResponse(objectMapper, response, Integer.class);
  270. return projectId;
  271. } catch (JsonProcessingException e) {
  272. logger.error("JSON writeValueAsString error", e);
  273. throw SeecoderGitlabException.JSON_ERROR;
  274. } catch (IOException e) {
  275. logger.error("IOException", e);
  276. throw SeecoderGitlabException.IO_ERROR;
  277. }
  278. }
  279. @Override
  280. public Set<DiffVO> compare(int projectId, String fromBash, String toBash) throws SeecoderGitlabException {
  281. try {
  282. ObjectMapper objectMapper = new ObjectMapper();
  283. Request.Builder builder = new Request.Builder()
  284. .addHeader("Authorization", token);
  285. builder = builder
  286. .url(host + "/api/project/compare?projectId="+projectId+"&fromBash="+fromBash+"&toBash="+toBash)
  287. .get();
  288. Request request = builder.build();
  289. final Call call = client.newCall(request);
  290. Response response = call.execute();
  291. Set<DiffVO> diffVOSet= new HashSet<>();
  292. diffVOSet=processResponse(objectMapper, response, diffVOSet.getClass());
  293. return diffVOSet;
  294. } catch (JsonProcessingException e) {
  295. logger.error("JSON writeValueAsString error", e);
  296. throw SeecoderGitlabException.JSON_ERROR;
  297. } catch (IOException e) {
  298. logger.error("IOException", e);
  299. throw SeecoderGitlabException.IO_ERROR;
  300. }
  301. }
  302. @Override
  303. public boolean addWebHook(int projectId, String url, boolean doPushEvents, boolean doIssueEvents, boolean doMergeRequestsEvents) throws SeecoderGitlabException {
  304. try {
  305. ObjectMapper objectMapper = new ObjectMapper();
  306. Request.Builder builder = new Request.Builder()
  307. .addHeader("Authorization", token);
  308. WebHookDTO webHookDTO= WebHookDTO.builder()
  309. .projectId(projectId)
  310. .url(url)
  311. .doIssueEvents(doIssueEvents)
  312. .doPushEvents(doPushEvents)
  313. .doMergeRequestsEvents(doMergeRequestsEvents)
  314. .build();
  315. builder = builder
  316. .url(host + "/api/project/webhook")
  317. .post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), objectMapper.writeValueAsString(webHookDTO)));
  318. Request request = builder.build();
  319. final Call call = client.newCall(request);
  320. Response response = call.execute();
  321. return processResponse(objectMapper, response, boolean.class);
  322. } catch (JsonProcessingException e) {
  323. logger.error("JSON writeValueAsString error", e);
  324. throw SeecoderGitlabException.JSON_ERROR;
  325. } catch (IOException e) {
  326. logger.error("IOException", e);
  327. throw SeecoderGitlabException.IO_ERROR;
  328. }
  329. }
  330. @Override
  331. public boolean archiveProject(int projectId) throws SeecoderGitlabException {
  332. try {
  333. ObjectMapper objectMapper = new ObjectMapper();
  334. Request.Builder builder = new Request.Builder()
  335. .addHeader("Authorization", token);
  336. builder = builder
  337. .url(host + "/api/project/archive")
  338. .post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), objectMapper.writeValueAsString(projectId)));
  339. Request request = builder.build();
  340. final Call call = client.newCall(request);
  341. Response response = call.execute();
  342. return processResponse(objectMapper, response, boolean.class);
  343. } catch (JsonProcessingException e) {
  344. logger.error("JSON writeValueAsString error", e);
  345. throw SeecoderGitlabException.JSON_ERROR;
  346. } catch (IOException e) {
  347. logger.error("IOException", e);
  348. throw SeecoderGitlabException.IO_ERROR;
  349. }
  350. }
  351. @Override
  352. public String getProjectFile(int projectId, String branch, String path) throws SeecoderGitlabException {
  353. try {
  354. ObjectMapper objectMapper = new ObjectMapper();
  355. Request.Builder builder = new Request.Builder()
  356. .addHeader("Authorization", token);
  357. ProjectFileDTO projectFileDTO=ProjectFileDTO.builder()
  358. .path(path)
  359. .branch(branch)
  360. .build();
  361. builder = builder
  362. .url(host + "/api/project/"+projectId+"/getFile")
  363. .post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), objectMapper.writeValueAsString(projectFileDTO)));
  364. Request request = builder.build();
  365. final Call call = client.newCall(request);
  366. Response response = call.execute();
  367. return processResponse(objectMapper, response, String.class);
  368. } catch (JsonProcessingException e) {
  369. logger.error("JSON writeValueAsString error", e);
  370. throw SeecoderGitlabException.JSON_ERROR;
  371. } catch (IOException e) {
  372. logger.error("IOException", e);
  373. throw SeecoderGitlabException.IO_ERROR;
  374. }
  375. }
  376. @Override
  377. public String getProjectRawFile(int projectId, String commitOrBranchName, String path) throws SeecoderGitlabException {
  378. try {
  379. ObjectMapper objectMapper = new ObjectMapper();
  380. Request.Builder builder = new Request.Builder()
  381. .addHeader("Authorization", token);
  382. ProjectRawFileDTO projectFileDTO=ProjectRawFileDTO.builder()
  383. .commitOrBranchName(commitOrBranchName)
  384. .path(path)
  385. .build();
  386. builder = builder
  387. .url(host + "/api/project/"+projectId+"/getRawFile")
  388. .post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), objectMapper.writeValueAsString(projectFileDTO)));
  389. Request request = builder.build();
  390. final Call call = client.newCall(request);
  391. Response response = call.execute();
  392. return processResponse(objectMapper, response, String.class);
  393. } catch (JsonProcessingException e) {
  394. logger.error("JSON writeValueAsString error", e);
  395. throw SeecoderGitlabException.JSON_ERROR;
  396. } catch (IOException e) {
  397. logger.error("IOException", e);
  398. throw SeecoderGitlabException.IO_ERROR;
  399. }
  400. }
  401. @Override
  402. public CommitVO createCommit(int projectId, String branch, String commitMessage, String email, String username, List<CommitActionForm> actions) throws SeecoderGitlabException {
  403. try {
  404. ObjectMapper objectMapper = new ObjectMapper();
  405. Request.Builder builder = new Request.Builder()
  406. .addHeader("Authorization", token);
  407. List<CommitAction> actionList=actions.stream().map(action-> new CommitAction()
  408. .withAction(CommitAction.Action.forValue(action.getAction().toString()))
  409. .withEncoding(CommitAction.Encoding.forValue(action.getEncoding().toString()))
  410. .withFilePath(action.getFilepath())
  411. .withContent(action.getContent())).collect(Collectors.toList());
  412. CommitDTO commitDTO=CommitDTO.builder()
  413. .branch(branch)
  414. .commitMessage(commitMessage)
  415. .email(email)
  416. .username(username)
  417. .actions(actionList)
  418. .build();
  419. builder = builder
  420. .url(host + "/api/project/"+projectId+"/commit")
  421. .post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), objectMapper.writeValueAsString(commitDTO)));
  422. Request request = builder.build();
  423. final Call call = client.newCall(request);
  424. Response response = call.execute();
  425. return processResponse(objectMapper, response, CommitVO.class);
  426. } catch (JsonProcessingException e) {
  427. logger.error("JSON writeValueAsString error", e);
  428. throw SeecoderGitlabException.JSON_ERROR;
  429. } catch (IOException e) {
  430. logger.error("IOException", e);
  431. throw SeecoderGitlabException.IO_ERROR;
  432. }
  433. }
  434. @Override
  435. public List<CommitVO> getAllCommitMessage(int projectId, String commitHash) throws SeecoderGitlabException {
  436. try {
  437. ObjectMapper objectMapper = new ObjectMapper();
  438. Request.Builder builder = new Request.Builder()
  439. .addHeader("Authorization", token);
  440. builder = builder
  441. .url(host + "/api/project/"+projectId+"/commit/"+commitHash)
  442. .get();
  443. Request request = builder.build();
  444. final Call call = client.newCall(request);
  445. Response response = call.execute();
  446. List<CommitVO> commitVOList=new ArrayList<>();
  447. commitVOList=processResponse(objectMapper, response, commitVOList.getClass());
  448. return commitVOList;
  449. } catch (JsonProcessingException e) {
  450. logger.error("JSON writeValueAsString error", e);
  451. throw SeecoderGitlabException.JSON_ERROR;
  452. } catch (IOException e) {
  453. logger.error("IOException", e);
  454. throw SeecoderGitlabException.IO_ERROR;
  455. }
  456. }
  457. @Override
  458. public List<BranchVO> getProjectBranches(int projectId) throws SeecoderGitlabException {
  459. try {
  460. ObjectMapper objectMapper = new ObjectMapper();
  461. Request.Builder builder = new Request.Builder()
  462. .addHeader("Authorization", token);
  463. builder = builder
  464. .url(host + "/api/project/"+projectId+"/branches")
  465. .get();
  466. Request request = builder.build();
  467. final Call call = client.newCall(request);
  468. Response response = call.execute();
  469. List<BranchVO> branchVOList=new ArrayList<>();
  470. branchVOList=processResponse(objectMapper, response, branchVOList.getClass());
  471. return branchVOList;
  472. } catch (JsonProcessingException e) {
  473. logger.error("JSON writeValueAsString error", e);
  474. throw SeecoderGitlabException.JSON_ERROR;
  475. } catch (IOException e) {
  476. logger.error("IOException", e);
  477. throw SeecoderGitlabException.IO_ERROR;
  478. }
  479. }
  480. }