diff --git a/internal/judge/judge.go b/internal/judge/judge.go new file mode 100644 index 0000000..9b36257 --- /dev/null +++ b/internal/judge/judge.go @@ -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 +} diff --git a/internal/storage/db.go b/internal/storage/db.go index 922441c..1368134 100644 --- a/internal/storage/db.go +++ b/internal/storage/db.go @@ -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 +}