mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-10-08 16:46:37 +08:00
refactor(repository): 收敛 model/repository 分层为唯一持久化入口
将 OpenFlare 与平台业务的数据访问从 model 与 apps 直连迁入 repository, model 仅保留实体与无 IO 规则;补充 code-check 架构守卫与开发规范。
This commit is contained in:
@@ -17,6 +17,8 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/Rain-kl/Wavelet/internal/repository"
|
||||
|
||||
"github.com/Rain-kl/Wavelet/internal/apps/openflare/agent"
|
||||
"github.com/Rain-kl/Wavelet/internal/apps/openflare/websocket"
|
||||
"github.com/Rain-kl/Wavelet/internal/model"
|
||||
@@ -132,7 +134,7 @@ type ipGroupAutoAccumulator struct {
|
||||
// SyncDueWAFIPGroups syncs all enabled automatic/subscription IP groups that are due.
|
||||
func SyncDueWAFIPGroups(ctx context.Context) error {
|
||||
now := time.Now().UTC()
|
||||
groups, err := model.ListDueOpenFlareWAFIPGroups(ctx, now)
|
||||
groups, err := repository.ListDueOpenFlareWAFIPGroups(ctx, now)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -176,7 +178,7 @@ func syncIPGroupSubscription(ctx context.Context, group *model.OpenFlareWAFIPGro
|
||||
group.NextSyncAt = &nextSyncAt
|
||||
group.LastSyncStatus = "success"
|
||||
group.LastSyncMessage = fmt.Sprintf("同步成功,共 %d 条 IP/IP 段", len(ips))
|
||||
if err := model.UpdateOpenFlareWAFIPGroupSyncResult(ctx, group); err != nil {
|
||||
if err := repository.UpdateOpenFlareWAFIPGroupSyncResult(ctx, group); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
broadcastIPGroupToAgents(ctx, group.ID)
|
||||
@@ -259,7 +261,7 @@ func syncIPGroupAutomatic(ctx context.Context, group *model.OpenFlareWAFIPGroup,
|
||||
group.NextSyncAt = &nextSyncAt
|
||||
group.LastSyncStatus = "success"
|
||||
group.LastSyncMessage = fmt.Sprintf("自动规则执行成功,共命中 %d 个 IP,当前生效 %d 个 IP", len(ips), len(finalIPs))
|
||||
if err := model.UpdateOpenFlareWAFIPGroupSyncResult(ctx, group); err != nil {
|
||||
if err := repository.UpdateOpenFlareWAFIPGroupSyncResult(ctx, group); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
broadcastIPGroupToAgents(ctx, group.ID)
|
||||
@@ -283,7 +285,7 @@ func recordIPGroupSyncFailure(ctx context.Context, group *model.OpenFlareWAFIPGr
|
||||
group.NextSyncAt = &nextSyncAt
|
||||
group.LastSyncStatus = "failed"
|
||||
group.LastSyncMessage = syncErr.Error()
|
||||
_ = model.UpdateOpenFlareWAFIPGroupSyncResult(ctx, group)
|
||||
_ = repository.UpdateOpenFlareWAFIPGroupSyncResult(ctx, group)
|
||||
}
|
||||
|
||||
func evaluateParsedIPGroupAutoConfig(ctx context.Context, config ipGroupAutoConfig, now time.Time) ([]string, error) {
|
||||
@@ -302,7 +304,7 @@ func evaluateParsedIPGroupAutoConfig(ctx context.Context, config ipGroupAutoConf
|
||||
if lookback <= 0 {
|
||||
lookback = defaultWAFIPGroupAutoLookbackDur
|
||||
}
|
||||
aggregates, err := model.ListOpenFlareAccessLogWAFIPAggregates(ctx, model.OpenFlareAccessLogQuery{
|
||||
aggregates, err := repository.ListOpenFlareAccessLogWAFIPAggregates(ctx, model.OpenFlareAccessLogQuery{
|
||||
Since: now.Add(-lookback),
|
||||
Until: now,
|
||||
})
|
||||
|
||||
@@ -11,6 +11,8 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/Rain-kl/Wavelet/internal/repository"
|
||||
|
||||
db "github.com/Rain-kl/Wavelet/internal/infra/persistence"
|
||||
"github.com/Rain-kl/Wavelet/internal/model"
|
||||
"github.com/glebarez/sqlite"
|
||||
@@ -32,7 +34,7 @@ func setupIPGroupSyncTestDB(t *testing.T) func() {
|
||||
))
|
||||
|
||||
db.SetDB(sqliteDB)
|
||||
resetAccessLogStore := model.SetAccessLogStoreForTest(model.NewMemoryAccessLogStore())
|
||||
resetAccessLogStore := repository.SetAccessLogStoreForTest(repository.NewMemoryAccessLogStore())
|
||||
return func() {
|
||||
resetAccessLogStore()
|
||||
db.SetDB(nil)
|
||||
@@ -161,28 +163,28 @@ func TestListDueOpenFlareWAFIPGroups(t *testing.T) {
|
||||
Name: "due auto", Type: wafIPGroupTypeAutomatic, Enabled: true,
|
||||
IPList: "[]", AutoConfig: "{}", ExtIPs: "[]", NextSyncAt: &past,
|
||||
}
|
||||
require.NoError(t, model.CreateOpenFlareWAFIPGroup(ctx, dueAuto))
|
||||
require.NoError(t, repository.CreateOpenFlareWAFIPGroup(ctx, dueAuto))
|
||||
|
||||
futureAuto := &model.OpenFlareWAFIPGroup{
|
||||
Name: "future auto", Type: wafIPGroupTypeAutomatic, Enabled: true,
|
||||
IPList: "[]", AutoConfig: "{}", ExtIPs: "[]", NextSyncAt: &future,
|
||||
}
|
||||
require.NoError(t, model.CreateOpenFlareWAFIPGroup(ctx, futureAuto))
|
||||
require.NoError(t, repository.CreateOpenFlareWAFIPGroup(ctx, futureAuto))
|
||||
|
||||
dueSub := &model.OpenFlareWAFIPGroup{
|
||||
Name: "due sub", Type: wafIPGroupTypeSubscription, Enabled: true,
|
||||
IPList: "[]", AutoConfig: "{}", ExtIPs: "[]",
|
||||
SubscriptionURL: "https://example.com/list", NextSyncAt: &past,
|
||||
}
|
||||
require.NoError(t, model.CreateOpenFlareWAFIPGroup(ctx, dueSub))
|
||||
require.NoError(t, repository.CreateOpenFlareWAFIPGroup(ctx, dueSub))
|
||||
|
||||
manual := &model.OpenFlareWAFIPGroup{
|
||||
Name: "manual", Type: wafIPGroupTypeManual, Enabled: true,
|
||||
IPList: "[]", AutoConfig: "{}", ExtIPs: "[]", NextSyncAt: &past,
|
||||
}
|
||||
require.NoError(t, model.CreateOpenFlareWAFIPGroup(ctx, manual))
|
||||
require.NoError(t, repository.CreateOpenFlareWAFIPGroup(ctx, manual))
|
||||
|
||||
groups, err := model.ListDueOpenFlareWAFIPGroups(ctx, time.Now().UTC())
|
||||
groups, err := repository.ListDueOpenFlareWAFIPGroups(ctx, time.Now().UTC())
|
||||
require.NoError(t, err)
|
||||
require.Len(t, groups, 2)
|
||||
ids := []uint{groups[0].ID, groups[1].ID}
|
||||
@@ -207,7 +209,7 @@ func seedWAFAccessLogs(t *testing.T, ctx context.Context, loggedAt time.Time, re
|
||||
StatusCode: statusCode,
|
||||
})
|
||||
}
|
||||
require.NoError(t, model.InsertOpenFlareAccessLogsBatch(ctx, records))
|
||||
require.NoError(t, repository.InsertOpenFlareAccessLogsBatch(ctx, records))
|
||||
}
|
||||
|
||||
func TestParseIPGroupAutoConfigLookback(t *testing.T) {
|
||||
|
||||
@@ -14,6 +14,8 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/Rain-kl/Wavelet/internal/repository"
|
||||
|
||||
"github.com/Rain-kl/Wavelet/internal/model"
|
||||
|
||||
exprlang "github.com/expr-lang/expr"
|
||||
@@ -141,7 +143,7 @@ type ipGroupExtIP struct {
|
||||
|
||||
// GetSiteRuleGroups returns WAF rule groups for a proxy route.
|
||||
func GetSiteRuleGroups(ctx context.Context, routeID uint) (*SiteRuleGroupsView, error) {
|
||||
if _, err := model.GetOpenFlareProxyRouteByID(ctx, routeID); err != nil {
|
||||
if _, err := repository.GetOpenFlareProxyRouteByID(ctx, routeID); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
groups, err := ListRules(ctx)
|
||||
@@ -182,14 +184,14 @@ func GetSiteRuleGroups(ctx context.Context, routeID uint) (*SiteRuleGroupsView,
|
||||
|
||||
// ReplaceSiteRuleGroups replaces rule group bindings for a proxy route.
|
||||
func ReplaceSiteRuleGroups(ctx context.Context, routeID uint, groupIDs []uint) (*SiteRuleGroupsView, error) {
|
||||
if _, err := model.GetOpenFlareProxyRouteByID(ctx, routeID); err != nil {
|
||||
if _, err := repository.GetOpenFlareProxyRouteByID(ctx, routeID); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
normalized, err := normalizeRuleGroupIDs(ctx, groupIDs)
|
||||
if err != nil {
|
||||
return nil, &RuleValidationError{Err: err}
|
||||
}
|
||||
if err = model.ReplaceOpenFlareWAFSiteRuleGroupBindings(ctx, routeID, normalized); err != nil {
|
||||
if err = repository.ReplaceOpenFlareWAFSiteRuleGroupBindings(ctx, routeID, normalized); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return GetSiteRuleGroups(ctx, routeID)
|
||||
@@ -197,7 +199,7 @@ func ReplaceSiteRuleGroups(ctx context.Context, routeID uint, groupIDs []uint) (
|
||||
|
||||
// ListSiteRuleGroupIDs returns rule group ids bound to a proxy route.
|
||||
func ListSiteRuleGroupIDs(ctx context.Context, routeID uint) ([]uint, error) {
|
||||
bindings, err := model.ListOpenFlareWAFRuleGroupBindingsByRouteID(ctx, routeID)
|
||||
bindings, err := repository.ListOpenFlareWAFRuleGroupBindingsByRouteID(ctx, routeID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -210,7 +212,7 @@ func ListSiteRuleGroupIDs(ctx context.Context, routeID uint) ([]uint, error) {
|
||||
|
||||
// EnsureDefaultRuleGroup ensures the global WAF rule group exists.
|
||||
func EnsureDefaultRuleGroup(ctx context.Context) error {
|
||||
_, err := model.GetGlobalOpenFlareWAFRuleGroup(ctx)
|
||||
_, err := repository.GetGlobalOpenFlareWAFRuleGroup(ctx)
|
||||
if err == nil {
|
||||
return nil
|
||||
}
|
||||
@@ -224,12 +226,12 @@ func EnsureDefaultRuleGroup(ctx context.Context) error {
|
||||
group := &model.OpenFlareWAFRuleGroup{
|
||||
Name: "全局规则组", Enabled: true, IsGlobal: true, Graph: string(graph), Revision: 1,
|
||||
}
|
||||
return model.CreateOpenFlareWAFRuleGroup(ctx, group)
|
||||
return repository.CreateOpenFlareWAFRuleGroup(ctx, group)
|
||||
}
|
||||
|
||||
// ListIPGroups returns all WAF IP groups.
|
||||
func ListIPGroups(ctx context.Context) ([]IPGroupView, error) {
|
||||
groups, err := model.ListOpenFlareWAFIPGroups(ctx)
|
||||
groups, err := repository.ListOpenFlareWAFIPGroups(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -250,7 +252,7 @@ func ListIPGroups(ctx context.Context) ([]IPGroupView, error) {
|
||||
|
||||
// GetIPGroup returns a WAF IP group by id.
|
||||
func GetIPGroup(ctx context.Context, id uint) (*IPGroupView, error) {
|
||||
group, err := model.GetOpenFlareWAFIPGroupByID(ctx, id)
|
||||
group, err := repository.GetOpenFlareWAFIPGroupByID(ctx, id)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -271,7 +273,7 @@ func CreateIPGroup(ctx context.Context, input IPGroupInput) (*IPGroupView, error
|
||||
if err != nil {
|
||||
return nil, &RuleValidationError{Err: err}
|
||||
}
|
||||
if err = model.CreateOpenFlareWAFIPGroup(ctx, group); err != nil {
|
||||
if err = repository.CreateOpenFlareWAFIPGroup(ctx, group); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
broadcastIPGroupToAgents(ctx, group.ID)
|
||||
@@ -280,7 +282,7 @@ func CreateIPGroup(ctx context.Context, input IPGroupInput) (*IPGroupView, error
|
||||
|
||||
// UpdateIPGroup updates a WAF IP group.
|
||||
func UpdateIPGroup(ctx context.Context, id uint, input IPGroupInput) (*IPGroupView, error) {
|
||||
group, err := model.GetOpenFlareWAFIPGroupByID(ctx, id)
|
||||
group, err := repository.GetOpenFlareWAFIPGroupByID(ctx, id)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -288,7 +290,7 @@ func UpdateIPGroup(ctx context.Context, id uint, input IPGroupInput) (*IPGroupVi
|
||||
if err != nil {
|
||||
return nil, &RuleValidationError{Err: err}
|
||||
}
|
||||
if err = model.UpdateOpenFlareWAFIPGroup(ctx, group); err != nil {
|
||||
if err = repository.UpdateOpenFlareWAFIPGroup(ctx, group); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
broadcastIPGroupToAgents(ctx, group.ID)
|
||||
@@ -297,7 +299,7 @@ func UpdateIPGroup(ctx context.Context, id uint, input IPGroupInput) (*IPGroupVi
|
||||
|
||||
// DeleteIPGroup deletes a WAF IP group when not referenced.
|
||||
func DeleteIPGroup(ctx context.Context, id uint) error {
|
||||
group, err := model.GetOpenFlareWAFIPGroupByID(ctx, id)
|
||||
group, err := repository.GetOpenFlareWAFIPGroupByID(ctx, id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -308,12 +310,12 @@ func DeleteIPGroup(ctx context.Context, id uint) error {
|
||||
if counts[group.ID] > 0 {
|
||||
return &RuleValidationError{Err: errors.New("IP 组已被 WAF 规则引用,请先移除引用")}
|
||||
}
|
||||
return model.DeleteOpenFlareWAFIPGroup(ctx, group.ID)
|
||||
return repository.DeleteOpenFlareWAFIPGroup(ctx, group.ID)
|
||||
}
|
||||
|
||||
// SyncIPGroup synchronizes a subscription or automatic WAF IP group.
|
||||
func SyncIPGroup(ctx context.Context, id uint) (*IPGroupSyncResult, error) {
|
||||
group, err := model.GetOpenFlareWAFIPGroupByID(ctx, id)
|
||||
group, err := repository.GetOpenFlareWAFIPGroupByID(ctx, id)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -341,7 +343,7 @@ func TestIPGroupAutoConfig(ctx context.Context, input IPGroupAutoTestInput) (*IP
|
||||
}
|
||||
|
||||
func loadRuleGroupBindings(ctx context.Context) (map[uint][]uint, error) {
|
||||
bindings, err := model.ListOpenFlareWAFRuleGroupBindings(ctx)
|
||||
bindings, err := repository.ListOpenFlareWAFRuleGroupBindings(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -353,7 +355,7 @@ func loadRuleGroupBindings(ctx context.Context) (map[uint][]uint, error) {
|
||||
}
|
||||
|
||||
func loadIPGroupReferenceCounts(ctx context.Context) (map[uint]int, error) {
|
||||
groups, err := model.ListOpenFlareWAFRuleGroups(ctx)
|
||||
groups, err := repository.ListOpenFlareWAFRuleGroups(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -442,7 +444,7 @@ func decodeStringList(raw string) ([]string, error) {
|
||||
func normalizeRuleGroupIDs(ctx context.Context, groupIDs []uint) ([]uint, error) {
|
||||
normalized := uniqueUintIDsInOrder(groupIDs)
|
||||
for _, groupID := range normalized {
|
||||
group, err := model.GetOpenFlareWAFRuleGroupByID(ctx, groupID)
|
||||
group, err := repository.GetOpenFlareWAFRuleGroupByID(ctx, groupID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("WAF 规则组 %d 不存在", groupID)
|
||||
}
|
||||
|
||||
@@ -7,6 +7,8 @@ import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"github.com/Rain-kl/Wavelet/internal/repository"
|
||||
|
||||
db "github.com/Rain-kl/Wavelet/internal/infra/persistence"
|
||||
"github.com/Rain-kl/Wavelet/internal/model"
|
||||
"github.com/glebarez/sqlite"
|
||||
@@ -57,11 +59,11 @@ func TestUpdateIPGroupPrunesAutomaticExtIPs(t *testing.T) {
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
group, err := model.GetOpenFlareWAFIPGroupByID(ctx, created.ID)
|
||||
group, err := repository.GetOpenFlareWAFIPGroupByID(ctx, created.ID)
|
||||
require.NoError(t, err)
|
||||
group.IPList = `["203.0.113.10","203.0.113.11"]`
|
||||
group.ExtIPs = `[{"ip":"203.0.113.10","captured_at":"2026-06-18T10:00:00Z"},{"ip":"203.0.113.11","captured_at":"2026-06-18T11:00:00Z"}]`
|
||||
require.NoError(t, model.UpdateOpenFlareWAFIPGroup(ctx, group))
|
||||
require.NoError(t, repository.UpdateOpenFlareWAFIPGroup(ctx, group))
|
||||
|
||||
updated, err := UpdateIPGroup(ctx, created.ID, IPGroupInput{
|
||||
Name: created.Name,
|
||||
|
||||
@@ -11,6 +11,8 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/Rain-kl/Wavelet/internal/repository"
|
||||
|
||||
"github.com/Rain-kl/Wavelet/internal/model"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
@@ -57,7 +59,7 @@ func ListRules(ctx context.Context) ([]RuleView, error) {
|
||||
if err := EnsureDefaultRuleGroup(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
groups, err := model.ListOpenFlareWAFRuleGroups(ctx)
|
||||
groups, err := repository.ListOpenFlareWAFRuleGroups(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -78,7 +80,7 @@ func ListRules(ctx context.Context) ([]RuleView, error) {
|
||||
|
||||
// GetRule returns one orchestrated WAF rule.
|
||||
func GetRule(ctx context.Context, id uint) (*RuleView, error) {
|
||||
group, err := model.GetOpenFlareWAFRuleGroupByID(ctx, id)
|
||||
group, err := repository.GetOpenFlareWAFRuleGroupByID(ctx, id)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -101,13 +103,13 @@ func CreateRule(ctx context.Context, input CreateRuleInput) (*RuleView, error) {
|
||||
return nil, err
|
||||
}
|
||||
group := &model.OpenFlareWAFRuleGroup{Name: name, Enabled: false, IsGlobal: false, Graph: string(raw), Revision: 1}
|
||||
if err = model.CreateOpenFlareWAFRuleGroup(ctx, group); err != nil {
|
||||
if err = repository.CreateOpenFlareWAFRuleGroup(ctx, group); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// GORM applies the model's database default to a false bool on Create, so
|
||||
// explicitly persist the safe disabled state after the row has an ID.
|
||||
group.Enabled = false
|
||||
if err = model.UpdateOpenFlareWAFRuleGroup(ctx, group); err != nil {
|
||||
if err = repository.UpdateOpenFlareWAFRuleGroup(ctx, group); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return GetRule(ctx, group.ID)
|
||||
@@ -115,7 +117,7 @@ func CreateRule(ctx context.Context, input CreateRuleInput) (*RuleView, error) {
|
||||
|
||||
// UpdateRuleMeta updates rule metadata without touching its graph revision.
|
||||
func UpdateRuleMeta(ctx context.Context, id uint, input UpdateRuleMetaInput) (*RuleView, error) {
|
||||
group, err := model.GetOpenFlareWAFRuleGroupByID(ctx, id)
|
||||
group, err := repository.GetOpenFlareWAFRuleGroupByID(ctx, id)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -124,7 +126,7 @@ func UpdateRuleMeta(ctx context.Context, id uint, input UpdateRuleMetaInput) (*R
|
||||
return nil, &RuleValidationError{Err: errors.New("WAF 规则名称不能为空")}
|
||||
}
|
||||
group.Name, group.Enabled = name, input.Enabled
|
||||
if err = model.UpdateOpenFlareWAFRuleGroup(ctx, group); err != nil {
|
||||
if err = repository.UpdateOpenFlareWAFRuleGroup(ctx, group); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return GetRule(ctx, id)
|
||||
@@ -132,19 +134,19 @@ func UpdateRuleMeta(ctx context.Context, id uint, input UpdateRuleMetaInput) (*R
|
||||
|
||||
// DeleteRuleGroup deletes a non-global orchestrated WAF rule.
|
||||
func DeleteRuleGroup(ctx context.Context, id uint) error {
|
||||
group, err := model.GetOpenFlareWAFRuleGroupByID(ctx, id)
|
||||
group, err := repository.GetOpenFlareWAFRuleGroupByID(ctx, id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if group.IsGlobal {
|
||||
return &RuleValidationError{Err: errors.New("全局 WAF 规则不能删除")}
|
||||
}
|
||||
return model.DeleteOpenFlareWAFRuleGroupWithBindings(ctx, id)
|
||||
return repository.DeleteOpenFlareWAFRuleGroupWithBindings(ctx, id)
|
||||
}
|
||||
|
||||
// SaveRuleGraph validates and atomically replaces a rule graph.
|
||||
func SaveRuleGraph(ctx context.Context, id uint, input SaveRuleGraphInput) (*RuleView, error) {
|
||||
if _, err := model.GetOpenFlareWAFRuleGroupByID(ctx, id); err != nil {
|
||||
if _, err := repository.GetOpenFlareWAFRuleGroupByID(ctx, id); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := ValidateRuleGraph(ctx, input.Graph, ruleIPGroupExists); err != nil {
|
||||
@@ -154,14 +156,14 @@ func SaveRuleGraph(ctx context.Context, id uint, input SaveRuleGraphInput) (*Rul
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if _, err = model.UpdateOpenFlareWAFRuleGraph(ctx, id, input.Revision, string(raw)); err != nil {
|
||||
if _, err = repository.UpdateOpenFlareWAFRuleGraph(ctx, id, input.Revision, string(raw)); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return GetRule(ctx, id)
|
||||
}
|
||||
|
||||
func ruleIPGroupExists(ctx context.Context, id uint) (bool, error) {
|
||||
_, err := model.GetOpenFlareWAFIPGroupByID(ctx, id)
|
||||
_, err := repository.GetOpenFlareWAFIPGroupByID(ctx, id)
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
@@ -13,6 +13,8 @@ import (
|
||||
"strconv"
|
||||
"testing"
|
||||
|
||||
"github.com/Rain-kl/Wavelet/internal/repository"
|
||||
|
||||
db "github.com/Rain-kl/Wavelet/internal/infra/persistence"
|
||||
"github.com/Rain-kl/Wavelet/internal/model"
|
||||
"github.com/Rain-kl/Wavelet/internal/shared/response"
|
||||
@@ -165,7 +167,7 @@ func TestReplaceSiteRuleGroupsPreservesOrderAndRejectsGlobal(t *testing.T) {
|
||||
assert.Equal(t, []uint{third.ID, first.ID, second.ID}, view.AppliedIDs)
|
||||
|
||||
require.NoError(t, EnsureDefaultRuleGroup(ctx))
|
||||
global, err := model.GetGlobalOpenFlareWAFRuleGroup(ctx)
|
||||
global, err := repository.GetGlobalOpenFlareWAFRuleGroup(ctx)
|
||||
require.NoError(t, err)
|
||||
_, err = ReplaceSiteRuleGroups(ctx, 7, []uint{global.ID, second.ID})
|
||||
require.Error(t, err)
|
||||
|
||||
Reference in New Issue
Block a user