Skip to content

Commit a0f06e5

Browse files
committed
Add sole maintainers action and view to CriticalController
1 parent 6a33230 commit a0f06e5

File tree

3 files changed

+82
-0
lines changed

3 files changed

+82
-0
lines changed

app/controllers/critical_controller.rb

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,31 @@ def scatter
7777
@registries = Package.where.not(registry_id: excluded_registry_ids).critical.where('packages.downloads > 0').group(:registry).count.sort_by{|r, c| c}
7878
end
7979

80+
def sole_maintainers
81+
scope = Package.critical.where(maintainers_count: 1).includes(:registry, :maintainers)
82+
83+
@registry = Registry.find_by_name!(params[:registry]) if params[:registry]
84+
85+
scope = scope.where(registry_id: @registry.id) if params[:registry]
86+
87+
if params[:sort].present? || params[:order].present?
88+
sort = params[:sort].presence || 'downloads'
89+
90+
sort = "(repo_metadata ->> 'stargazers_count')::text::integer" if params[:sort] == 'stargazers_count'
91+
if params[:order] == 'asc'
92+
scope = scope.order(Arel.sql(sort).asc.nulls_last)
93+
else
94+
scope = scope.order(Arel.sql(sort).desc.nulls_last)
95+
end
96+
else
97+
scope = scope.order('downloads DESC nulls last')
98+
end
99+
100+
@pagy, @packages = pagy(scope)
101+
102+
@registries = Package.critical.where(maintainers_count: 1).group(:registry).count.sort_by{|r, c| c}
103+
end
104+
80105
def permit_scatter_params
81106
params.permit(:comparison_field)
82107
end
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<% @meta_title = "Critical Open Source #{@registry.try(:ecosystem).try(:humanize)} Packages with Sole Maintainers" %>
2+
<% @meta_description = "Find critical open source #{@registry.try(:ecosystem)} software packages that have only one maintainer, representing a potential risk to software supply chain security." %>
3+
4+
<div class="container-sm">
5+
<h1 class='mb-3'>
6+
Critical Open Source <%= @registry.try(:ecosystem).try(:humanize) %> Packages with Sole Maintainers
7+
</h1>
8+
9+
<p class='lead'>
10+
Find critical open source <%= @registry.try(:ecosystem) %> software packages that have only one maintainer, representing a potential risk to software supply chain security.
11+
</p>
12+
13+
<ul class="nav nav-tabs my-3">
14+
<%= render 'packages/sort' %>
15+
</ul>
16+
17+
<div class="row">
18+
<div class="col-lg-9">
19+
<% @packages.each do |package| %>
20+
<div class="card mb-3">
21+
<div class="card-body">
22+
<h5 class="card-title">
23+
<%= link_to package.name, package_path(package.registry.name, package.name), class: 'text-decoration-none' %>
24+
</h5>
25+
<p class="card-text">
26+
<small class="text-muted">
27+
<%= package.registry.name %>
28+
<%= number_with_delimiter(package.downloads) %> downloads •
29+
Sole maintainer: <%= link_to package.maintainers.first.name, maintainer_path(package.maintainers.first.uuid), class: 'text-decoration-none' %>
30+
</small>
31+
</p>
32+
<% if package.description.present? %>
33+
<p class="card-text"><%= package.description %></p>
34+
<% end %>
35+
</div>
36+
</div>
37+
<% end %>
38+
<%== pagy_bootstrap_nav(@pagy) if @pagy.pages && @pagy.pages > 1 %>
39+
</div>
40+
<div class="col">
41+
<div class="card mb-3">
42+
<div class="card-header">
43+
Filter by Registry
44+
</div>
45+
<div class="list-group list-group-flush">
46+
<% @registries.each do |registry,count| %>
47+
<a class="list-group-item list-group-item-action d-flex justify-content-between align-items-center <%= 'active' if params[:registry] == registry.name %>" href="<%= url_for(registry: (params[:registry] == registry.name ? nil :registry.name), page: nil) %>">
48+
<%= registry %>
49+
<span class="badge bg-primary rounded-pill"><%= number_with_delimiter count%></span>
50+
</a>
51+
<% end %>
52+
</div>
53+
</div>
54+
</div>
55+
</div>
56+
</div>

config/routes.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@
108108

109109
get :critical, to: 'critical#index'
110110
get 'critical/scatter', to: 'critical#scatter', as: :critical_registry_scatter
111+
get 'critical/sole-maintainers', to: 'critical#sole_maintainers', as: :critical_sole_maintainers
111112
get 'critical/:id', to: 'critical#show', as: :critical_registry, constraints: { id: /[^\/]+/ }
112113

113114

0 commit comments

Comments
 (0)