From 5258305dbac785c309e88e758a226e9a5d24b972 Mon Sep 17 00:00:00 2001 From: sige Date: Wed, 10 Apr 2024 16:29:44 +0800 Subject: [PATCH] =?UTF-8?q?=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.db | Bin 294912 -> 299008 bytes .../controller/DigestionTaskController.java | 4 +- .../underframework/controller/TsApiActuator.java | 38 +++++++ .../controller/TsApiActuatorCommand.java | 58 +++++++++++ .../underframework/controller/TsApiModule.java | 33 ++++++ .../underframework/controller/TsApiSnippet.java | 64 ++++++++++++ .../controller/UfApiControllerBase.java | 70 +++++++++++++ .../underframework/controller/UfApiResponse.java | 11 ++ .../underframework/controller/UfApiUser.java | 114 +++++++++++++++++++++ .../underframework/dao/model/UfMdbUser.java | 51 +++++++++ .../underframework/web/api/TsApiActuator.java | 38 ------- .../web/api/TsApiActuatorCommand.java | 58 ----------- .../underframework/web/api/TsApiModule.java | 33 ------ .../underframework/web/api/TsApiSnippet.java | 64 ------------ .../web/api/UfApiControllerBase.java | 54 ---------- .../underframework/web/api/UfApiResponse.java | 11 -- web | 2 +- 17 files changed, 442 insertions(+), 261 deletions(-) create mode 100644 src/main/java/com/iflytop/digester/underframework/controller/TsApiActuator.java create mode 100644 src/main/java/com/iflytop/digester/underframework/controller/TsApiActuatorCommand.java create mode 100644 src/main/java/com/iflytop/digester/underframework/controller/TsApiModule.java create mode 100644 src/main/java/com/iflytop/digester/underframework/controller/TsApiSnippet.java create mode 100644 src/main/java/com/iflytop/digester/underframework/controller/UfApiControllerBase.java create mode 100644 src/main/java/com/iflytop/digester/underframework/controller/UfApiResponse.java create mode 100644 src/main/java/com/iflytop/digester/underframework/controller/UfApiUser.java create mode 100644 src/main/java/com/iflytop/digester/underframework/dao/model/UfMdbUser.java delete mode 100644 src/main/java/com/iflytop/digester/underframework/web/api/TsApiActuator.java delete mode 100644 src/main/java/com/iflytop/digester/underframework/web/api/TsApiActuatorCommand.java delete mode 100644 src/main/java/com/iflytop/digester/underframework/web/api/TsApiModule.java delete mode 100644 src/main/java/com/iflytop/digester/underframework/web/api/TsApiSnippet.java delete mode 100644 src/main/java/com/iflytop/digester/underframework/web/api/UfApiControllerBase.java delete mode 100644 src/main/java/com/iflytop/digester/underframework/web/api/UfApiResponse.java diff --git a/app.db b/app.db index 559ab6faebd688f3caa164d1723c3f906616b76c..a4b9ca8ee5fc0db3d38256966d2ca1c76b37ddce 100644 GIT binary patch delta 3583 zcmdUy?{Cva7{`5yogZ%FYw3{7k1S3GbQPrd94C$!ple5;(#f@n%9=yGpaP7r<7D7XzU|v~^-)`vZ8f!K+E@3#9GE_F_LkV-kW%dz`Exg{CSn zi7nE{vG2J%-+iCw&d(h^y5#7YCF3hvk5ClV5BPxRf!h=70?ZMr>(INOzi9aobM_Gz zlv?l*h0oxja_jH_E^V=}c~+NM=a*IwK=VhI8C(l{*kd{lE|7wLdj$(lL^U0BtfE+ zfSL};Z?Gy!FTC`Ih zn%TzsnK@^uX8T$SU*LY^&T$UcHJ7{j278M==Un6X!M@h^6Z0qYCB5Eq8FjHktebUD zdWCzmbB6h=>=o`X)A};{3uN59g6`0u;5T5sYK!i+@vjApix<#Jghve^edXa zaUOZCQz+Nsb|9*Wo}us+?kYF#qMP1htgs9IBb zT`TJ89%wx>R@C?D`C13!oEp7v`-Gx?xcHzMhNKswg;@4YeXKfyYO_jtwK#e>HoX9`8J0=exVn39TYfq9#ltJDN^Nq9lv3o)dwF2F4&$sO_1G zst>d=&`R3NJXH-FsH~;>K*xViM%o!iUWhn1vXP>Vk9sOm>#2%DYMPoGfCHd*K8q@n1x9l5z3l;-I`YTSWDA9rS}e)lfucd5}3B5Q$T*QiZ<2LR(can?X87|9}%kATX+?qcq^GglC6@F_3HCVp($&;r# zJnk-QH*QcPL6q|KQ&OwLf@2gug=3Jg^x;z9Y{G)Qj>kz@?q`w1vl$DH(~HhnRLCRk zq8!R-YEV@D;V@DCvJz7Lni3%Xa0c?nfT9Fal9=I7zxq(h(o~nSeEh92-8zhZ!;{-v zT0h7k<}(J}_1rHyD3L0pP5EH!&HdV-VDUc^$fC!@t5jO?L~MIMa)1|s^>H~;_u delta 12103 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 MhaqR33Zo7G4+d~Fg8%>k diff --git a/src/main/java/com/iflytop/digester/controller/DigestionTaskController.java b/src/main/java/com/iflytop/digester/controller/DigestionTaskController.java index 8d94a18..073836f 100644 --- a/src/main/java/com/iflytop/digester/controller/DigestionTaskController.java +++ b/src/main/java/com/iflytop/digester/controller/DigestionTaskController.java @@ -4,8 +4,8 @@ import com.iflytop.digester.DigestionTaskTheadManager; import com.iflytop.digester.model.MdbDigestionSolution; import com.iflytop.digester.underframework.dao.record.UfActiveRecord; import com.iflytop.digester.underframework.util.UfJsonHelper; -import com.iflytop.digester.underframework.web.api.UfApiControllerBase; -import com.iflytop.digester.underframework.web.api.UfApiResponse; +import com.iflytop.digester.underframework.controller.UfApiControllerBase; +import com.iflytop.digester.underframework.controller.UfApiResponse; import jakarta.annotation.Resource; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; diff --git a/src/main/java/com/iflytop/digester/underframework/controller/TsApiActuator.java b/src/main/java/com/iflytop/digester/underframework/controller/TsApiActuator.java new file mode 100644 index 0000000..e4b2c98 --- /dev/null +++ b/src/main/java/com/iflytop/digester/underframework/controller/TsApiActuator.java @@ -0,0 +1,38 @@ +package com.iflytop.digester.underframework.controller; +import com.iflytop.digester.underframework.dao.record.UfActiveRecord; +import com.iflytop.digester.underframework.dao.record.UfActiveRecordCriteria; +import com.iflytop.digester.underframework.dao.model.TsMdbActuator; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import java.util.Map; +@Controller +public class TsApiActuator extends UfApiControllerBase { + @PostMapping("/api/actuator/list") + @ResponseBody + public UfApiResponse list(@RequestBody Map params) { + String moduleId = (String) params.get("moduleId"); + var criteria = new UfActiveRecordCriteria(); + criteria.conditions = Map.of("moduleId", moduleId); + var items = UfActiveRecord.find(TsMdbActuator.class, criteria); + return success(items); + } + + @PostMapping("/api/actuator/save") + @ResponseBody + public UfApiResponse save(@RequestBody TsMdbActuator actuator ) { + if ( null != actuator.id ) { + actuator.isNewRecord = false; + } + actuator.save(); + return success(); + } + + @PostMapping("/api/actuator/delete") + @ResponseBody + public UfApiResponse delete(@RequestBody TsMdbActuator actuator ) { + actuator.delete(); + return success(); + } +} diff --git a/src/main/java/com/iflytop/digester/underframework/controller/TsApiActuatorCommand.java b/src/main/java/com/iflytop/digester/underframework/controller/TsApiActuatorCommand.java new file mode 100644 index 0000000..961c8a4 --- /dev/null +++ b/src/main/java/com/iflytop/digester/underframework/controller/TsApiActuatorCommand.java @@ -0,0 +1,58 @@ +package com.iflytop.digester.underframework.controller; +import com.iflytop.digester.underframework.UfActuatorCmdExecutor; +import com.iflytop.digester.underframework.UfApplication; +import com.iflytop.digester.underframework.dao.record.UfActiveRecord; +import com.iflytop.digester.underframework.dao.record.UfActiveRecordCriteria; +import com.iflytop.digester.underframework.dao.model.UfMdbActuatorCmd; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import java.util.Map; +@Controller +public class TsApiActuatorCommand extends UfApiControllerBase { + @PostMapping("/api/actuator-cmd/list") + @ResponseBody + public UfApiResponse list(@RequestBody Map params) { + String actuatorId = (String) params.get("actuatorId"); + var criteria = new UfActiveRecordCriteria(); + criteria.conditions = Map.of("actuatorId", actuatorId); + var items = UfActiveRecord.find(UfMdbActuatorCmd.class, criteria); + return success(items); + } + + @PostMapping("/api/actuator-cmd/save") + @ResponseBody + public UfApiResponse save(@RequestBody UfMdbActuatorCmd actuatorCmd ) { + if ( null != actuatorCmd.id ) { + actuatorCmd.isNewRecord = false; + } + actuatorCmd.save(); + return success(); + } + + @PostMapping("/api/actuator-cmd/delete") + @ResponseBody + public UfApiResponse delete(@RequestBody UfMdbActuatorCmd actuatorCmd ) { + actuatorCmd.delete(); + return success(); + } + + @PostMapping("/api/actuator-cmd/execute") + @ResponseBody + public UfApiResponse execute(@RequestBody UfMdbActuatorCmd actuatorCmd ) { + try { + String result = UfActuatorCmdExecutor.execute(actuatorCmd); + return success(Map.of("result", result)); + } catch ( Exception e ) { + return error(e.getMessage()); + } + } + + @PostMapping("/api/actuator-cmd/connection-list") + @ResponseBody + public UfApiResponse connectionList() { + var connections = UfApplication.getApp().connections; + return success(connections.getConnections()); + } +} diff --git a/src/main/java/com/iflytop/digester/underframework/controller/TsApiModule.java b/src/main/java/com/iflytop/digester/underframework/controller/TsApiModule.java new file mode 100644 index 0000000..ad591e7 --- /dev/null +++ b/src/main/java/com/iflytop/digester/underframework/controller/TsApiModule.java @@ -0,0 +1,33 @@ +package com.iflytop.digester.underframework.controller; +import com.iflytop.digester.underframework.dao.record.UfActiveRecord; +import com.iflytop.digester.underframework.dao.model.TsMdbModule; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +@Controller +public class TsApiModule extends UfApiControllerBase { + @PostMapping("/api/module/list") + @ResponseBody + public UfApiResponse list() { + var items = UfActiveRecord.find(TsMdbModule.class); + return success(items); + } + + @PostMapping("/api/module/save") + @ResponseBody + public UfApiResponse save(@RequestBody TsMdbModule module ) { + if ( null != module.id ) { + module.isNewRecord = false; + } + module.save(); + return success(); + } + + @PostMapping("/api/module/delete") + @ResponseBody + public UfApiResponse delete(@RequestBody TsMdbModule module ) { + module.delete(); + return success(); + } +} diff --git a/src/main/java/com/iflytop/digester/underframework/controller/TsApiSnippet.java b/src/main/java/com/iflytop/digester/underframework/controller/TsApiSnippet.java new file mode 100644 index 0000000..9ec3e8b --- /dev/null +++ b/src/main/java/com/iflytop/digester/underframework/controller/TsApiSnippet.java @@ -0,0 +1,64 @@ +package com.iflytop.digester.underframework.controller; +import com.iflytop.digester.underframework.UfCmdSnippetExecutor; +import com.iflytop.digester.underframework.dao.record.UfActiveRecord; +import com.iflytop.digester.underframework.dao.model.UfMdbSnippet; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.HashMap; +import java.util.Map; +@Controller +public class TsApiSnippet extends UfApiControllerBase { + @PostMapping("/api/snippet/list") + @ResponseBody + public UfApiResponse list() { + var items = UfActiveRecord.find(UfMdbSnippet.class); + return success(items); + } + + @PostMapping("/api/snippet/save") + @ResponseBody + public UfApiResponse save(@RequestBody UfMdbSnippet snippet ) { + if ( null != snippet.id ) { + snippet.isNewRecord = false; + } + snippet.save(); + return success(); + } + + @PostMapping("/api/snippet/delete") + @ResponseBody + public UfApiResponse delete(@RequestBody UfMdbSnippet snippet ) { + snippet.delete(); + return success(); + } + + @PostMapping("/api/snippet/execute") + @ResponseBody + public UfApiResponse execute(@RequestBody UfMdbSnippet snippet ) { + try { + snippet = UfActiveRecord.findOne(UfMdbSnippet.class, snippet.id); + UfCmdSnippetExecutor.execute(snippet.key); + } catch ( Exception e ) { + return error(e.getMessage()); + } + return success(); + } + + @PostMapping("/api/snippet/execute-step") + @ResponseBody + public UfApiResponse executeStep(@RequestBody Map params ) { + try { + String cmdId = (String)params.get("cmdId"); + String cmdParams = (String)params.get("cmdParams"); + + var executor = new UfCmdSnippetExecutor(null, new HashMap<>()); + executor.executeStep(cmdId, cmdParams); + } catch ( Exception e ) { + return error(e.getMessage()); + } + return success(); + } +} diff --git a/src/main/java/com/iflytop/digester/underframework/controller/UfApiControllerBase.java b/src/main/java/com/iflytop/digester/underframework/controller/UfApiControllerBase.java new file mode 100644 index 0000000..9cb2173 --- /dev/null +++ b/src/main/java/com/iflytop/digester/underframework/controller/UfApiControllerBase.java @@ -0,0 +1,70 @@ +package com.iflytop.digester.underframework.controller; + +import com.iflytop.digester.underframework.dao.model.UfMdbUser; +import com.iflytop.digester.underframework.dao.record.UfActiveRecord; +import jakarta.servlet.http.HttpServletRequest; + +import java.util.Map; + +abstract public class UfApiControllerBase { + /** + * success response + * @return ApiResponse + */ + protected UfApiResponse success() { + UfApiResponse response = new UfApiResponse(); + response.success = true; + response.message = "OK"; + response.code = "OK"; + return response; + } + + /** + * success response with data + * @param data - data to be returned + * @return ApiResponse + */ + protected UfApiResponse success(Object data) { + UfApiResponse response = new UfApiResponse(); + response.success = true; + response.message = "OK"; + response.code = "OK"; + response.data = data; + return response; + } + + /** + * error response + * @param message - error message + * @return ApiResponse + */ + protected UfApiResponse error(String message) { + UfApiResponse response = new UfApiResponse(); + response.success = false; + response.message = message; + return response; + } + + /** + * error response with code + * @param message - error message + * @param code - error code + * @return ApiResponse + */ + protected UfApiResponse error(String message, String code ) { + UfApiResponse response = new UfApiResponse(); + response.success = false; + response.message = message; + response.code = code; + return response; + } + + // get user from request + protected UfMdbUser getUserFromRequest(HttpServletRequest request) { + String accessToken = request.getHeader("App-Access-Token"); + if ( null == accessToken ) { + return null; + } + return UfActiveRecord.findOne(UfMdbUser.class, Map.of("accessToken", accessToken)); + } +} diff --git a/src/main/java/com/iflytop/digester/underframework/controller/UfApiResponse.java b/src/main/java/com/iflytop/digester/underframework/controller/UfApiResponse.java new file mode 100644 index 0000000..3610e8b --- /dev/null +++ b/src/main/java/com/iflytop/digester/underframework/controller/UfApiResponse.java @@ -0,0 +1,11 @@ +package com.iflytop.digester.underframework.controller; +public class UfApiResponse { + // success or not + public boolean success; + // error code + public String code; + // message + public String message; + // data + public Object data; +} diff --git a/src/main/java/com/iflytop/digester/underframework/controller/UfApiUser.java b/src/main/java/com/iflytop/digester/underframework/controller/UfApiUser.java new file mode 100644 index 0000000..e252796 --- /dev/null +++ b/src/main/java/com/iflytop/digester/underframework/controller/UfApiUser.java @@ -0,0 +1,114 @@ +package com.iflytop.digester.underframework.controller; +import com.iflytop.digester.underframework.dao.model.UfMdbUser; +import com.iflytop.digester.underframework.dao.record.UfActiveRecord; +import com.iflytop.digester.underframework.dao.record.UfActiveRecordCriteria; +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import java.util.Map; +import java.util.UUID; +@Controller +public class UfApiUser extends UfApiControllerBase { + @ResponseBody + @RequestMapping("/api/user/login") + public UfApiResponse login(@RequestBody Map params) { + String account = (String)params.get("account"); + String password = (String)params.get("password"); + + var user = UfActiveRecord.findOne(UfMdbUser.class, Map.of("account", account)); + if ( null == user || !user.matchPassword(password) ) { + return this.error("无效的账号或密码"); + } + + user.accessToken = UUID.randomUUID().toString(); + user.accessTokenExpiredAt = (int)(System.currentTimeMillis() / 1000) + 3600 * 24; + user.save(); + return this.success(Map.of( + "accessToken", user.accessToken, + "accessTokenExpiredAt", user.accessTokenExpiredAt + )); + } + + @ResponseBody + @RequestMapping("/api/user/logout") + public UfApiResponse logout( HttpServletRequest request ) { + String accessToken = request.getHeader("App-Access-Token"); + var user = UfActiveRecord.findOne(UfMdbUser.class, Map.of("accessToken", accessToken)); + if ( null == user ) { + return this.success(); + } + + user.accessToken = ""; + user.accessTokenExpiredAt = 0; + user.save(); + return this.success(); + } + + @ResponseBody + @PostMapping("/api/user/save") + public UfApiResponse save( HttpServletRequest request, @RequestBody Map params ) { + UfMdbUser curUser = this.getUserFromRequest(request); + String id = (String)params.get("id"); + Map data = (Map)params.get("data"); + + var user = new UfMdbUser(); + user.password = ""; + user.salt = UUID.randomUUID().toString().substring(0, 8); + user.createdAt = (int)(System.currentTimeMillis() / 1000); + user.createdBy = curUser.id; + if ( null != id ) { + user = UfActiveRecord.findOne(UfMdbUser.class, id); + } + + user.setAttributes(data); + user.save(); + return this.success(); + } + + @ResponseBody + @PostMapping("/api/user/delete") + public UfApiResponse delete( @RequestBody Map params ) { + String id = (String)params.get("id"); + var user = UfActiveRecord.findOne(UfMdbUser.class, id); + if ( null == user ) { + return this.success(); + } + + user.delete(); + return this.success(); + } + + @ResponseBody + @PostMapping("/api/user/password-update") + public UfApiResponse updatePassword( @RequestBody Map params ) { + String id = (String)params.get("id"); + String password = (String)params.get("password"); + var user = UfActiveRecord.findOne(UfMdbUser.class, id); + if ( null == user ) { + return this.error("无效的用户"); + } + user.password = user.hashPassword(password); + user.save(); + return this.success(); + } + + @ResponseBody + @RequestMapping("/api/user/list") + public UfApiResponse list() { + var criteria = new UfActiveRecordCriteria(); + criteria.limit = 10; + var users = UfActiveRecord.find(UfMdbUser.class, criteria); + return this.success(Map.of("list",users)); + } + + @ResponseBody + @RequestMapping("/api/user/current-get") + public UfApiResponse currentGet( HttpServletRequest request ) { + String accessToken = request.getHeader("App-Access-Token"); + var user = UfActiveRecord.findOne(UfMdbUser.class, Map.of("accessToken", accessToken)); + return this.success(user); + } +} diff --git a/src/main/java/com/iflytop/digester/underframework/dao/model/UfMdbUser.java b/src/main/java/com/iflytop/digester/underframework/dao/model/UfMdbUser.java new file mode 100644 index 0000000..506da4c --- /dev/null +++ b/src/main/java/com/iflytop/digester/underframework/dao/model/UfMdbUser.java @@ -0,0 +1,51 @@ +package com.iflytop.digester.underframework.dao.model; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.iflytop.digester.underframework.dao.record.UfActiveRecord; +import com.iflytop.digester.underframework.dao.record.UfActiveRecordField; +import org.springframework.util.DigestUtils; +public class UfMdbUser extends UfActiveRecord { + @UfActiveRecordField + public String account; + + @JsonIgnore + @UfActiveRecordField + public String password; + + @JsonIgnore + @UfActiveRecordField + public String salt; + + @UfActiveRecordField + public Integer isAdmin; + + @UfActiveRecordField + public Integer createdAt; + + @UfActiveRecordField + public String createdBy; + + @JsonIgnore + @UfActiveRecordField + public String accessToken; + + @JsonIgnore + @UfActiveRecordField + public Integer accessTokenExpiredAt; + + // get table name + public static String getTableName() { + return "app_users"; + } + + // check if password matches + public Boolean matchPassword(String password) { + String hash = this.hashPassword(password); + return this.password.equals(hash); + } + + // hash password + public String hashPassword(String password) { + String salt = this.salt; + return DigestUtils.md5DigestAsHex((salt + password + salt).getBytes()); + } +} diff --git a/src/main/java/com/iflytop/digester/underframework/web/api/TsApiActuator.java b/src/main/java/com/iflytop/digester/underframework/web/api/TsApiActuator.java deleted file mode 100644 index 2c2800f..0000000 --- a/src/main/java/com/iflytop/digester/underframework/web/api/TsApiActuator.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.iflytop.digester.underframework.web.api; -import com.iflytop.digester.underframework.dao.record.UfActiveRecord; -import com.iflytop.digester.underframework.dao.record.UfActiveRecordCriteria; -import com.iflytop.digester.underframework.dao.model.TsMdbActuator; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.ResponseBody; -import java.util.Map; -@Controller -public class TsApiActuator extends UfApiControllerBase { - @PostMapping("/api/actuator/list") - @ResponseBody - public UfApiResponse list(@RequestBody Map params) { - String moduleId = (String) params.get("moduleId"); - var criteria = new UfActiveRecordCriteria(); - criteria.conditions = Map.of("moduleId", moduleId); - var items = UfActiveRecord.find(TsMdbActuator.class, criteria); - return success(items); - } - - @PostMapping("/api/actuator/save") - @ResponseBody - public UfApiResponse save(@RequestBody TsMdbActuator actuator ) { - if ( null != actuator.id ) { - actuator.isNewRecord = false; - } - actuator.save(); - return success(); - } - - @PostMapping("/api/actuator/delete") - @ResponseBody - public UfApiResponse delete(@RequestBody TsMdbActuator actuator ) { - actuator.delete(); - return success(); - } -} diff --git a/src/main/java/com/iflytop/digester/underframework/web/api/TsApiActuatorCommand.java b/src/main/java/com/iflytop/digester/underframework/web/api/TsApiActuatorCommand.java deleted file mode 100644 index 19e2aea..0000000 --- a/src/main/java/com/iflytop/digester/underframework/web/api/TsApiActuatorCommand.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.iflytop.digester.underframework.web.api; -import com.iflytop.digester.underframework.UfActuatorCmdExecutor; -import com.iflytop.digester.underframework.UfApplication; -import com.iflytop.digester.underframework.dao.record.UfActiveRecord; -import com.iflytop.digester.underframework.dao.record.UfActiveRecordCriteria; -import com.iflytop.digester.underframework.dao.model.UfMdbActuatorCmd; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.ResponseBody; -import java.util.Map; -@Controller -public class TsApiActuatorCommand extends UfApiControllerBase { - @PostMapping("/api/actuator-cmd/list") - @ResponseBody - public UfApiResponse list(@RequestBody Map params) { - String actuatorId = (String) params.get("actuatorId"); - var criteria = new UfActiveRecordCriteria(); - criteria.conditions = Map.of("actuatorId", actuatorId); - var items = UfActiveRecord.find(UfMdbActuatorCmd.class, criteria); - return success(items); - } - - @PostMapping("/api/actuator-cmd/save") - @ResponseBody - public UfApiResponse save(@RequestBody UfMdbActuatorCmd actuatorCmd ) { - if ( null != actuatorCmd.id ) { - actuatorCmd.isNewRecord = false; - } - actuatorCmd.save(); - return success(); - } - - @PostMapping("/api/actuator-cmd/delete") - @ResponseBody - public UfApiResponse delete(@RequestBody UfMdbActuatorCmd actuatorCmd ) { - actuatorCmd.delete(); - return success(); - } - - @PostMapping("/api/actuator-cmd/execute") - @ResponseBody - public UfApiResponse execute(@RequestBody UfMdbActuatorCmd actuatorCmd ) { - try { - String result = UfActuatorCmdExecutor.execute(actuatorCmd); - return success(Map.of("result", result)); - } catch ( Exception e ) { - return error(e.getMessage()); - } - } - - @PostMapping("/api/actuator-cmd/connection-list") - @ResponseBody - public UfApiResponse connectionList() { - var connections = UfApplication.getApp().connections; - return success(connections.getConnections()); - } -} diff --git a/src/main/java/com/iflytop/digester/underframework/web/api/TsApiModule.java b/src/main/java/com/iflytop/digester/underframework/web/api/TsApiModule.java deleted file mode 100644 index 278e8ee..0000000 --- a/src/main/java/com/iflytop/digester/underframework/web/api/TsApiModule.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.iflytop.digester.underframework.web.api; -import com.iflytop.digester.underframework.dao.record.UfActiveRecord; -import com.iflytop.digester.underframework.dao.model.TsMdbModule; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.ResponseBody; -@Controller -public class TsApiModule extends UfApiControllerBase { - @PostMapping("/api/module/list") - @ResponseBody - public UfApiResponse list() { - var items = UfActiveRecord.find(TsMdbModule.class); - return success(items); - } - - @PostMapping("/api/module/save") - @ResponseBody - public UfApiResponse save(@RequestBody TsMdbModule module ) { - if ( null != module.id ) { - module.isNewRecord = false; - } - module.save(); - return success(); - } - - @PostMapping("/api/module/delete") - @ResponseBody - public UfApiResponse delete(@RequestBody TsMdbModule module ) { - module.delete(); - return success(); - } -} diff --git a/src/main/java/com/iflytop/digester/underframework/web/api/TsApiSnippet.java b/src/main/java/com/iflytop/digester/underframework/web/api/TsApiSnippet.java deleted file mode 100644 index dcc87f0..0000000 --- a/src/main/java/com/iflytop/digester/underframework/web/api/TsApiSnippet.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.iflytop.digester.underframework.web.api; -import com.iflytop.digester.underframework.UfCmdSnippetExecutor; -import com.iflytop.digester.underframework.dao.record.UfActiveRecord; -import com.iflytop.digester.underframework.dao.model.UfMdbSnippet; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.ResponseBody; - -import java.util.HashMap; -import java.util.Map; -@Controller -public class TsApiSnippet extends UfApiControllerBase { - @PostMapping("/api/snippet/list") - @ResponseBody - public UfApiResponse list() { - var items = UfActiveRecord.find(UfMdbSnippet.class); - return success(items); - } - - @PostMapping("/api/snippet/save") - @ResponseBody - public UfApiResponse save(@RequestBody UfMdbSnippet snippet ) { - if ( null != snippet.id ) { - snippet.isNewRecord = false; - } - snippet.save(); - return success(); - } - - @PostMapping("/api/snippet/delete") - @ResponseBody - public UfApiResponse delete(@RequestBody UfMdbSnippet snippet ) { - snippet.delete(); - return success(); - } - - @PostMapping("/api/snippet/execute") - @ResponseBody - public UfApiResponse execute(@RequestBody UfMdbSnippet snippet ) { - try { - snippet = UfActiveRecord.findOne(UfMdbSnippet.class, snippet.id); - UfCmdSnippetExecutor.execute(snippet.key); - } catch ( Exception e ) { - return error(e.getMessage()); - } - return success(); - } - - @PostMapping("/api/snippet/execute-step") - @ResponseBody - public UfApiResponse executeStep(@RequestBody Map params ) { - try { - String cmdId = (String)params.get("cmdId"); - String cmdParams = (String)params.get("cmdParams"); - - var executor = new UfCmdSnippetExecutor(null, new HashMap<>()); - executor.executeStep(cmdId, cmdParams); - } catch ( Exception e ) { - return error(e.getMessage()); - } - return success(); - } -} diff --git a/src/main/java/com/iflytop/digester/underframework/web/api/UfApiControllerBase.java b/src/main/java/com/iflytop/digester/underframework/web/api/UfApiControllerBase.java deleted file mode 100644 index 7f3c31f..0000000 --- a/src/main/java/com/iflytop/digester/underframework/web/api/UfApiControllerBase.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.iflytop.digester.underframework.web.api; -abstract public class UfApiControllerBase { - /** - * success response - * @return ApiResponse - */ - protected UfApiResponse success() { - UfApiResponse response = new UfApiResponse(); - response.success = true; - response.message = "OK"; - response.code = "OK"; - return response; - } - - /** - * success response with data - * @param data - data to be returned - * @return ApiResponse - */ - protected UfApiResponse success(Object data) { - UfApiResponse response = new UfApiResponse(); - response.success = true; - response.message = "OK"; - response.code = "OK"; - response.data = data; - return response; - } - - /** - * error response - * @param message - error message - * @return ApiResponse - */ - protected UfApiResponse error(String message) { - UfApiResponse response = new UfApiResponse(); - response.success = false; - response.message = message; - return response; - } - - /** - * error response with code - * @param message - error message - * @param code - error code - * @return ApiResponse - */ - protected UfApiResponse error(String message, String code ) { - UfApiResponse response = new UfApiResponse(); - response.success = false; - response.message = message; - response.code = code; - return response; - } -} diff --git a/src/main/java/com/iflytop/digester/underframework/web/api/UfApiResponse.java b/src/main/java/com/iflytop/digester/underframework/web/api/UfApiResponse.java deleted file mode 100644 index 4d0a06a..0000000 --- a/src/main/java/com/iflytop/digester/underframework/web/api/UfApiResponse.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.iflytop.digester.underframework.web.api; -public class UfApiResponse { - // success or not - public boolean success; - // error code - public String code; - // message - public String message; - // data - public Object data; -} diff --git a/web b/web index 6c2047a..5a0d772 160000 --- a/web +++ b/web @@ -1 +1 @@ -Subproject commit 6c2047a06153a3328abbf4332dd3f012ae024b77 +Subproject commit 5a0d77238339189b0fc83e950c0f12d02fff9d2d