From df700fb8724dc51666d784ac68d6d87bda87aa4a Mon Sep 17 00:00:00 2001 From: r0n1n7an Date: Wed, 27 Nov 2024 16:06:03 +0800 Subject: [PATCH] /racs/getfaillist api support accept parameters as database query filters --- APIServer.go | 16 +++++++++++++++- APIServer.yml | 3 ++- cnf/cnf.go | 26 ++++++++++++++++---------- racs/racs.go | 30 +++++++++++++++++++++--------- 4 files changed, 54 insertions(+), 21 deletions(-) diff --git a/APIServer.go b/APIServer.go index 0af390d..2f2093f 100644 --- a/APIServer.go +++ b/APIServer.go @@ -575,10 +575,24 @@ func handleRacsGetFailList(w http.ResponseWriter, r *http.Request) { if r.RequestURI == "/favicon.ico" { return } + + var err error addr := strings.Split(r.RemoteAddr, ":")[0] uri := r.RequestURI + rst := map[string]interface{}{"Result": "OK", "ErrMsg": ""} + + params, err := parseReqParams(r) + if err != nil { + rst["Result"] = "NG" + rst["ErrMsg"] = "racs.HandleGetFailList: " + err.Error() + logger.Printf("[ERR] %s; %s; %#v; %s\r\n", r.RemoteAddr, r.RequestURI, params, rst["ErrMsg"]) + w.WriteHeader(http.StatusBadRequest) + fmt.Fprintf(w, "%v", strings.ReplaceAll(fmt.Sprintf("%#v", rst), "map[string]string", "")) + return + } + racs := new(racs.RACS) - rst := racs.GetFailList(cfg, logger, addr, uri) + rst = racs.GetFailList(cfg, logger, addr, uri, params) rpl := strings.NewReplacer( "map[string]string", "", "map[string]interface {}", "", diff --git a/APIServer.yml b/APIServer.yml index dac17dd..d483a83 100644 --- a/APIServer.yml +++ b/APIServer.yml @@ -18,4 +18,5 @@ MySQL: OfflineView: v_offline StorageTable: racs GetFailListSQL: SELECT * FROM v_racs - + GetFailListParams: + - {"Param":"LINE", "Column":"Tab_Line"} diff --git a/cnf/cnf.go b/cnf/cnf.go index 69288fa..ddedd47 100644 --- a/cnf/cnf.go +++ b/cnf/cnf.go @@ -5,6 +5,11 @@ type Cfg struct { MySQL MySQL `yaml:"MySQL"` } +type Param2Column struct { + Param string `yaml:"Param"` + Column string `yaml:"Column"` +} + type Settings struct { ListenPort string `yaml:"ListenPort"` HookScript string `yaml:"HookScript"` @@ -16,14 +21,15 @@ type Settings struct { } type MySQL struct { - Server string `yaml:"Server"` - Port string `yaml:"Port"` - Database string `yaml:"Database"` - User string `yaml:"User"` - Password string `yaml:"Password"` - IssuesTable string `yaml:"IssuesTable"` - IssuesView string `yaml:"IssuesView"` - OfflineView string `yaml:"OfflineView"` - StorageTable string `yaml:"StorageTable"` - GetFailListSQL string `yaml:"GetFailListSQL"` + Server string `yaml:"Server"` + Port string `yaml:"Port"` + Database string `yaml:"Database"` + User string `yaml:"User"` + Password string `yaml:"Password"` + IssuesTable string `yaml:"IssuesTable"` + IssuesView string `yaml:"IssuesView"` + OfflineView string `yaml:"OfflineView"` + StorageTable string `yaml:"StorageTable"` + GetFailListSQL string `yaml:"GetFailListSQL"` + GetFailListParams []Param2Column `yaml:"GetFailListParams"` } diff --git a/racs/racs.go b/racs/racs.go index bb9e5a9..49142af 100644 --- a/racs/racs.go +++ b/racs/racs.go @@ -5,19 +5,12 @@ import ( "database/sql" "fmt" "log" + "strings" _ "github.com/go-sql-driver/mysql" ) type RACS struct{} -type StorageInfo struct { - USN string - Storage string - UpdateTime string - Mark1 string - Mark2 string - Mark3 string -} func (r *RACS) Inbound(cfg cnf.Cfg, logger *log.Logger, addr string, uri string, params map[string]string) map[string]string { rst := map[string]string{"Result": "OK", "ErrMsg": ""} @@ -105,7 +98,7 @@ func (r *RACS) Outbound(cfg cnf.Cfg, logger *log.Logger, addr string, uri string return rst } -func (r *RACS) GetFailList(cfg cnf.Cfg, logger *log.Logger, addr string, uri string) map[string]interface{} { +func (r *RACS) GetFailList(cfg cnf.Cfg, logger *log.Logger, addr string, uri string, params map[string]string) map[string]interface{} { rst := map[string]interface{}{"Result": "OK", "ErrMsg": ""} dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", cfg.MySQL.User, @@ -122,7 +115,26 @@ func (r *RACS) GetFailList(cfg cnf.Cfg, logger *log.Logger, addr string, uri str return rst } defer dbo.Close() + dml := cfg.MySQL.GetFailListSQL + if len(params) > 0 { + dml = dml + " WHERE " + for k, v := range params { + trans := false + for _, p := range cfg.MySQL.GetFailListParams { + if k == p.Param { + dml = dml + fmt.Sprintf("%s='%s' AND ", p.Column, v) + trans = true + break + } + } + if !trans { + dml = dml + fmt.Sprintf("%s='%s' AND ", k, v) + } + } + } + dml = strings.TrimSuffix(dml, " AND ") + qry, err := dbo.Query(dml) if err != nil { rst["Result"] = "NG"