assetrule

package
v0.7.0-preview2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 12, 2026 License: MIT Imports: 17 Imported by: 0

Documentation

Index

Constants

View Source
const (
	DefaultLimit = 50
	MaxLimit     = 100
)
View Source
const DefaultReconcileInterval = 30 * time.Minute

Variables

View Source
var (
	ErrNotFound     = errors.New("asset rule not found")
	ErrConflict     = errors.New("asset rule with this name already exists")
	ErrInvalidInput = errors.New("invalid input")
)

Functions

This section is empty.

Types

type AssetRule

type AssetRule struct {
	ID              string              `json:"id"`
	Name            string              `json:"name"`
	Description     *string             `json:"description,omitempty"`
	Links           []ExternalLink      `json:"links"`
	TermIDs         []string            `json:"term_ids"`
	RuleType        enrichment.RuleType `json:"rule_type"`
	QueryExpression *string             `json:"query_expression,omitempty"`
	MetadataField   *string             `json:"metadata_field,omitempty"`
	PatternType     *string             `json:"pattern_type,omitempty"`
	PatternValue    *string             `json:"pattern_value,omitempty"`
	Priority        int                 `json:"priority"`
	IsEnabled       bool                `json:"is_enabled"`
	CreatedBy       *string             `json:"created_by,omitempty"`
	CreatedAt       time.Time           `json:"created_at"`
	UpdatedAt       time.Time           `json:"updated_at"`

	MembershipCount    int        `json:"membership_count"`
	LastReconciledAt   *time.Time `json:"last_reconciled_at,omitempty"`
	ReconciliationHash *string    `json:"reconciliation_hash,omitempty"`
}

AssetRule represents a governance rule that assigns external links and/or glossary terms to assets.

func (*AssetRule) ComputeHash

func (r *AssetRule) ComputeHash() string

ComputeHash computes a hash of the rule's config for differential reconciliation.

func (*AssetRule) GetID

func (r *AssetRule) GetID() string

Implement enrichment.EnrichmentRule interface.

func (*AssetRule) GetIsEnabled

func (r *AssetRule) GetIsEnabled() bool

func (*AssetRule) GetMetadataField

func (r *AssetRule) GetMetadataField() *string

func (*AssetRule) GetPatternType

func (r *AssetRule) GetPatternType() *string

func (*AssetRule) GetPatternValue

func (r *AssetRule) GetPatternValue() *string

func (*AssetRule) GetQueryExpression

func (r *AssetRule) GetQueryExpression() *string

func (*AssetRule) GetRuleType

func (r *AssetRule) GetRuleType() enrichment.RuleType

func (*AssetRule) RuleSource

func (r *AssetRule) RuleSource() string

RuleSource returns the source string for asset_terms rows.

type CreateInput

type CreateInput struct {
	Name            string              `json:"name" validate:"required,min=1,max=255"`
	Description     *string             `json:"description,omitempty"`
	Links           []ExternalLink      `json:"links,omitempty"`
	TermIDs         []string            `json:"term_ids,omitempty"`
	RuleType        enrichment.RuleType `json:"rule_type" validate:"required,oneof=query metadata_match"`
	QueryExpression *string             `json:"query_expression,omitempty"`
	MetadataField   *string             `json:"metadata_field,omitempty"`
	PatternType     *string             `json:"pattern_type,omitempty" validate:"omitempty,oneof=exact wildcard regex prefix"`
	PatternValue    *string             `json:"pattern_value,omitempty"`
	Priority        int                 `json:"priority"`
	IsEnabled       bool                `json:"is_enabled"`
}

CreateInput is the input for creating an asset rule.

type EnrichedExternalLink struct {
	asset.ExternalLink
	Source   string  `json:"source"`
	RuleID   *string `json:"rule_id,omitempty"`
	RuleName *string `json:"rule_name,omitempty"`
}

EnrichedExternalLink is an external link with source information.

type ExternalLink struct {
	Name string `json:"name"`
	Icon string `json:"icon"`
	URL  string `json:"url"`
}

ExternalLink represents a link that a rule assigns to matching assets.

type ListResult

type ListResult struct {
	AssetRules []*AssetRule `json:"asset_rules"`
	Total      int          `json:"total"`
}

ListResult is the result of listing asset rules.

type MembershipConfig

type MembershipConfig struct {
	MaxWorkers    int
	BatchSize     int
	FlushInterval time.Duration
}

type MembershipRepository

type MembershipRepository interface {
	CreateMemberships(ctx context.Context, ruleID string, assetIDs []string) error
	DeleteMembershipsByAsset(ctx context.Context, assetID string) error
	DeleteMembershipsByRule(ctx context.Context, ruleID string) error
	DeleteMembershipsBatch(ctx context.Context, ruleID string, assetIDs []string) error
	GetMembershipAssetIDs(ctx context.Context, ruleID string, limit, offset int) ([]string, int, error)
	GetExistingMembershipAssetIDs(ctx context.Context, ruleID string) (map[string]struct{}, error)

	// Writes to asset_terms with source='rule:<id>'
	CreateTermMemberships(ctx context.Context, ruleID string, termIDs []string, assetIDs []string) error
	DeleteTermMembershipsByAsset(ctx context.Context, assetID string) error
	DeleteTermMembershipsByRule(ctx context.Context, ruleID string) error
	DeleteTermMembershipsBatch(ctx context.Context, ruleID string, assetIDs []string) error

	SaveRuleTargets(ctx context.Context, ruleID string, targets []enrichment.RuleTarget) error
	DeleteRuleTargets(ctx context.Context, ruleID string) error
	FindCandidateRules(ctx context.Context, sig enrichment.AssetSignature) ([]enrichment.CandidateRule, error)

	UpdateMembershipStats(ctx context.Context, ruleID string) error
}

type MembershipService

type MembershipService struct {
	// contains filtered or unexported fields
}

MembershipService evaluates asset rules and maintains rule-to-asset memberships.

func NewMembershipService

func NewMembershipService(
	repo Repository,
	memberRepo MembershipRepository,
	evaluator *enrichment.Evaluator,
	config *MembershipConfig,
) *MembershipService

func (*MembershipService) EvaluateRule

func (s *MembershipService) EvaluateRule(ctx context.Context, ruleID string) error

func (*MembershipService) OnAssetCreated

func (s *MembershipService) OnAssetCreated(ctx context.Context, ast *asset.Asset)

func (*MembershipService) OnAssetDeleted

func (s *MembershipService) OnAssetDeleted(ctx context.Context, assetID string) error

func (*MembershipService) OnRuleCreated

func (s *MembershipService) OnRuleCreated(ctx context.Context, rule *AssetRule) error

func (*MembershipService) OnRuleDeleted

func (s *MembershipService) OnRuleDeleted(ctx context.Context, ruleID string) error

func (*MembershipService) OnRuleUpdated

func (s *MembershipService) OnRuleUpdated(ctx context.Context, rule *AssetRule) error

func (*MembershipService) ReconcileAll

func (s *MembershipService) ReconcileAll(ctx context.Context) error

ReconcileAll re-evaluates all enabled rules using differential reconciliation, skipping rules whose config hash hasn't changed since the last run.

func (*MembershipService) Start

func (s *MembershipService) Start(ctx context.Context)

func (*MembershipService) Stop

func (s *MembershipService) Stop()

type PostgresMembershipRepository

type PostgresMembershipRepository struct {
	// contains filtered or unexported fields
}

PostgresMembershipRepository implements MembershipRepository for PostgreSQL.

func NewPostgresMembershipRepository

func NewPostgresMembershipRepository(db *pgxpool.Pool, recorder metrics.Recorder) *PostgresMembershipRepository

NewPostgresMembershipRepository creates a new membership repository.

func (*PostgresMembershipRepository) CreateMemberships

func (r *PostgresMembershipRepository) CreateMemberships(ctx context.Context, ruleID string, assetIDs []string) error

func (*PostgresMembershipRepository) CreateTermMemberships

func (r *PostgresMembershipRepository) CreateTermMemberships(ctx context.Context, ruleID string, termIDs []string, assetIDs []string) error

func (*PostgresMembershipRepository) DeleteMembershipsBatch

func (r *PostgresMembershipRepository) DeleteMembershipsBatch(ctx context.Context, ruleID string, assetIDs []string) error

func (*PostgresMembershipRepository) DeleteMembershipsByAsset

func (r *PostgresMembershipRepository) DeleteMembershipsByAsset(ctx context.Context, assetID string) error

func (*PostgresMembershipRepository) DeleteMembershipsByRule

func (r *PostgresMembershipRepository) DeleteMembershipsByRule(ctx context.Context, ruleID string) error

func (*PostgresMembershipRepository) DeleteRuleTargets

func (r *PostgresMembershipRepository) DeleteRuleTargets(ctx context.Context, ruleID string) error

func (*PostgresMembershipRepository) DeleteTermMembershipsBatch

func (r *PostgresMembershipRepository) DeleteTermMembershipsBatch(ctx context.Context, ruleID string, assetIDs []string) error

func (*PostgresMembershipRepository) DeleteTermMembershipsByAsset

func (r *PostgresMembershipRepository) DeleteTermMembershipsByAsset(ctx context.Context, assetID string) error

func (*PostgresMembershipRepository) DeleteTermMembershipsByRule

func (r *PostgresMembershipRepository) DeleteTermMembershipsByRule(ctx context.Context, ruleID string) error

func (*PostgresMembershipRepository) FindCandidateRules

func (*PostgresMembershipRepository) GetExistingMembershipAssetIDs

func (r *PostgresMembershipRepository) GetExistingMembershipAssetIDs(ctx context.Context, ruleID string) (map[string]struct{}, error)

func (*PostgresMembershipRepository) GetMembershipAssetIDs

func (r *PostgresMembershipRepository) GetMembershipAssetIDs(ctx context.Context, ruleID string, limit, offset int) ([]string, int, error)

func (*PostgresMembershipRepository) SaveRuleTargets

func (r *PostgresMembershipRepository) SaveRuleTargets(ctx context.Context, ruleID string, targets []enrichment.RuleTarget) error

func (*PostgresMembershipRepository) UpdateMembershipStats

func (r *PostgresMembershipRepository) UpdateMembershipStats(ctx context.Context, ruleID string) error

type PostgresRepository

type PostgresRepository struct {
	// contains filtered or unexported fields
}

PostgresRepository implements Repository for PostgreSQL.

func NewPostgresRepository

func NewPostgresRepository(db *pgxpool.Pool, recorder metrics.Recorder) *PostgresRepository

NewPostgresRepository creates a new PostgreSQL repository.

func (*PostgresRepository) Create

func (r *PostgresRepository) Create(ctx context.Context, rule *AssetRule) error

func (*PostgresRepository) Delete

func (r *PostgresRepository) Delete(ctx context.Context, id string) error

func (*PostgresRepository) Get

func (*PostgresRepository) GetAllEnabled

func (r *PostgresRepository) GetAllEnabled(ctx context.Context) ([]*AssetRule, error)
func (r *PostgresRepository) GetRuleManagedLinks(ctx context.Context, assetID string) ([]EnrichedExternalLink, error)

func (*PostgresRepository) GetTermIDs

func (r *PostgresRepository) GetTermIDs(ctx context.Context, ruleID string) ([]string, error)

func (*PostgresRepository) List

func (r *PostgresRepository) List(ctx context.Context, offset, limit int) (*ListResult, error)

func (*PostgresRepository) Search

func (r *PostgresRepository) Search(ctx context.Context, filter SearchFilter) (*ListResult, error)

func (*PostgresRepository) SetTerms

func (r *PostgresRepository) SetTerms(ctx context.Context, ruleID string, termIDs []string) error

func (*PostgresRepository) Update

func (r *PostgresRepository) Update(ctx context.Context, rule *AssetRule) error

func (*PostgresRepository) UpdateReconciliationState

func (r *PostgresRepository) UpdateReconciliationState(ctx context.Context, ruleID string, hash string) error

type Reconciler

type Reconciler struct {
	// contains filtered or unexported fields
}

Reconciler periodically re-evaluates all asset rules using differential reconciliation.

func NewReconciler

func NewReconciler(membershipSvc *MembershipService, config *ReconcilerConfig) *Reconciler

NewReconciler creates a new reconciler.

func (*Reconciler) Start

func (r *Reconciler) Start(ctx context.Context)

Start begins the periodic reconciliation loop.

func (*Reconciler) Stop

func (r *Reconciler) Stop()

Stop gracefully shuts down the reconciler.

type ReconcilerConfig

type ReconcilerConfig struct {
	Interval time.Duration
	DB       *pgxpool.Pool
}

ReconcilerConfig configures the reconciler.

type Repository

type Repository interface {
	Create(ctx context.Context, rule *AssetRule) error
	Get(ctx context.Context, id string) (*AssetRule, error)
	Update(ctx context.Context, rule *AssetRule) error
	Delete(ctx context.Context, id string) error
	List(ctx context.Context, offset, limit int) (*ListResult, error)
	Search(ctx context.Context, filter SearchFilter) (*ListResult, error)
	GetAllEnabled(ctx context.Context) ([]*AssetRule, error)
	UpdateReconciliationState(ctx context.Context, ruleID string, hash string) error
	SetTerms(ctx context.Context, ruleID string, termIDs []string) error
	GetTermIDs(ctx context.Context, ruleID string) ([]string, error)

	// For asset detail page: get rule-managed links for an asset
	GetRuleManagedLinks(ctx context.Context, assetID string) ([]EnrichedExternalLink, error)
}

Repository handles database operations for asset rules.

type RulePreview

type RulePreview struct {
	AssetIDs   []string `json:"asset_ids"`
	AssetCount int      `json:"asset_count"`
	Errors     []string `json:"errors,omitempty"`
}

RulePreview is the result of previewing a rule.

type RulePreviewInput

type RulePreviewInput struct {
	RuleType        enrichment.RuleType `json:"rule_type" validate:"required,oneof=query metadata_match"`
	QueryExpression *string             `json:"query_expression,omitempty"`
	MetadataField   *string             `json:"metadata_field,omitempty"`
	PatternType     *string             `json:"pattern_type,omitempty"`
	PatternValue    *string             `json:"pattern_value,omitempty"`
}

RulePreviewInput is the input for previewing a rule.

func (*RulePreviewInput) GetID

func (r *RulePreviewInput) GetID() string

Implement enrichment.EnrichmentRule for RulePreviewInput.

func (*RulePreviewInput) GetIsEnabled

func (r *RulePreviewInput) GetIsEnabled() bool

func (*RulePreviewInput) GetMetadataField

func (r *RulePreviewInput) GetMetadataField() *string

func (*RulePreviewInput) GetPatternType

func (r *RulePreviewInput) GetPatternType() *string

func (*RulePreviewInput) GetPatternValue

func (r *RulePreviewInput) GetPatternValue() *string

func (*RulePreviewInput) GetQueryExpression

func (r *RulePreviewInput) GetQueryExpression() *string

func (*RulePreviewInput) GetRuleType

func (r *RulePreviewInput) GetRuleType() enrichment.RuleType

type SearchFilter

type SearchFilter struct {
	Query  string `json:"query,omitempty"`
	Limit  int    `json:"limit,omitempty"`
	Offset int    `json:"offset,omitempty"`
}

SearchFilter for searching asset rules.

type Service

type Service interface {
	Create(ctx context.Context, input CreateInput, createdBy *string) (*AssetRule, error)
	Get(ctx context.Context, id string) (*AssetRule, error)
	Update(ctx context.Context, id string, input UpdateInput) (*AssetRule, error)
	Delete(ctx context.Context, id string) error
	List(ctx context.Context, offset, limit int) (*ListResult, error)
	Search(ctx context.Context, filter SearchFilter) (*ListResult, error)
	PreviewRule(ctx context.Context, input RulePreviewInput, limit int) (*RulePreview, error)
	GetRuleAssets(ctx context.Context, ruleID string, limit, offset int) ([]string, int, error)
	GetEnrichedLinks(ctx context.Context, assetID string) ([]EnrichedExternalLink, error)
}

Service provides business logic for asset rules.

func NewService

func NewService(
	repo Repository,
	memberRepo MembershipRepository,
	evaluator *enrichment.Evaluator,
	memberSvc *MembershipService,
) Service

NewService creates a new asset rule service.

type UpdateInput

type UpdateInput struct {
	Name            *string              `json:"name,omitempty" validate:"omitempty,min=1,max=255"`
	Description     *string              `json:"description,omitempty"`
	Links           []ExternalLink       `json:"links,omitempty"`
	TermIDs         []string             `json:"term_ids,omitempty"`
	RuleType        *enrichment.RuleType `json:"rule_type,omitempty" validate:"omitempty,oneof=query metadata_match"`
	QueryExpression *string              `json:"query_expression,omitempty"`
	MetadataField   *string              `json:"metadata_field,omitempty"`
	PatternType     *string              `json:"pattern_type,omitempty" validate:"omitempty,oneof=exact wildcard regex prefix"`
	PatternValue    *string              `json:"pattern_value,omitempty"`
	Priority        *int                 `json:"priority,omitempty"`
	IsEnabled       *bool                `json:"is_enabled,omitempty"`
}

UpdateInput is the input for updating an asset rule.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL