Skip to content

Commit a8cc782

Browse files
authored
Merge pull request #715 from chaitin/fix/rule-version-sequence
fix: 规则扩展包导入使用时间版本号
2 parents 6a9cc1d + 7dc5c5c commit a8cc782

2 files changed

Lines changed: 52 additions & 6 deletions

File tree

backend/biz/team/usecase/extension_package_rules.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package usecase
33
import (
44
"context"
55
"fmt"
6+
"time"
67

78
"github.com/google/uuid"
89

@@ -16,6 +17,9 @@ type extensionRuleImporter struct {
1617
db *db.Client
1718
}
1819

20+
// VersionFormat is the time layout for rule version identifiers: yyyymmddhhmmss.
21+
const VersionFormat = "20060102150405"
22+
1923
func (i *extensionRuleImporter) ImportRules(ctx context.Context, userID uuid.UUID, pkg *parsedExtensionPackage) (domain.ExtensionRuleImportResult, error) {
2024
var result domain.ExtensionRuleImportResult
2125
for _, item := range pkg.Rules {
@@ -44,7 +48,7 @@ func (i *extensionRuleImporter) importRule(ctx context.Context, userID uuid.UUID
4448
return false, err
4549
}
4650
if existingBySource != nil {
47-
version, err := i.createRuleVersion(ctx, existingBySource.ID, pkg.Version, item.Content)
51+
version, err := i.createRuleVersion(ctx, existingBySource.ID, item.Content)
4852
if err != nil {
4953
return false, err
5054
}
@@ -85,22 +89,22 @@ func (i *extensionRuleImporter) importRule(ctx context.Context, userID uuid.UUID
8589
if err != nil {
8690
return false, err
8791
}
88-
version, err := i.createRuleVersion(ctx, rule.ID, pkg.Version, item.Content)
92+
version, err := i.createRuleVersion(ctx, rule.ID, item.Content)
8993
if err != nil {
9094
return false, err
9195
}
9296
_, err = i.db.AgentRule.UpdateOneID(rule.ID).SetActiveVersionID(version.ID).Save(ctx)
9397
return true, err
9498
}
9599

96-
func (i *extensionRuleImporter) createRuleVersion(ctx context.Context, ruleID uuid.UUID, version, content string) (*db.AgentRuleVersion, error) {
97-
if len(version) > 14 {
98-
version = version[:14]
99-
}
100+
func (i *extensionRuleImporter) createRuleVersion(ctx context.Context, ruleID uuid.UUID, content string) (*db.AgentRuleVersion, error) {
101+
now := time.Now()
102+
version := now.UTC().Format(VersionFormat)
100103
return i.db.AgentRuleVersion.Create().
101104
SetID(uuid.New()).
102105
SetRuleID(ruleID).
103106
SetVersion(version).
104107
SetContent(content).
108+
SetCreatedAt(now).
105109
Save(ctx)
106110
}

backend/biz/team/usecase/extension_package_rules_test.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ package usecase
22

33
import (
44
"context"
5+
"strings"
56
"testing"
7+
"time"
68

79
"github.com/google/uuid"
810
_ "github.com/mattn/go-sqlite3"
@@ -57,6 +59,14 @@ func TestExtensionRuleImporterCreatesGlobalRule(t *testing.T) {
5759
if rule.ActiveVersionID == nil {
5860
t.Fatal("active version id is nil")
5961
}
62+
version, err := client.AgentRuleVersion.Get(ctx, *rule.ActiveVersionID)
63+
if err != nil {
64+
t.Fatal(err)
65+
}
66+
assertRuleVersionFormat(t, version.Version)
67+
if version.Version == pkg.Version {
68+
t.Fatalf("rule version should not use package version %q", pkg.Version)
69+
}
6070
}
6171

6272
func TestExtensionRuleImporterUpdatesSamePackageRule(t *testing.T) {
@@ -93,6 +103,28 @@ func TestExtensionRuleImporterUpdatesSamePackageRule(t *testing.T) {
93103
if count != 2 {
94104
t.Fatalf("version count = %d", count)
95105
}
106+
versions, err := client.AgentRuleVersion.Query().All(ctx)
107+
if err != nil {
108+
t.Fatal(err)
109+
}
110+
for _, version := range versions {
111+
assertRuleVersionFormat(t, version.Version)
112+
if strings.HasPrefix(version.Version, "1.0.") {
113+
t.Fatalf("rule version should not use package version %q", version.Version)
114+
}
115+
}
116+
rule, err := client.AgentRule.Query().Only(ctx)
117+
if err != nil {
118+
t.Fatal(err)
119+
}
120+
active, err := client.AgentRuleVersion.Get(ctx, *rule.ActiveVersionID)
121+
if err != nil {
122+
t.Fatal(err)
123+
}
124+
assertRuleVersionFormat(t, active.Version)
125+
if active.Content != "v2" {
126+
t.Fatalf("active content = %q, want v2", active.Content)
127+
}
96128
}
97129

98130
func TestExtensionRuleImporterRejectsNameConflict(t *testing.T) {
@@ -126,3 +158,13 @@ func TestExtensionRuleImporterRejectsNameConflict(t *testing.T) {
126158
t.Fatal("ImportRules should reject same rule name from different package")
127159
}
128160
}
161+
162+
func assertRuleVersionFormat(t *testing.T, version string) {
163+
t.Helper()
164+
if len(version) != 14 {
165+
t.Fatalf("rule version = %q, want 14-char timestamp", version)
166+
}
167+
if _, err := time.Parse(VersionFormat, version); err != nil {
168+
t.Fatalf("rule version = %q does not match %s: %v", version, VersionFormat, err)
169+
}
170+
}

0 commit comments

Comments
 (0)