ProjectController.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  1. /*
  2. * <<
  3. * Davinci
  4. * ==
  5. * Copyright (C) 2016 - 2019 EDP
  6. * ==
  7. * Licensed under the Apache License, Version 2.0 (the "License");
  8. * you may not use this file except in compliance with the License.
  9. * You may obtain a copy of the License at
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. * >>
  17. *
  18. */
  19. package edp.davinci.controller;
  20. import com.github.pagehelper.PageInfo;
  21. import edp.core.annotation.CurrentUser;
  22. import edp.davinci.common.controller.BaseController;
  23. import edp.davinci.core.common.Constants;
  24. import edp.davinci.core.common.ResultMap;
  25. import edp.davinci.dto.organizationDto.OrganizationTransfer;
  26. import edp.davinci.dto.projectDto.*;
  27. import edp.davinci.dto.roleDto.RoleBaseInfo;
  28. import edp.davinci.dto.roleDto.RoleProject;
  29. import edp.davinci.dto.roleDto.RoleWithProjectPermission;
  30. import edp.davinci.model.User;
  31. import edp.davinci.service.ProjectService;
  32. import edp.davinci.service.RoleService;
  33. import io.swagger.annotations.Api;
  34. import io.swagger.annotations.ApiOperation;
  35. import io.swagger.annotations.ApiResponse;
  36. import io.swagger.annotations.ApiResponses;
  37. import lombok.extern.slf4j.Slf4j;
  38. import org.springframework.beans.factory.annotation.Autowired;
  39. import org.springframework.http.MediaType;
  40. import org.springframework.http.ResponseEntity;
  41. import org.springframework.validation.BindingResult;
  42. import org.springframework.web.bind.annotation.*;
  43. import springfox.documentation.annotations.ApiIgnore;
  44. import javax.servlet.http.HttpServletRequest;
  45. import javax.validation.Valid;
  46. import java.util.Arrays;
  47. import java.util.List;
  48. @Api(value = "/project", tags = "project", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
  49. @ApiResponses(@ApiResponse(code = 404, message = "project not found"))
  50. @Slf4j
  51. @RestController
  52. @RequestMapping(value = Constants.BASE_API_PATH + "/projects", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
  53. public class ProjectController extends BaseController {
  54. @Autowired
  55. private ProjectService projectService;
  56. @Autowired
  57. private RoleService roleService;
  58. /**
  59. * 获取项目列表:用户创建和用户所在组可访问的
  60. *
  61. * @param user
  62. * @param request
  63. * @return
  64. */
  65. @ApiOperation(value = "get projects")
  66. @GetMapping
  67. public ResponseEntity getProjects(@ApiIgnore @CurrentUser User user, HttpServletRequest request) {
  68. List<ProjectInfo> projects = projectService.getProjects(user);
  69. return ResponseEntity.ok(new ResultMap(tokenUtils).successAndRefreshToken(request).payloads(projects));
  70. }
  71. @ApiOperation(value = "get roles where project is located")
  72. @GetMapping("/{id}/roles")
  73. public ResponseEntity getRolesOfProject(@ApiIgnore @CurrentUser User user,
  74. @PathVariable Long id,
  75. HttpServletRequest request) {
  76. if (invalidId(id)) {
  77. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message("Invalid id");
  78. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  79. }
  80. List<RoleBaseInfo> list = roleService.getRolesByProjectId(id, user);
  81. return ResponseEntity.ok(new ResultMap(tokenUtils).successAndRefreshToken(request).payloads(list));
  82. }
  83. @ApiOperation(value = "get roles where project is located")
  84. @GetMapping("/{id}/roles/{roleId}")
  85. public ResponseEntity getRoleOfProject(@ApiIgnore @CurrentUser User user,
  86. @PathVariable Long id,
  87. @PathVariable Long roleId,
  88. HttpServletRequest request) {
  89. if (invalidId(id)) {
  90. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message("Invalid id");
  91. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  92. }
  93. RoleWithProjectPermission permission = roleService.getRoleByProject(id, roleId, user);
  94. return ResponseEntity.ok(new ResultMap(tokenUtils).successAndRefreshToken(request).payload(permission));
  95. }
  96. /**
  97. * 获取项目列表:用户创建和用户所在组可访问的
  98. *
  99. * @param id
  100. * @param user
  101. * @param request
  102. * @return
  103. */
  104. @ApiOperation(value = "get project info")
  105. @GetMapping("/{id}")
  106. public ResponseEntity getProjectInfo(@PathVariable Long id,
  107. @ApiIgnore @CurrentUser User user,
  108. @ApiIgnore HttpServletRequest request) {
  109. if (invalidId(id)) {
  110. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message("Invalid id");
  111. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  112. }
  113. return ResponseEntity.ok(new ResultMap(tokenUtils).successAndRefreshToken(request).payload(projectService.getProjectInfo(id, user)));
  114. }
  115. /**
  116. * 获取项目列表:用户创建和用户所在组可访问的
  117. *
  118. * @param user
  119. * @param request
  120. * @return
  121. */
  122. @ApiOperation(value = "get admins of project")
  123. @GetMapping("/{id}/admins")
  124. public ResponseEntity getAdmins(@PathVariable Long id,
  125. @ApiIgnore @CurrentUser User user,
  126. HttpServletRequest request) {
  127. List<RelProjectAdminDto> admins = projectService.getAdmins(id, user);
  128. return ResponseEntity.ok(new ResultMap(tokenUtils).successAndRefreshToken(request).payloads(admins));
  129. }
  130. @ApiOperation(value = "search projects by keywords")
  131. @GetMapping("/search")
  132. public ResponseEntity searchProjects(@RequestParam(value = "keywords", required = false) String keywords,
  133. @RequestParam(value = "pageNum", required = false, defaultValue = "1") int pageNum,
  134. @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize,
  135. @ApiIgnore @CurrentUser User user,
  136. HttpServletRequest request) {
  137. PageInfo<ProjectWithCreateBy> pageInfo = projectService.searchProjects(keywords, user, pageNum, pageSize);
  138. return ResponseEntity.ok(new ResultMap(tokenUtils).successAndRefreshToken(request).payload(pageInfo));
  139. }
  140. /**
  141. * 创建项目
  142. *
  143. * @param projectCreat
  144. * @param user
  145. * @param bindingResult
  146. * @param request
  147. * @return
  148. */
  149. @ApiOperation(value = "create project", consumes = MediaType.APPLICATION_JSON_VALUE)
  150. @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
  151. public ResponseEntity createProject(@Valid @RequestBody ProjectCreat projectCreat,
  152. @ApiIgnore BindingResult bindingResult,
  153. @ApiIgnore @CurrentUser User user,
  154. HttpServletRequest request) {
  155. if (bindingResult.hasErrors()) {
  156. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message(bindingResult.getFieldErrors().get(0).getDefaultMessage());
  157. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  158. }
  159. ProjectInfo project = projectService.createProject(projectCreat, user);
  160. return ResponseEntity.ok(new ResultMap(tokenUtils).successAndRefreshToken(request).payload(project));
  161. }
  162. /**
  163. * 移交项目
  164. *
  165. * @param id
  166. * @param organizationTransfer
  167. * @param user
  168. * @param request
  169. * @return
  170. */
  171. @ApiOperation(value = "transfer projects", consumes = MediaType.APPLICATION_JSON_VALUE)
  172. @PutMapping(value = "/{id}/transfer", consumes = MediaType.APPLICATION_JSON_VALUE)
  173. public ResponseEntity transferProject(@PathVariable Long id,
  174. @Valid @RequestBody OrganizationTransfer organizationTransfer,
  175. @ApiIgnore BindingResult bindingResult,
  176. @ApiIgnore @CurrentUser User user,
  177. HttpServletRequest request) {
  178. if (invalidId(id)) {
  179. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message("Invalid project id");
  180. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  181. }
  182. if (bindingResult.hasErrors()) {
  183. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message(bindingResult.getFieldErrors().get(0).getDefaultMessage());
  184. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  185. }
  186. projectService.transferProject(id, organizationTransfer.getOrgId(), user);
  187. return ResponseEntity.ok(new ResultMap(tokenUtils).successAndRefreshToken(request));
  188. }
  189. /**
  190. * 删除project
  191. *
  192. * @param id
  193. * @param user
  194. * @param request
  195. * @return
  196. */
  197. @ApiOperation(value = "delete project")
  198. @DeleteMapping("/{id}")
  199. public ResponseEntity deleteProject(@PathVariable Long id,
  200. @ApiIgnore @CurrentUser User user,
  201. HttpServletRequest request) {
  202. if (invalidId(id)) {
  203. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message("Invalid project id");
  204. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  205. }
  206. projectService.deleteProject(id, user);
  207. return ResponseEntity.ok(new ResultMap(tokenUtils).successAndRefreshToken(request));
  208. }
  209. /**
  210. * 更新项目基本信息
  211. *
  212. * @param id
  213. * @param projectUpdate
  214. * @param user
  215. * @param request
  216. * @return
  217. */
  218. @ApiOperation(value = "update project", consumes = MediaType.APPLICATION_JSON_VALUE)
  219. @PutMapping(value = "/{id}", consumes = MediaType.APPLICATION_JSON_VALUE)
  220. public ResponseEntity updateProjectBaseInfo(@PathVariable Long id,
  221. @Valid @RequestBody ProjectUpdate projectUpdate,
  222. @ApiIgnore BindingResult bindingResult,
  223. @ApiIgnore @CurrentUser User user,
  224. HttpServletRequest request) {
  225. if (invalidId(id)) {
  226. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message("Invalid project id");
  227. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  228. }
  229. if (bindingResult.hasErrors()) {
  230. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message(bindingResult.getFieldErrors().get(0).getDefaultMessage());
  231. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  232. }
  233. projectService.updateProject(id, projectUpdate, user);
  234. return ResponseEntity.ok(new ResultMap(tokenUtils).successAndRefreshToken(request));
  235. }
  236. /**
  237. * 收藏project
  238. *
  239. * @param id
  240. * @param user
  241. * @param request
  242. * @return
  243. */
  244. @ApiOperation(value = "favorite project", consumes = MediaType.APPLICATION_JSON_VALUE)
  245. @PostMapping(value = "/favorite/{id}", consumes = MediaType.APPLICATION_JSON_VALUE)
  246. public ResponseEntity favoriteProject(@PathVariable Long id,
  247. @ApiIgnore @CurrentUser User user,
  248. HttpServletRequest request) {
  249. if (invalidId(id)) {
  250. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message("Invalid project id");
  251. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  252. }
  253. projectService.favoriteProject(id, user);
  254. return ResponseEntity.ok(new ResultMap(tokenUtils).successAndRefreshToken(request));
  255. }
  256. /**
  257. * 获取已收藏project
  258. *
  259. * @param user
  260. * @param request
  261. * @return
  262. */
  263. @ApiOperation(value = "get favorite projects")
  264. @GetMapping(value = "/favorites")
  265. public ResponseEntity getFavoriteProjects(@ApiIgnore @CurrentUser User user,
  266. HttpServletRequest request) {
  267. List<ProjectInfo> favoriteProjects = projectService.getFavoriteProjects(user);
  268. return ResponseEntity.ok(new ResultMap(tokenUtils).successAndRefreshToken(request).payloads(favoriteProjects));
  269. }
  270. /**
  271. * 获取已收藏project
  272. *
  273. * @param user
  274. * @param request
  275. * @return
  276. */
  277. @ApiOperation(value = "remove favorite projects")
  278. @DeleteMapping(value = "/remove/favorites")
  279. public ResponseEntity removeFavoriteProjects(@ApiIgnore @CurrentUser User user,
  280. @RequestBody Long[] projectIds,
  281. HttpServletRequest request) {
  282. for (Long id : projectIds) {
  283. if (invalidId(id)) {
  284. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message("Invalid project id");
  285. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  286. }
  287. }
  288. projectService.removeFavoriteProjects(user, projectIds);
  289. return ResponseEntity.ok(new ResultMap(tokenUtils).successAndRefreshToken(request));
  290. }
  291. /**
  292. * 为project 添加管理员
  293. *
  294. * @param id
  295. * @param adminIds
  296. * @param user
  297. * @param request
  298. * @return
  299. */
  300. @ApiOperation(value = "add an admin for a project")
  301. @PostMapping(value = "/{id}/admins")
  302. public ResponseEntity addProjectAdmin(@PathVariable Long id,
  303. @RequestBody Long[] adminIds,
  304. @ApiIgnore @CurrentUser User user,
  305. HttpServletRequest request) {
  306. if (invalidId(id)) {
  307. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message("Invalid project id");
  308. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  309. }
  310. if (adminIds.length == 0) {
  311. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message("Invalid admin ids");
  312. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  313. }
  314. List<RelProjectAdminDto> list = projectService.addAdmins(id, Arrays.asList(adminIds), user);
  315. return ResponseEntity.ok(new ResultMap(tokenUtils).successAndRefreshToken(request).payloads(list));
  316. }
  317. /**
  318. * 删除project admin
  319. *
  320. * @param id
  321. * @param relationId
  322. * @param user
  323. * @param request
  324. * @return
  325. */
  326. @ApiOperation(value = "remove an admin from a project")
  327. @DeleteMapping(value = "/{id}/admin/{relationId}")
  328. public ResponseEntity removeProjectAdmin(@PathVariable Long id,
  329. @PathVariable Long relationId,
  330. @ApiIgnore @CurrentUser User user,
  331. HttpServletRequest request) {
  332. if (invalidId(id)) {
  333. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message("Invalid project id");
  334. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  335. }
  336. if (invalidId(relationId)) {
  337. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message("Invalid admin id");
  338. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  339. }
  340. projectService.removeAdmin(relationId, user);
  341. return ResponseEntity.ok(new ResultMap(tokenUtils).successAndRefreshToken(request));
  342. }
  343. /**
  344. * 批量添加role
  345. *
  346. * @param id
  347. * @param roleIds
  348. * @param user
  349. * @param request
  350. * @return
  351. */
  352. @ApiOperation(value = "add project role relations")
  353. @PostMapping(value = "/{id}/roles", consumes = MediaType.APPLICATION_JSON_VALUE)
  354. public ResponseEntity addRoles(@PathVariable Long id,
  355. @RequestBody Long[] roleIds,
  356. @ApiIgnore @CurrentUser User user,
  357. HttpServletRequest request) {
  358. if (invalidId(id)) {
  359. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message("Invalid project id");
  360. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  361. }
  362. List<RoleProject> list = projectService.postRoles(id, Arrays.asList(roleIds), user);
  363. return ResponseEntity.ok(new ResultMap(tokenUtils).successAndRefreshToken(request).payload(list));
  364. }
  365. }