SourceController.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  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.alibaba.druid.util.StringUtils;
  21. import edp.core.annotation.CurrentUser;
  22. import edp.core.model.DBTables;
  23. import edp.core.model.TableInfo;
  24. import edp.davinci.common.controller.BaseController;
  25. import edp.davinci.core.common.Constants;
  26. import edp.davinci.core.common.ResultMap;
  27. import edp.davinci.dto.sourceDto.*;
  28. import edp.davinci.model.Source;
  29. import edp.davinci.model.User;
  30. import edp.davinci.service.SourceService;
  31. import io.swagger.annotations.Api;
  32. import io.swagger.annotations.ApiOperation;
  33. import io.swagger.annotations.ApiResponse;
  34. import io.swagger.annotations.ApiResponses;
  35. import org.springframework.beans.BeanUtils;
  36. import org.springframework.beans.factory.annotation.Autowired;
  37. import org.springframework.http.MediaType;
  38. import org.springframework.http.ResponseEntity;
  39. import org.springframework.validation.BindingResult;
  40. import org.springframework.web.bind.annotation.*;
  41. import org.springframework.web.multipart.MultipartFile;
  42. import springfox.documentation.annotations.ApiIgnore;
  43. import javax.servlet.http.HttpServletRequest;
  44. import javax.validation.Valid;
  45. import java.util.List;
  46. @Api(value = "/sources", tags = "sources", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
  47. @ApiResponses(@ApiResponse(code = 404, message = "sources not found"))
  48. @RestController
  49. @RequestMapping(value = Constants.BASE_API_PATH + "/sources", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
  50. public class SourceController extends BaseController {
  51. @Autowired
  52. private SourceService sourceService;
  53. /**
  54. * 获取source列表
  55. *
  56. * @param projectId
  57. * @param user
  58. * @param request
  59. * @return
  60. */
  61. @ApiOperation(value = "get sources")
  62. @GetMapping
  63. public ResponseEntity getSources(@RequestParam Long projectId,
  64. @ApiIgnore @CurrentUser User user,
  65. HttpServletRequest request) {
  66. if (invalidId(projectId)) {
  67. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message("Invalid project id");
  68. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  69. }
  70. List<Source> sources = sourceService.getSources(projectId, user);
  71. return ResponseEntity.ok(new ResultMap(tokenUtils).successAndRefreshToken(request).payloads(sources));
  72. }
  73. /**
  74. * 获取source树形列表
  75. *
  76. * @param projectId
  77. * @param user
  78. * @param request
  79. * @return
  80. */
  81. @ApiOperation(value = "get tree sources")
  82. @GetMapping
  83. public ResponseEntity getTreeSources(@RequestParam Long projectId,
  84. @ApiIgnore @CurrentUser User user,
  85. HttpServletRequest request) {
  86. if (invalidId(projectId)) {
  87. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message("Invalid project id");
  88. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  89. }
  90. List<Source> sources = sourceService.getSources(projectId, user);
  91. return ResponseEntity.ok(new ResultMap(tokenUtils).successAndRefreshToken(request).payloads(sources));
  92. }
  93. /**
  94. * 获取source 信息
  95. *
  96. * @param id
  97. * @param user
  98. * @param request
  99. * @return
  100. */
  101. @ApiOperation(value = "get source detail")
  102. @GetMapping("/{id}")
  103. public ResponseEntity getSourceDetail(@PathVariable Long id,
  104. @ApiIgnore @CurrentUser User user,
  105. HttpServletRequest request) {
  106. if (invalidId(id)) {
  107. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message("Invalid project id");
  108. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  109. }
  110. SourceDetail sourceDetail = sourceService.getSourceDetail(id, user);
  111. return ResponseEntity.ok(new ResultMap(tokenUtils).successAndRefreshToken(request).payload(sourceDetail));
  112. }
  113. /**
  114. * 创建source
  115. *
  116. * @param source
  117. * @param bindingResult
  118. * @param user
  119. * @param request
  120. * @return
  121. */
  122. @ApiOperation(value = "create source", consumes = MediaType.APPLICATION_JSON_VALUE)
  123. @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
  124. public ResponseEntity createSource(@Valid @RequestBody SourceCreate source,
  125. @ApiIgnore BindingResult bindingResult,
  126. @ApiIgnore @CurrentUser User user,
  127. HttpServletRequest request) {
  128. if (bindingResult.hasErrors()) {
  129. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message(bindingResult.getFieldErrors().get(0).getDefaultMessage());
  130. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  131. }
  132. Source record = sourceService.createSource(source, user);
  133. return ResponseEntity.ok(new ResultMap(tokenUtils).successAndRefreshToken(request).payload(record));
  134. }
  135. /**
  136. * 更新source
  137. *
  138. * @param id
  139. * @param source
  140. * @param bindingResult
  141. * @param user
  142. * @param request
  143. * @return
  144. */
  145. @ApiOperation(value = "update a source", consumes = MediaType.APPLICATION_JSON_VALUE)
  146. @PutMapping(value = "/{id}", consumes = MediaType.APPLICATION_JSON_VALUE)
  147. public ResponseEntity updateSource(@PathVariable Long id,
  148. @Valid @RequestBody SourceInfo source,
  149. @ApiIgnore BindingResult bindingResult,
  150. @ApiIgnore @CurrentUser User user,
  151. HttpServletRequest request) {
  152. if (bindingResult.hasErrors()) {
  153. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message(bindingResult.getFieldErrors().get(0).getDefaultMessage());
  154. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  155. }
  156. if (invalidId(id) || !id.equals(source.getId())) {
  157. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message("Invalid source id");
  158. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  159. }
  160. sourceService.updateSource(source, user);
  161. return ResponseEntity.ok(new ResultMap(tokenUtils).successAndRefreshToken(request));
  162. }
  163. /**
  164. * 删除source
  165. *
  166. * @param id
  167. * @param user
  168. * @param request
  169. * @return
  170. */
  171. @ApiOperation(value = "delete a source")
  172. @DeleteMapping("/{id}")
  173. public ResponseEntity deleteSource(@PathVariable Long id,
  174. @ApiIgnore @CurrentUser User user,
  175. HttpServletRequest request) {
  176. if (invalidId(id)) {
  177. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message("Invalid source id");
  178. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  179. }
  180. sourceService.deleteSource(id, user);
  181. return ResponseEntity.ok(new ResultMap(tokenUtils).successAndRefreshToken(request));
  182. }
  183. /**
  184. * 测试连接
  185. *
  186. * @param sourceTest
  187. * @param bindingResult
  188. * @param user
  189. * @param request
  190. * @return
  191. */
  192. @ApiOperation(value = "test source", consumes = MediaType.APPLICATION_JSON_VALUE)
  193. @PostMapping(value = "/test", consumes = MediaType.APPLICATION_JSON_VALUE)
  194. public ResponseEntity testSource(@Valid @RequestBody SourceTest sourceTest,
  195. @ApiIgnore BindingResult bindingResult,
  196. @ApiIgnore @CurrentUser User user,
  197. HttpServletRequest request) {
  198. if (bindingResult.hasErrors()) {
  199. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message(bindingResult.getFieldErrors().get(0).getDefaultMessage());
  200. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  201. }
  202. sourceService.testSource(sourceTest);
  203. return ResponseEntity.ok(new ResultMap(tokenUtils).successAndRefreshToken(request));
  204. }
  205. /**
  206. * 释放重连
  207. *
  208. * @param id
  209. * @param dbBaseInfo
  210. * @param user
  211. * @param request
  212. * @return
  213. */
  214. @ApiOperation(value = "release and reconnect", consumes = MediaType.APPLICATION_JSON_VALUE)
  215. @PostMapping(value = "/reconnect/{id}", consumes = MediaType.APPLICATION_JSON_VALUE)
  216. public ResponseEntity reconnect(@PathVariable Long id,
  217. @RequestBody DbBaseInfo dbBaseInfo,
  218. @ApiIgnore @CurrentUser User user,
  219. HttpServletRequest request) {
  220. sourceService.reconnect(id, dbBaseInfo, user);
  221. return ResponseEntity.ok(new ResultMap(tokenUtils).successAndRefreshToken(request));
  222. }
  223. /**
  224. * 生成csv对应的表结构
  225. *
  226. * @param id
  227. * @param uploadMeta
  228. * @param bindingResult
  229. * @param user
  230. * @param request
  231. * @return
  232. */
  233. @ApiOperation(value = "create csv meta", consumes = MediaType.APPLICATION_JSON_VALUE)
  234. @PostMapping(value = "{id}/csvmeta", consumes = MediaType.APPLICATION_JSON_VALUE)
  235. public ResponseEntity createCsvmeta(@PathVariable Long id,
  236. @Valid @RequestBody UploadMeta uploadMeta,
  237. @ApiIgnore BindingResult bindingResult,
  238. @ApiIgnore @CurrentUser User user,
  239. HttpServletRequest request) {
  240. if (invalidId(id)) {
  241. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message("Invalid source id");
  242. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  243. }
  244. if (bindingResult.hasErrors()) {
  245. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message(bindingResult.getFieldErrors().get(0).getDefaultMessage());
  246. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  247. }
  248. sourceService.validCsvmeta(id, uploadMeta, user);
  249. return ResponseEntity.ok(new ResultMap(tokenUtils).successAndRefreshToken(request));
  250. }
  251. /**
  252. * 上csv文件
  253. *
  254. * @param id
  255. * @param sourceDataUpload
  256. * @param bindingResult
  257. * @param file
  258. * @param user
  259. * @param request
  260. * @return
  261. */
  262. @ApiOperation(value = "upload csv/excel file")
  263. @PostMapping("{id}/upload{type}")
  264. public ResponseEntity uploadData(@PathVariable Long id,
  265. @PathVariable String type,
  266. @Valid @ModelAttribute(value = "sourceDataUpload") SourceDataUpload sourceDataUpload,
  267. @ApiIgnore BindingResult bindingResult,
  268. @RequestParam("file") MultipartFile file,
  269. @ApiIgnore @CurrentUser User user,
  270. HttpServletRequest request) {
  271. if (invalidId(id)) {
  272. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message("Invalid source id");
  273. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  274. }
  275. if (bindingResult.hasErrors()) {
  276. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message(bindingResult.getFieldErrors().get(0).getDefaultMessage());
  277. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  278. }
  279. if (file.isEmpty() || StringUtils.isEmpty(file.getOriginalFilename())) {
  280. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message("Upload file can not be empty");
  281. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  282. }
  283. sourceService.dataUpload(id, sourceDataUpload, file, user, type);
  284. return ResponseEntity.ok(new ResultMap(tokenUtils).successAndRefreshToken(request));
  285. }
  286. /**
  287. * source 的数据库
  288. *
  289. * @param id
  290. * @param user
  291. * @param request
  292. * @return
  293. */
  294. @ApiOperation(value = "get dbs")
  295. @GetMapping("/{id}/databases")
  296. public ResponseEntity getSourceDbs(@PathVariable Long id,
  297. @ApiIgnore @CurrentUser User user,
  298. HttpServletRequest request) {
  299. if (invalidId(id)) {
  300. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message("Invalid source id");
  301. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  302. }
  303. List<String> dbs = sourceService.getSourceDbs(id, user);
  304. return ResponseEntity.ok(new ResultMap(tokenUtils).successAndRefreshToken(request).payload(new SourceCatalogInfo(id, dbs)));
  305. }
  306. /**
  307. * source 的数据库表
  308. *
  309. * @param id
  310. * @param user
  311. * @param request
  312. * @return
  313. */
  314. @ApiOperation(value = "get tables")
  315. @GetMapping("/{id}/tables")
  316. public ResponseEntity getSourceTables(@PathVariable Long id,
  317. @RequestParam(name = "dbName") String dbName,
  318. @ApiIgnore @CurrentUser User user,
  319. HttpServletRequest request) {
  320. if (invalidId(id)) {
  321. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message("Invalid source id");
  322. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  323. }
  324. DBTables dbTables = sourceService.getSourceTables(id, dbName, user);
  325. SourceDBInfo dbTableInfo = new SourceDBInfo();
  326. dbTableInfo.setSourceId(id);
  327. BeanUtils.copyProperties(dbTables, dbTableInfo);
  328. return ResponseEntity.ok(new ResultMap(tokenUtils).successAndRefreshToken(request).payload(dbTableInfo));
  329. }
  330. /**
  331. * 表字段
  332. *
  333. * @param id
  334. * @param user
  335. * @param request
  336. * @return
  337. */
  338. @ApiOperation(value = "get columns")
  339. @GetMapping("/{id}/table/columns")
  340. public ResponseEntity getTableColumns(@PathVariable Long id,
  341. @RequestParam(name = "dbName") String dbName,
  342. @RequestParam(name = "tableName") String tableName,
  343. @ApiIgnore @CurrentUser User user,
  344. HttpServletRequest request) {
  345. if (invalidId(id)) {
  346. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message("Invalid source id");
  347. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  348. }
  349. if (StringUtils.isEmpty(tableName)) {
  350. ResultMap resultMap = new ResultMap(tokenUtils).failAndRefreshToken(request).message("Table cannot be empty");
  351. return ResponseEntity.status(resultMap.getCode()).body(resultMap);
  352. }
  353. TableInfo tableInfo = sourceService.getTableInfo(id, dbName, tableName, user);
  354. SourceTableInfo sourceTableInfo = new SourceTableInfo();
  355. sourceTableInfo.setSourceId(id);
  356. sourceTableInfo.setTableName(tableName);
  357. BeanUtils.copyProperties(tableInfo, sourceTableInfo);
  358. return ResponseEntity.ok(new ResultMap(tokenUtils).successAndRefreshToken(request).payload(sourceTableInfo));
  359. }
  360. /**
  361. * 获取系统支持jdbc数据源
  362. *
  363. * @param user
  364. * @param request
  365. * @return
  366. */
  367. @ApiOperation(value = "get jdbc datasources")
  368. @GetMapping("/jdbc/datasources")
  369. public ResponseEntity getJdbcDataSources(@ApiIgnore @CurrentUser User user, HttpServletRequest request) {
  370. List<DatasourceType> list = sourceService.getDatasources();
  371. return ResponseEntity.ok(new ResultMap(tokenUtils).successAndRefreshToken(request).payloads(list));
  372. }
  373. }