MagicAPIController.java 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. package org.ssssssss.magicapi.controller;
  2. import org.apache.commons.lang3.StringUtils;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.ResponseBody;
  7. import org.ssssssss.magicapi.config.MagicConfiguration;
  8. import org.ssssssss.magicapi.interceptor.RequestInterceptor;
  9. import org.ssssssss.magicapi.model.ApiInfo;
  10. import org.ssssssss.magicapi.model.JsonBean;
  11. import org.ssssssss.magicapi.provider.ApiServiceProvider;
  12. import org.ssssssss.magicapi.utils.IoUtils;
  13. import javax.servlet.http.HttpServletRequest;
  14. import java.util.List;
  15. import java.util.Optional;
  16. /**
  17. * 接口相关操作
  18. */
  19. public class MagicAPIController extends MagicController {
  20. private static Logger logger = LoggerFactory.getLogger(MagicAPIController.class);
  21. private ApiServiceProvider magicApiService;
  22. public MagicAPIController(MagicConfiguration configuration) {
  23. super(configuration);
  24. this.magicApiService = configuration.getMagicApiService();
  25. }
  26. /**
  27. * 删除接口
  28. *
  29. * @param id 接口ID
  30. */
  31. @RequestMapping("/delete")
  32. @ResponseBody
  33. public JsonBean<Boolean> delete(String id, HttpServletRequest request) {
  34. if(configuration.getWorkspace().readonly()){
  35. return new JsonBean<>(0, "当前为只读模式,无法删除");
  36. }
  37. if (!allowVisit(request, RequestInterceptor.Authorization.DELETE)) {
  38. return new JsonBean<>(-10, "无权限执行删除方法");
  39. }
  40. try {
  41. boolean success = magicApiService.delete(id);
  42. if (success) { //删除成功时在取消注册
  43. configuration.getMappingHandlerMapping().unregisterMapping(id, true);
  44. }
  45. return new JsonBean<>(success);
  46. } catch (Exception e) {
  47. logger.error("删除接口出错", e);
  48. return new JsonBean<>(-1, e.getMessage());
  49. }
  50. }
  51. /**
  52. * 查询所有接口
  53. */
  54. @RequestMapping("/list")
  55. @ResponseBody
  56. public JsonBean<List<ApiInfo>> list() {
  57. try {
  58. return new JsonBean<>(magicApiService.list());
  59. } catch (Exception e) {
  60. logger.error("查询接口列表失败", e);
  61. return new JsonBean<>(-1, e.getMessage());
  62. }
  63. }
  64. /**
  65. * 查询接口详情
  66. *
  67. * @param id 接口ID
  68. */
  69. @RequestMapping("/get")
  70. @ResponseBody
  71. public JsonBean<ApiInfo> get(HttpServletRequest request, String id) {
  72. if (!allowVisit(request, RequestInterceptor.Authorization.DETAIL)) {
  73. return new JsonBean<>(-10, "无权限执行查看详情方法");
  74. }
  75. try {
  76. return new JsonBean<>(magicApiService.get(id));
  77. } catch (Exception e) {
  78. logger.error("查询接口出错");
  79. return new JsonBean<>(-1, e.getMessage());
  80. }
  81. }
  82. /**
  83. * 查询历史记录
  84. *
  85. * @param id 接口ID
  86. */
  87. @RequestMapping("/backups")
  88. @ResponseBody
  89. public JsonBean<List<Long>> backups(String id) {
  90. return new JsonBean<>(magicApiService.backupList(id));
  91. }
  92. /**
  93. * 获取历史记录
  94. *
  95. * @param id 接口ID
  96. * @param timestamp 时间点
  97. */
  98. @RequestMapping("/backup/get")
  99. @ResponseBody
  100. public JsonBean<ApiInfo> backups(String id, Long timestamp) {
  101. return new JsonBean<>(magicApiService.backupInfo(id, timestamp));
  102. }
  103. /**
  104. * 移动接口
  105. */
  106. @RequestMapping("/api/move")
  107. @ResponseBody
  108. public JsonBean<Boolean> apiMove(String id, String groupId, HttpServletRequest request) {
  109. if(configuration.getWorkspace().readonly()){
  110. return new JsonBean<>(0, "当前为只读模式,无法移动");
  111. }
  112. if (!allowVisit(request, RequestInterceptor.Authorization.SAVE)) {
  113. return new JsonBean<>(-10, "无权限执行保存方法");
  114. }
  115. if (!configuration.getGroupServiceProvider().containsApiGroup(groupId)) {
  116. return new JsonBean<>(0, "找不到分组信息");
  117. }
  118. try {
  119. if (!magicApiService.allowMove(id, groupId)) {
  120. return new JsonBean<>(0, "移动后名称会重复,请修改名称后在试。");
  121. }
  122. if (!configuration.getMappingHandlerMapping().move(id, groupId)) {
  123. return new JsonBean<>(0, "该路径已被映射,请换一个请求方法或路径");
  124. } else {
  125. return new JsonBean<>(magicApiService.move(id, groupId));
  126. }
  127. } catch (Exception e) {
  128. logger.error("移动接口出错", e);
  129. return new JsonBean<>(-1, e.getMessage());
  130. }
  131. }
  132. /**
  133. * 保存接口
  134. *
  135. * @param info 接口信息
  136. */
  137. @RequestMapping("/save")
  138. @ResponseBody
  139. public JsonBean<String> save(HttpServletRequest request, ApiInfo info) {
  140. if(configuration.getWorkspace().readonly()){
  141. return new JsonBean<>(0, "当前为只读模式,无法保存");
  142. }
  143. if (!allowVisit(request, RequestInterceptor.Authorization.SAVE)) {
  144. return new JsonBean<>(-10, "无权限执行保存方法");
  145. }
  146. try {
  147. if (StringUtils.isBlank(info.getMethod())) {
  148. return new JsonBean<>(0, "请求方法不能为空");
  149. }
  150. if (StringUtils.isBlank(info.getPath())) {
  151. return new JsonBean<>(0, "请求路径不能为空");
  152. }
  153. if (StringUtils.isBlank(info.getName())) {
  154. return new JsonBean<>(0, "接口名称不能为空");
  155. }
  156. if (!IoUtils.validateFileName(info.getName())) {
  157. return new JsonBean<>(0, "接口名称不能包含特殊字符,只允许中文、数字、字母以及_组合");
  158. }
  159. if (StringUtils.isBlank(info.getScript())) {
  160. return new JsonBean<>(0, "脚本内容不能为空");
  161. }
  162. if (configuration.getMappingHandlerMapping().hasRegisterMapping(info)) {
  163. return new JsonBean<>(0, "该路径已被映射,请换一个请求方法或路径");
  164. }
  165. if (StringUtils.isBlank(info.getId())) {
  166. // 先判断接口是否存在
  167. if (magicApiService.exists(info.getGroupId(), info.getMethod(), info.getPath())) {
  168. return new JsonBean<>(0, String.format("接口%s:%s已存在", info.getMethod(), info.getPath()));
  169. }
  170. if (!magicApiService.insert(info)) {
  171. return new JsonBean<>(0, "保存失败,请检查接口名称是否重复且不能包含特殊字符。");
  172. }
  173. } else {
  174. // 先判断接口是否存在
  175. if (magicApiService.existsWithoutId(info.getGroupId(), info.getMethod(), info.getPath(), info.getId())) {
  176. return new JsonBean<>(0, String.format("接口%s:%s已存在", info.getMethod(), info.getPath()));
  177. }
  178. Optional<ApiInfo> optional = configuration.getMappingHandlerMapping().getApiInfos().stream()
  179. .filter(it -> it.getId().equals(info.getId()))
  180. .findFirst();
  181. if (optional.isPresent() && !optional.get().equals(info)) {
  182. if(!magicApiService.update(info)){
  183. return new JsonBean<>(0, "保存失败,请检查接口名称是否重复且不能包含特殊字符。");
  184. }
  185. magicApiService.backup(info);
  186. }
  187. }
  188. // 注册接口
  189. configuration.getMappingHandlerMapping().registerMapping(info, true);
  190. return new JsonBean<>(info.getId());
  191. } catch (Exception e) {
  192. logger.error("保存接口出错", e);
  193. return new JsonBean<>(-1, e.getMessage());
  194. }
  195. }
  196. }