Class: Solidstats::BundlerAuditService

Inherits:
Object
  • Object
show all
Defined in:
app/services/solidstats/bundler_audit_service.rb

Overview

Service to collect and process bundler audit security vulnerability data

Constant Summary collapse

CACHE_FILE =
Rails.root.join("solidstats", "bundler_audit.json")
CACHE_HOURS =

Cache for 24 hours

24

Class Method Summary collapse

Class Method Details

.fetch_vulnerabilitiesHash

Get cached vulnerabilities or scan if cache is stale

Returns:

  • (Hash)

    The vulnerability data from JSON file



12
13
14
15
16
17
18
# File 'app/services/solidstats/bundler_audit_service.rb', line 12

def fetch_vulnerabilities
  if cache_stale?
    scan_and_cache
  end

  load_cached_data
end

.scan_and_cacheHash

Force a fresh scan and update cache

Returns:

  • (Hash)

    Fresh vulnerability data



22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'app/services/solidstats/bundler_audit_service.rb', line 22

def scan_and_cache
  Rails.logger.info("Running bundler audit scan...")

  begin
    vulnerabilities_data = collect_bundler_audit_data
    save_to_cache(vulnerabilities_data)
    update_summary_json(vulnerabilities_data)
    vulnerabilities_data
  rescue => e
    Rails.logger.error("Error running bundler audit: #{e.message}")
    { "output" => { "results" => [], "error" => e.message } }
  end
end

.summaryHash

Get summary for dashboard display

Returns:

  • (Hash)

    Summary information with status, count, and message



38
39
40
41
42
43
44
45
46
47
48
49
# File 'app/services/solidstats/bundler_audit_service.rb', line 38

def summary
  data = fetch_vulnerabilities
  results = data.dig("output", "results") || []
  vuln_count = results.count

  {
    count: vuln_count,
    status: determine_status(vuln_count),
    message: generate_message(vuln_count),
    last_updated: data.dig("output", "created_at") || Time.current
  }
end