package domain import ( "context" "time" "gorm.io/datatypes" ) // ResourceFlowVersion represents versioned snapshots of resource flows for temporal tracking // This enables MRV (Monitoring, Reporting, Verification) compliance and historical analysis type ResourceFlowVersion struct { ID string `gorm:"primaryKey;type:text"` ResourceFlowID string `gorm:"type:text;not null;index:idx_rfv_flow_version"` VersionNumber int `gorm:"type:integer;not null;index:idx_rfv_flow_version"` // Change tracking Changes datatypes.JSON `gorm:"type:jsonb;not null"` // What changed (JSON diff) ChangedBy string `gorm:"type:text"` // User ID who made the change ChangeReason string `gorm:"type:text"` // Why the change was made // Validity period ValidFrom time.Time `gorm:"type:timestamp with time zone;not null;default:now()"` ValidTo *time.Time `gorm:"type:timestamp with time zone"` // NULL means current version // Timestamps CreatedAt time.Time `gorm:"autoCreateTime;index"` // Associations ResourceFlow *ResourceFlow `gorm:"foreignKey:ResourceFlowID"` } // TableName specifies the table name for GORM func (ResourceFlowVersion) TableName() string { return "resource_flow_versions" } type ResourceFlowVersionRepository interface { Create(ctx context.Context, version *ResourceFlowVersion) error GetByResourceFlowID(ctx context.Context, flowID string) ([]*ResourceFlowVersion, error) GetVersionAtTime(ctx context.Context, flowID string, timestamp time.Time) (*ResourceFlowVersion, error) GetCurrentVersion(ctx context.Context, flowID string) (*ResourceFlowVersion, error) }