@@ -10,10 +10,12 @@ import (
10
10
"io"
11
11
"mime"
12
12
"net/http"
13
+ "strconv"
13
14
"strings"
14
15
15
16
"github.com/actiontech/sqle/sqle/api/controller"
16
17
"github.com/actiontech/sqle/sqle/dms"
18
+ "github.com/actiontech/sqle/sqle/driver"
17
19
"github.com/actiontech/sqle/sqle/driver/mysql/plocale"
18
20
rulepkg "github.com/actiontech/sqle/sqle/driver/mysql/rule"
19
21
driverV2 "github.com/actiontech/sqle/sqle/driver/v2"
@@ -29,7 +31,7 @@ type CreateRuleTemplateReqV1 struct {
29
31
Name string `json:"rule_template_name" valid:"required,name"`
30
32
Desc string `json:"desc"`
31
33
DBType string `json:"db_type" valid:"required"`
32
- RuleVersion string `json:"rule_version"`
34
+ RuleVersion uint32 `json:"rule_version"`
33
35
RuleList []RuleReqV1 `json:"rule_list" form:"rule_list" valid:"required,dive,required"`
34
36
}
35
37
@@ -62,6 +64,9 @@ func checkAndGenerateRules(rulesReq []RuleReqV1, template *model.RuleTemplate) (
62
64
templateRules := make ([]model.RuleTemplateRule , 0 , len (rulesReq ))
63
65
for _ , r := range rulesReq {
64
66
rule := rules [r .Name ]
67
+ if rule .Version != template .RuleVersion {
68
+ return nil , fmt .Errorf ("rule version of %s is not matched with the rule template" , r .Name )
69
+ }
65
70
params := rule .Params
66
71
67
72
// check request params is equal rule params.
@@ -85,10 +90,11 @@ func checkAndGenerateRules(rulesReq []RuleReqV1, template *model.RuleTemplate) (
85
90
}
86
91
}
87
92
templateRules = append (templateRules , model .NewRuleTemplateRule (template , & model.Rule {
88
- Name : r .Name ,
89
- Level : r .Level ,
90
- DBType : template .DBType ,
91
- Params : params ,
93
+ Name : r .Name ,
94
+ Level : r .Level ,
95
+ DBType : template .DBType ,
96
+ Params : params ,
97
+ Version : template .RuleVersion ,
92
98
}))
93
99
}
94
100
return templateRules , nil
@@ -278,7 +284,7 @@ type RuleTemplateDetailResV1 struct {
278
284
Name string `json:"rule_template_name"`
279
285
Desc string `json:"desc"`
280
286
DBType string `json:"db_type"`
281
- RuleVersion string `json:"rule_version"`
287
+ RuleVersion uint32 `json:"rule_version"`
282
288
RuleList []RuleResV1 `json:"rule_list,omitempty"`
283
289
}
284
290
@@ -405,7 +411,7 @@ type RuleTemplateResV1 struct {
405
411
Name string `json:"rule_template_name"`
406
412
Desc string `json:"desc"`
407
413
DBType string `json:"db_type"`
408
- RuleVersion string `json:"rule_version"`
414
+ RuleVersion uint32 `json:"rule_version"`
409
415
}
410
416
411
417
// @Summary 全局规则模板列表
@@ -469,7 +475,7 @@ type GetRulesReqV1 struct {
469
475
FilterDBType string `json:"filter_db_type" query:"filter_db_type"`
470
476
FilterGlobalRuleTemplateName string `json:"filter_global_rule_template_name" query:"filter_global_rule_template_name"`
471
477
FilterRuleNames string `json:"filter_rule_names" query:"filter_rule_names"`
472
- FilterRuleVersion string `json:"filter_rule_version" query:"filter_rule_version"`
478
+ FilterRuleVersion uint32 `json:"filter_rule_version" query:"filter_rule_version"`
473
479
FuzzyKeywordRule string `json:"fuzzy_keyword_rule" query:"fuzzy_keyword_rule"`
474
480
Tags string `json:"tags" query:"tags"`
475
481
}
@@ -584,7 +590,7 @@ func convertRulesToRes(ctx context.Context, rules interface{}) []RuleResV1 {
584
590
// @Param fuzzy_keyword_rule query string false "fuzzy rule,keyword for desc and annotation"
585
591
// @Param filter_global_rule_template_name query string false "filter global rule template name"
586
592
// @Param filter_rule_names query string false "filter rule name list"
587
- // @Param filter_rule_version query string false "filter rule version"
593
+ // @Param filter_rule_version query uint32 false "filter rule version"
588
594
// @Param tags query string false "filter tags"
589
595
// @Success 200 {object} v1.GetRulesResV1
590
596
// @router /v1/rules [get]
@@ -629,6 +635,39 @@ func GetRules(c echo.Context) error {
629
635
})
630
636
}
631
637
638
+ type GetDriverRuleVersionTipsResV1 struct {
639
+ controller.BaseRes
640
+ Data []GetDriverRuleVersionTipsV1 `json:"data"`
641
+ }
642
+
643
+ type GetDriverRuleVersionTipsV1 struct {
644
+ DBType string `json:"db_type" example:"mysql"`
645
+ RuleVersions []uint32 `json:"rule_versions"`
646
+ }
647
+
648
+ // @Summary 获取插件包含的规则版本
649
+ // @Description get the rule versions contained in plugins
650
+ // @Id GetDriverRuleVersionTips
651
+ // @Tags rule_template
652
+ // @Security ApiKeyAuth
653
+ // @Success 200 {object} v1.GetDriverRuleVersionTipsResV1
654
+ // @router /v1/rules_version_tips [get]
655
+ func GetDriverRuleVersionTips (c echo.Context ) error {
656
+ metas := driver .GetPluginManager ().AllDriverMetas ()
657
+ data := make ([]GetDriverRuleVersionTipsV1 , 0 , len (metas ))
658
+ for _ , v := range metas {
659
+ data = append (data , GetDriverRuleVersionTipsV1 {
660
+ DBType : v .PluginName ,
661
+ RuleVersions : v .RuleVersionIncluded ,
662
+ })
663
+ }
664
+
665
+ return c .JSON (http .StatusOK , & GetDriverRuleVersionTipsResV1 {
666
+ BaseRes : controller .NewBaseReq (nil ),
667
+ Data : data ,
668
+ })
669
+ }
670
+
632
671
// GetCategoryStatistics
633
672
// @Summary 获取规则分类统计信息
634
673
// @Description get all rule category statistics
@@ -682,7 +721,7 @@ type RuleTemplateTipResV1 struct {
682
721
ID string `json:"rule_template_id"`
683
722
Name string `json:"rule_template_name"`
684
723
DBType string `json:"db_type"`
685
- RuleVersion string `json:"rule_version"`
724
+ RuleVersion uint32 `json:"rule_version"`
686
725
IsDefaultRuleTemplate bool `json:"is_default_rule_template"`
687
726
}
688
727
@@ -815,7 +854,7 @@ type CreateProjectRuleTemplateReqV1 struct {
815
854
Name string `json:"rule_template_name" valid:"required,name"`
816
855
Desc string `json:"desc"`
817
856
DBType string `json:"db_type" valid:"required"`
818
- RuleVersion string `json:"rule_version"`
857
+ RuleVersion uint32 `json:"rule_version"`
819
858
RuleList []RuleReqV1 `json:"rule_list" form:"rule_list" valid:"required,dive,required"`
820
859
}
821
860
@@ -983,7 +1022,7 @@ type RuleProjectTemplateDetailResV1 struct {
983
1022
Name string `json:"rule_template_name"`
984
1023
Desc string `json:"desc"`
985
1024
DBType string `json:"db_type"`
986
- RuleVersion string `json:"rule_version"`
1025
+ RuleVersion uint32 `json:"rule_version"`
987
1026
RuleList []RuleResV1 `json:"rule_list,omitempty"`
988
1027
}
989
1028
@@ -1304,7 +1343,7 @@ type ParseProjectRuleTemplateFileResDataV1 struct {
1304
1343
Name string `json:"name"`
1305
1344
Desc string `json:"desc"`
1306
1345
DBType string `json:"db_type"`
1307
- RuleVersion string `json:"rule_version"`
1346
+ RuleVersion uint32 `json:"rule_version"`
1308
1347
RuleList []RuleResV1 `json:"rule_list"`
1309
1348
}
1310
1349
@@ -1349,19 +1388,8 @@ var ErrRule = e.New("rule has error")
1349
1388
1350
1389
func checkRuleList (file * ParseProjectRuleTemplateFileResDataV1 ) (* RuleTemplateExportErr , error ) {
1351
1390
ruleNameList := make ([]string , 0 , len (file .RuleList ))
1352
- var hasNewRule , hasOldRule bool
1353
1391
for _ , rule := range file .RuleList {
1354
1392
ruleNameList = append (ruleNameList , rule .Name )
1355
- if file .DBType == driverV2 .DriverTypeMySQL {
1356
- hasNewRule = hasNewRule || strings .HasPrefix (rule .Name , "SQLE" )
1357
- hasOldRule = hasOldRule || ! strings .HasPrefix (rule .Name , "SQLE" )
1358
- if hasOldRule && hasNewRule {
1359
- return nil , fmt .Errorf ("cannot import rule template that contains both old and new rules" )
1360
- }
1361
- if hasNewRule {
1362
- file .RuleVersion = "v2"
1363
- }
1364
- }
1365
1393
}
1366
1394
1367
1395
s := model .GetStorage ()
@@ -1372,6 +1400,7 @@ func checkRuleList(file *ParseProjectRuleTemplateFileResDataV1) (*RuleTemplateEx
1372
1400
1373
1401
ruleTemplateExport := new (RuleTemplateExportErr )
1374
1402
ruleTemplateExport .Name = file .Name
1403
+ ruleTemplateExport .RuleVersion = file .RuleVersion
1375
1404
ruleTemplateExport .DBType = file .DBType
1376
1405
ruleTemplateExport .Desc = file .Desc
1377
1406
ruleTemplateExport .RuleList = make ([]RuleTemplateResErr , len (file .RuleList ))
@@ -1456,10 +1485,15 @@ func parseRuleTemplate(c echo.Context, fileType ExportType) (*ParseProjectRuleTe
1456
1485
}
1457
1486
1458
1487
// 因为wps保存csv文件时会自动填充短的列的个数,所以使用 >= 符号作比较,避免解析csv文件错误
1459
- if len (rule ) >= 3 && index == 1 {
1488
+ if len (rule ) >= 4 && index == 1 {
1489
+ v , err := strconv .Atoi (rule [1 ])
1490
+ if err != nil {
1491
+ return nil , fmt .Errorf ("parse rule version err: %w" , err )
1492
+ }
1460
1493
resp .Name = rule [0 ]
1461
- resp .Desc = rule [1 ]
1462
- resp .DBType = rule [2 ]
1494
+ resp .RuleVersion = uint32 (v )
1495
+ resp .Desc = rule [2 ]
1496
+ resp .DBType = rule [3 ]
1463
1497
index ++
1464
1498
continue
1465
1499
}
@@ -1529,6 +1563,7 @@ func parseRuleTemplate(c echo.Context, fileType ExportType) (*ParseProjectRuleTe
1529
1563
return nil , fmt .Errorf ("the file format is incorrect. Please check the uploaded file, error: %v" , err )
1530
1564
}
1531
1565
resp .Name = ruleTemplateExport .Name
1566
+ resp .RuleVersion = ruleTemplateExport .RuleVersion
1532
1567
resp .Desc = ruleTemplateExport .Desc
1533
1568
resp .DBType = ruleTemplateExport .DBType
1534
1569
err = ruleTemplateExportToParseDataV1 (ruleTemplateExport , resp )
@@ -1571,6 +1606,7 @@ func parseRuleCategory(csvRule []string) map[string][]string {
1571
1606
1572
1607
func ruleTemplateExportToParseDataV1 (ruleTemplateExport * RuleTemplateExport , parseResData * ParseProjectRuleTemplateFileResDataV1 ) error {
1573
1608
parseResData .Name = ruleTemplateExport .Name
1609
+ parseResData .RuleVersion = ruleTemplateExport .RuleVersion
1574
1610
parseResData .Desc = ruleTemplateExport .Desc
1575
1611
parseResData .DBType = ruleTemplateExport .DBType
1576
1612
for _ , rule := range ruleTemplateExport .RuleList {
@@ -1671,7 +1707,7 @@ func ExportRuleTemplateFile(c echo.Context) error {
1671
1707
func exportTemplateFile (c echo.Context , exportType ExportType , templateFile interface {}, templateName string ) error {
1672
1708
switch exportType {
1673
1709
case CsvExportType :
1674
- var name , desc , dbType string
1710
+ var name , ruleVersion , desc , dbType string
1675
1711
var columnNameList []string
1676
1712
var columnContentList [][]string
1677
1713
@@ -1714,6 +1750,7 @@ func exportTemplateFile(c echo.Context, exportType ExportType, templateFile inte
1714
1750
1715
1751
if ruleTemplateExport , ok := templateFile .(* RuleTemplateExport ); ok {
1716
1752
name = ruleTemplateExport .Name
1753
+ ruleVersion = fmt .Sprint (ruleTemplateExport .RuleVersion )
1717
1754
desc = ruleTemplateExport .Desc
1718
1755
dbType = ruleTemplateExport .DBType
1719
1756
columnNameList = defaultColumnNameList
@@ -1727,6 +1764,7 @@ func exportTemplateFile(c echo.Context, exportType ExportType, templateFile inte
1727
1764
}
1728
1765
} else if ruleTemplateExportErr , ok := templateFile .(* RuleTemplateExportErr ); ok {
1729
1766
name = ruleTemplateExportErr .Name
1767
+ ruleVersion = fmt .Sprint (ruleTemplateExportErr .RuleVersion )
1730
1768
desc = ruleTemplateExportErr .Desc
1731
1769
dbType = ruleTemplateExportErr .DBType
1732
1770
columnNameList = append (defaultColumnNameList , locale .Bundle .LocalizeMsgByCtx (ctx , locale .RuleTemplateRuleErr ))
@@ -1752,9 +1790,10 @@ func exportTemplateFile(c echo.Context, exportType ExportType, templateFile inte
1752
1790
writer := csv .NewWriter (buf )
1753
1791
err := writer .WriteAll ([][]string {{
1754
1792
locale .Bundle .LocalizeMsgByCtx (ctx , locale .RuleTemplateName ),
1793
+ locale .Bundle .LocalizeMsgByCtx (ctx , locale .RuleTemplateRuleVersion ),
1755
1794
locale .Bundle .LocalizeMsgByCtx (ctx , locale .RuleTemplateDesc ),
1756
1795
locale .Bundle .LocalizeMsgByCtx (ctx , locale .RuleTemplateInstType ),
1757
- }, {name , desc , dbType }})
1796
+ }, {name , ruleVersion , desc , dbType }})
1758
1797
if err != nil {
1759
1798
return controller .JSONBaseErrorReq (c , err )
1760
1799
}
@@ -1828,9 +1867,10 @@ type RuleTemplateExport struct {
1828
1867
}
1829
1868
1830
1869
type RuleTemplate struct {
1831
- Name string
1832
- Desc string
1833
- DBType string `json:"db_type"`
1870
+ Name string
1871
+ RuleVersion uint32
1872
+ Desc string
1873
+ DBType string `json:"db_type"`
1834
1874
}
1835
1875
1836
1876
type RuleTemplateRes struct {
@@ -1880,9 +1920,10 @@ func getRuleTemplateFile(ctx context.Context, projectID string, ruleTemplateName
1880
1920
1881
1921
resp := & RuleTemplateExport {
1882
1922
RuleTemplate : RuleTemplate {
1883
- Name : template .Name ,
1884
- Desc : template .Desc ,
1885
- DBType : template .DBType ,
1923
+ Name : template .Name ,
1924
+ RuleVersion : template .RuleVersion ,
1925
+ Desc : template .Desc ,
1926
+ DBType : template .DBType ,
1886
1927
},
1887
1928
RuleList : []RuleTemplateRes {},
1888
1929
}
0 commit comments