70 lines
1.7 KiB
Go
70 lines
1.7 KiB
Go
package Judge
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/d3m0k1d/BanForge/internal/blocker"
|
|
"github.com/d3m0k1d/BanForge/internal/config"
|
|
"github.com/d3m0k1d/BanForge/internal/logger"
|
|
"github.com/d3m0k1d/BanForge/internal/storage"
|
|
)
|
|
|
|
type Judge struct {
|
|
db *storage.DB
|
|
logger *logger.Logger
|
|
Blocker *blocker.BlockerEngine
|
|
rulesByService map[string][]config.Rule
|
|
}
|
|
|
|
func New(db *storage.DB) *Judge {
|
|
return &Judge{
|
|
db: db,
|
|
logger: logger.New(false),
|
|
rulesByService: make(map[string][]config.Rule),
|
|
}
|
|
}
|
|
|
|
func (j *Judge) LoadRules(rules []config.Rule) {
|
|
j.rulesByService = make(map[string][]config.Rule)
|
|
for _, rule := range rules {
|
|
j.rulesByService[rule.ServiceName] = append(
|
|
j.rulesByService[rule.ServiceName],
|
|
rule,
|
|
)
|
|
}
|
|
j.logger.Info("Rules loaded and indexed by service")
|
|
}
|
|
|
|
func (j *Judge) ProcessUnviewed() ([]storage.LogEntry, error) {
|
|
rows, err := j.db.SearchUnViewed()
|
|
if err != nil {
|
|
j.logger.Error(fmt.Sprintf("Failed to query database: %v", err))
|
|
return nil, err
|
|
}
|
|
defer func() {
|
|
err = rows.Close()
|
|
if err != nil {
|
|
j.logger.Error(fmt.Sprintf("Failed to close database connection: %v", err))
|
|
}
|
|
}()
|
|
|
|
var entries []storage.LogEntry
|
|
|
|
for rows.Next() {
|
|
var entry storage.LogEntry
|
|
err = rows.Scan(&entry.ID, &entry.Service, &entry.IP, &entry.Path, &entry.Status, &entry.Method, &entry.IsViewed, &entry.CreatedAt)
|
|
if err != nil {
|
|
j.logger.Error(fmt.Sprintf("Failed to scan database row: %v", err))
|
|
continue
|
|
}
|
|
entries = append(entries, entry)
|
|
}
|
|
|
|
if err = rows.Err(); err != nil {
|
|
j.logger.Error(fmt.Sprintf("Error iterating rows: %v", err))
|
|
return nil, err
|
|
}
|
|
|
|
return entries, nil
|
|
}
|