mirror of
https://github.com/Ed1s0nZ/CyberStrikeAI.git
synced 2026-06-30 17:55:32 +02:00
76 lines
2.3 KiB
Go
76 lines
2.3 KiB
Go
package database
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
"time"
|
|
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
// DeleteHitlInterruptLogsByIDs deletes decided HITL audit logs by id (pending rows are skipped).
|
|
func (db *DB) DeleteHitlInterruptLogsByIDs(ids []string) (int64, error) {
|
|
if db == nil {
|
|
return 0, fmt.Errorf("database is nil")
|
|
}
|
|
clean := make([]string, 0, len(ids))
|
|
for _, id := range ids {
|
|
id = strings.TrimSpace(id)
|
|
if id != "" {
|
|
clean = append(clean, id)
|
|
}
|
|
}
|
|
if len(clean) == 0 {
|
|
return 0, nil
|
|
}
|
|
placeholders := strings.TrimRight(strings.Repeat("?,", len(clean)), ",")
|
|
q := fmt.Sprintf(`DELETE FROM hitl_interrupts WHERE status != 'pending' AND id IN (%s)`, placeholders)
|
|
args := make([]interface{}, len(clean))
|
|
for i, id := range clean {
|
|
args[i] = id
|
|
}
|
|
res, err := db.Exec(q, args...)
|
|
if err != nil {
|
|
db.logger.Error("批量删除人机协同审计日志失败", zap.Error(err), zap.Int("count", len(clean)))
|
|
return 0, fmt.Errorf("批量删除人机协同审计日志失败: %w", err)
|
|
}
|
|
n, _ := res.RowsAffected()
|
|
return n, nil
|
|
}
|
|
|
|
// DeleteHitlInterruptLogsMatching deletes decided logs matching whereSQL (e.g. "WHERE 1=1 AND status != 'pending' ...").
|
|
func (db *DB) DeleteHitlInterruptLogsMatching(whereSQL string, args []interface{}) (int64, error) {
|
|
if db == nil {
|
|
return 0, fmt.Errorf("database is nil")
|
|
}
|
|
whereSQL = strings.TrimSpace(whereSQL)
|
|
if whereSQL == "" {
|
|
return 0, fmt.Errorf("where clause is required")
|
|
}
|
|
q := `DELETE FROM hitl_interrupts ` + whereSQL
|
|
res, err := db.Exec(q, args...)
|
|
if err != nil {
|
|
db.logger.Error("清空人机协同审计日志失败", zap.Error(err))
|
|
return 0, fmt.Errorf("清空人机协同审计日志失败: %w", err)
|
|
}
|
|
n, _ := res.RowsAffected()
|
|
return n, nil
|
|
}
|
|
|
|
// PurgeHitlInterruptLogsBefore deletes decided logs with decided/created time before cutoff.
|
|
func (db *DB) PurgeHitlInterruptLogsBefore(cutoff time.Time) (int64, error) {
|
|
if db == nil {
|
|
return 0, fmt.Errorf("database is nil")
|
|
}
|
|
res, err := db.Exec(
|
|
`DELETE FROM hitl_interrupts WHERE status != 'pending' AND datetime(COALESCE(decided_at, created_at)) < datetime(?)`,
|
|
cutoff.UTC().Format(time.RFC3339),
|
|
)
|
|
if err != nil {
|
|
db.logger.Error("清理过期人机协同审计日志失败", zap.Error(err))
|
|
return 0, fmt.Errorf("清理过期人机协同审计日志失败: %w", err)
|
|
}
|
|
n, _ := res.RowsAffected()
|
|
return n, nil
|
|
}
|