feat: add new block judge
All checks were successful
CI.yml / build (push) Successful in 1m48s

This commit is contained in:
d3m0k1d
2026-01-13 19:08:11 +03:00
parent 0421d9ef40
commit 95a58dc780
2 changed files with 78 additions and 0 deletions

69
internal/judge/judge.go Normal file
View File

@@ -0,0 +1,69 @@
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
}

View File

@@ -40,3 +40,12 @@ func (d *DB) CreateTable() error {
d.logger.Info("Created tables")
return nil
}
func (d *DB) SearchUnViewed() (*sql.Rows, error) {
rows, err := d.db.Query("SELECT id, service, ip, path, status, method, viewed, created_at FROM requests WHERE viewed = 0")
if err != nil {
d.logger.Error("Failed to query database")
return nil, err
}
return rows, nil
}