refactor(web): remove deprecated dashboard components and enhance KPI grid
quality / commitlint (push) Skipped
quality / changes (push) Successful in 9s
quality / docker-check (push) Skipped
quality / openapi (push) Successful in 46s
quality / web (push) Successful in 1m16s
quality / go (push) Successful in 2m42s
quality / bird2 (push) Successful in 16s
CD / quality (push) Successful in 5m19s
CD / publish (push) Successful in 7m19s
quality / commitlint (push) Skipped
quality / changes (push) Successful in 9s
quality / docker-check (push) Skipped
quality / openapi (push) Successful in 46s
quality / web (push) Successful in 1m16s
quality / go (push) Successful in 2m42s
quality / bird2 (push) Successful in 16s
CD / quality (push) Successful in 5m19s
CD / publish (push) Successful in 7m19s
- Deleted unused components: `DashboardActivityTimeline`, `DashboardFramePanel`, `DashboardModulesGrid`, `DashboardRecentJobsGrid`, and `DashboardRecentRevisionsGrid` to streamline the dashboard. - Updated `DashboardKpiGrid` to improve KPI display logic, including progress indicators and enhanced badge functionality. - Refactored `DashboardNetworkHealth` to provide better status representation based on loading states and network conditions. - Introduced new properties for KPI cards to support progress tracking and improved visual feedback. This cleanup aims to enhance performance and maintainability of the dashboard while providing a better user experience.
This commit is contained in:
@@ -1,10 +1,6 @@
|
||||
package pipeline
|
||||
|
||||
import (
|
||||
"crypto/sha256"
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"evobgp/internal/store"
|
||||
@@ -12,89 +8,7 @@ import (
|
||||
|
||||
// moduleIngestInputHash fingerprints module config and child entries so snapshots invalidate on CRUD.
|
||||
func moduleIngestInputHash(st store.Backend, tenantID string, mod *store.Module) (string, error) {
|
||||
if st == nil || mod == nil {
|
||||
return "", fmt.Errorf("pipeline: module hash: missing store or module")
|
||||
}
|
||||
h := sha256.New()
|
||||
_, _ = fmt.Fprintf(h, "type=%s\n", strings.TrimSpace(mod.Type))
|
||||
_, _ = fmt.Fprintf(h, "enabled=%t\n", mod.Enabled)
|
||||
if mod.DefaultCommunityID != nil {
|
||||
_, _ = fmt.Fprintf(h, "default_community=%s\n", strings.TrimSpace(*mod.DefaultCommunityID))
|
||||
}
|
||||
_, _ = fmt.Fprintf(h, "doh_policy=%s\n", store.NormalizeDohResolverPolicy(mod.DohResolverPolicy))
|
||||
for _, pid := range mod.EffectiveDohProfileIDs() {
|
||||
_, _ = fmt.Fprintf(h, "doh_profile=%s\n", pid)
|
||||
if prof, err := st.GetDohProfile(tenantID, pid); err == nil && prof != nil {
|
||||
_, _ = fmt.Fprintf(h, "doh_url=%s\n", strings.TrimSpace(prof.URL))
|
||||
if prof.TimeoutMs != nil {
|
||||
_, _ = fmt.Fprintf(h, "doh_timeout=%d\n", *prof.TimeoutMs)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
switch mod.Type {
|
||||
case "IP_RANGES":
|
||||
list, err := st.ListIPRangeEntries(tenantID, mod.ID)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
sort.Slice(list, func(i, j int) bool { return list[i].Prefix < list[j].Prefix })
|
||||
for _, e := range list {
|
||||
comm := ""
|
||||
if e.CommunityID != nil {
|
||||
comm = *e.CommunityID
|
||||
}
|
||||
_, _ = fmt.Fprintf(h, "ip=%s|c=%s\n", e.Prefix, comm)
|
||||
}
|
||||
case "AS_PREFIXES":
|
||||
list, err := st.ListASEntries(tenantID, mod.ID)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
sort.Slice(list, func(i, j int) bool { return list[i].ASN < list[j].ASN })
|
||||
for _, e := range list {
|
||||
comm := ""
|
||||
if e.CommunityID != nil {
|
||||
comm = *e.CommunityID
|
||||
}
|
||||
_, _ = fmt.Fprintf(h, "as=%d|c=%s\n", e.ASN, comm)
|
||||
}
|
||||
case "CDN_CIDRS":
|
||||
list, err := st.ListCDNSources(tenantID, mod.ID)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
sort.Slice(list, func(i, j int) bool { return list[i].ID < list[j].ID })
|
||||
for _, s := range list {
|
||||
comm := ""
|
||||
if s.CommunityID != nil {
|
||||
comm = *s.CommunityID
|
||||
}
|
||||
interval := 0
|
||||
if s.RefreshIntervalSec != nil {
|
||||
interval = *s.RefreshIntervalSec
|
||||
}
|
||||
_, _ = fmt.Fprintf(h, "cdn=%s|url=%s|kind=%s|path=%s|c=%s|etag=%s|interval=%d\n",
|
||||
s.ID, strings.TrimSpace(s.URL), s.SourceKind, strings.TrimSpace(s.PrefixPath), comm,
|
||||
strings.TrimSpace(s.Etag), interval)
|
||||
}
|
||||
case "DOMAINS":
|
||||
list, err := st.ListDomainEntries(tenantID, mod.ID)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
sort.Slice(list, func(i, j int) bool { return list[i].FQDN < list[j].FQDN })
|
||||
for _, e := range list {
|
||||
comm := ""
|
||||
if e.CommunityID != nil {
|
||||
comm = *e.CommunityID
|
||||
}
|
||||
_, _ = fmt.Fprintf(h, "dom=%s|c=%s\n", strings.TrimSpace(e.FQDN), comm)
|
||||
}
|
||||
default:
|
||||
_, _ = fmt.Fprintf(h, "unknown_type=%s\n", mod.Type)
|
||||
}
|
||||
return hex.EncodeToString(h.Sum(nil)), nil
|
||||
return store.ComputeModuleInputHash(st, tenantID, mod)
|
||||
}
|
||||
|
||||
func persistModuleSnapshot(st store.Backend, tenantID string, mod *store.Module, rows []store.PrefixRow) error {
|
||||
@@ -105,18 +19,32 @@ func persistModuleSnapshot(st store.Backend, tenantID string, mod *store.Module,
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return st.SetModulePrefixSnapshot(tenantID, mod.ID, hash, rows)
|
||||
if err := st.SetModulePrefixSnapshot(tenantID, mod.ID, hash, rows); err != nil {
|
||||
return err
|
||||
}
|
||||
_ = st.SetModuleInputHash(tenantID, mod.ID, hash)
|
||||
return nil
|
||||
}
|
||||
|
||||
func moduleRowsFromSnapshot(st store.Backend, tenantID string, mod *store.Module) ([]store.PrefixRow, bool, error) {
|
||||
snap, ok, err := st.GetModulePrefixSnapshot(tenantID, mod.ID)
|
||||
if err != nil || !ok || snap == nil {
|
||||
return nil, false, err
|
||||
}
|
||||
if h := strings.TrimSpace(mod.InputHash); h != "" {
|
||||
if snap.InputHash != h {
|
||||
return nil, false, nil
|
||||
}
|
||||
return append([]store.PrefixRow(nil), snap.Prefixes...), true, nil
|
||||
}
|
||||
// Fallback for rows written before module.input_hash existed: recompute and backfill.
|
||||
hash, err := moduleIngestInputHash(st, tenantID, mod)
|
||||
if err != nil {
|
||||
return nil, false, err
|
||||
}
|
||||
snap, ok, err := st.GetModulePrefixSnapshot(tenantID, mod.ID)
|
||||
if err != nil || !ok || snap == nil || snap.InputHash != hash {
|
||||
return nil, false, err
|
||||
if snap.InputHash != hash {
|
||||
return nil, false, nil
|
||||
}
|
||||
cp := append([]store.PrefixRow(nil), snap.Prefixes...)
|
||||
return cp, true, nil
|
||||
_ = st.SetModuleInputHash(tenantID, mod.ID, hash)
|
||||
return append([]store.PrefixRow(nil), snap.Prefixes...), true, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user