fix: 503 при сбое GetScan вместо ложного 404 scan not found
- Store.GetScan возвращает (job, ok, error); Postgres отдаёт err при ошибке БД/JSON - API: getScanOrWriteError → 503 scan storage temporarily unavailable - Web UI: понятное сообщение для HTTP 503 при опросе скана Made-with: Cursor
This commit is contained in:
@@ -5,6 +5,7 @@ import (
|
||||
"database/sql"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
"sort"
|
||||
"strings"
|
||||
@@ -98,7 +99,7 @@ insert into scan_jobs (
|
||||
return job, nil
|
||||
}
|
||||
|
||||
func (s *PostgresStore) GetScan(id string) (ScanJob, bool) {
|
||||
func (s *PostgresStore) GetScan(id string) (ScanJob, bool, error) {
|
||||
query := `
|
||||
select id, name, status, cidrs::text, exclude_ips::text, options::text,
|
||||
progress, stats::text, coalesce(snmp_credentials_id::text, ''),
|
||||
@@ -130,28 +131,28 @@ limit 1`
|
||||
&finishedAt,
|
||||
)
|
||||
if errors.Is(err, sql.ErrNoRows) {
|
||||
return ScanJob{}, false
|
||||
return ScanJob{}, false, nil
|
||||
}
|
||||
if err != nil {
|
||||
log.Printf("postgres GetScan id=%q: row scan: %v", id, err)
|
||||
return ScanJob{}, false
|
||||
return ScanJob{}, false, fmt.Errorf("postgres GetScan id=%q: %w", id, err)
|
||||
}
|
||||
|
||||
if err = json.Unmarshal([]byte(cidrsRaw), &job.CIDRs); err != nil {
|
||||
log.Printf("postgres GetScan id=%q: cidrs json (len=%d): %v", id, len(cidrsRaw), err)
|
||||
return ScanJob{}, false
|
||||
return ScanJob{}, false, fmt.Errorf("postgres GetScan id=%q cidrs: %w", id, err)
|
||||
}
|
||||
if err = json.Unmarshal([]byte(excludeRaw), &job.ExcludeIPs); err != nil {
|
||||
log.Printf("postgres GetScan id=%q: exclude_ips json: %v", id, err)
|
||||
return ScanJob{}, false
|
||||
return ScanJob{}, false, fmt.Errorf("postgres GetScan id=%q exclude_ips: %w", id, err)
|
||||
}
|
||||
if err = json.Unmarshal([]byte(optionsRaw), &job.Options); err != nil {
|
||||
log.Printf("postgres GetScan id=%q: options json: %v", id, err)
|
||||
return ScanJob{}, false
|
||||
return ScanJob{}, false, fmt.Errorf("postgres GetScan id=%q options: %w", id, err)
|
||||
}
|
||||
if err = json.Unmarshal([]byte(statsRaw), &job.Stats); err != nil {
|
||||
log.Printf("postgres GetScan id=%q: stats json: %v", id, err)
|
||||
return ScanJob{}, false
|
||||
return ScanJob{}, false, fmt.Errorf("postgres GetScan id=%q stats: %w", id, err)
|
||||
}
|
||||
if startedAt.Valid {
|
||||
job.StartedAt = startedAt.Time
|
||||
@@ -160,7 +161,7 @@ limit 1`
|
||||
job.FinishedAt = finishedAt.Time
|
||||
}
|
||||
|
||||
return job, true
|
||||
return job, true, nil
|
||||
}
|
||||
|
||||
func (s *PostgresStore) ListScans(limit int) []ScanJob {
|
||||
@@ -230,7 +231,11 @@ limit $1`
|
||||
}
|
||||
|
||||
func (s *PostgresStore) UpdateScan(id string, update ScanUpdate) (ScanJob, bool) {
|
||||
current, ok := s.GetScan(id)
|
||||
current, ok, err := s.GetScan(id)
|
||||
if err != nil {
|
||||
log.Printf("postgres UpdateScan: GetScan id=%q: %v", id, err)
|
||||
return ScanJob{}, false
|
||||
}
|
||||
if !ok {
|
||||
return ScanJob{}, false
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user