25 lines
1.5 KiB
Go
25 lines
1.5 KiB
Go
package models
|
|
|
|
import (
|
|
"time"
|
|
)
|
|
|
|
// SecurityDecision stores a decision/action taken by CrowdSec/WAF/RateLimit or manual
|
|
// override so it can be audited and surfaced in the UI.
|
|
type SecurityDecision struct {
|
|
ID uint `json:"-" gorm:"primaryKey"`
|
|
UUID string `json:"uuid" gorm:"uniqueIndex"`
|
|
Source string `json:"source" gorm:"index;compositeIndex:idx_sd_source_created;compositeIndex:idx_sd_source_scenario_created;compositeIndex:idx_sd_source_ip_created"` // e.g., crowdsec, waf, ratelimit, manual
|
|
Action string `json:"action" gorm:"index"` // allow, block, challenge
|
|
IP string `json:"ip" gorm:"index;compositeIndex:idx_sd_source_ip_created"`
|
|
Host string `json:"host" gorm:"index"` // optional
|
|
RuleID string `json:"rule_id" gorm:"index"`
|
|
Details string `json:"details" gorm:"type:text"`
|
|
CreatedAt time.Time `json:"created_at" gorm:"index;compositeIndex:idx_sd_source_created,sort:desc;compositeIndex:idx_sd_source_scenario_created,sort:desc;compositeIndex:idx_sd_source_ip_created,sort:desc"`
|
|
|
|
// Dashboard enrichment fields (Issue #26, PR-1)
|
|
Scenario string `json:"scenario,omitempty" gorm:"index;compositeIndex:idx_sd_source_scenario_created"`
|
|
Country string `json:"country,omitempty" gorm:"index;size:2"`
|
|
ExpiresAt *time.Time `json:"expires_at,omitempty" gorm:"index"`
|
|
}
|