lato_storage 3.0.4 → 3.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/controllers/lato_storage/application_controller.rb +10 -8
- data/app/jobs/lato_storage/preload_dashboard_data_job.rb +63 -0
- data/app/views/lato_storage/application/index.html.erb +20 -14
- data/app/views/lato_storage/attachments/index.html.erb +1 -1
- data/app/views/lato_storage/blobs/index.html.erb +1 -1
- data/app/views/lato_storage/variant_records/index.html.erb +1 -1
- data/config/locales/en.yml +2 -1
- data/config/locales/it.yml +1 -0
- data/lib/lato_storage/config.rb +9 -1
- data/lib/lato_storage/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 59aecfc2a74ab7106dee69bff37a88763d23a003f2b3483864a332082492cf73
|
4
|
+
data.tar.gz: 756beed5dd3a8225dee740d5fd5d99e9352b0c0a0b9741a4e4335c392200cefe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9e0309d7083223d2196227dbf9cb7167540333f4c120b77311d4f7dbdd8c67c8dd8e2ff3bee064597be2d63bf2c0fcf345f9ebb69fd4c6ba6594660228a72859
|
7
|
+
data.tar.gz: 28fdcf5450b6792ad5416f83cb84017c4b798c5b31f5b7ef16ba637c83ed35a9445b0a045ee6ba933e8e5aaa0587a1ad85c45d47935ecdc0f4b4afd9dabdb135
|
@@ -6,17 +6,19 @@ module LatoStorage
|
|
6
6
|
before_action { active_sidebar(:lato_storage); active_navbar(:lato_storage) }
|
7
7
|
|
8
8
|
def index
|
9
|
-
@blobs_count = ActiveStorage::Blob.count
|
10
|
-
@attachments_count = ActiveStorage::Attachment.count
|
11
|
-
@variant_records_count = defined?(ActiveStorage::VariantRecord) ? ActiveStorage::VariantRecord.count : 0
|
12
|
-
@deletable_blobs_count = ActiveStorage::Blob.unattached.where('active_storage_blobs.created_at < ?', 12.hours.ago).count
|
9
|
+
# @blobs_count = ActiveStorage::Blob.count
|
10
|
+
# @attachments_count = ActiveStorage::Attachment.count
|
11
|
+
# @variant_records_count = defined?(ActiveStorage::VariantRecord) ? ActiveStorage::VariantRecord.count : 0
|
12
|
+
# @deletable_blobs_count = ActiveStorage::Blob.unattached.where('active_storage_blobs.created_at < ?', 12.hours.ago).count
|
13
13
|
|
14
|
-
@total_storage = ActiveStorage::Blob.sum(:byte_size)
|
15
|
-
@avg_storage = @total_storage / @blobs_count if @blobs_count.positive?
|
14
|
+
# @total_storage = ActiveStorage::Blob.sum(:byte_size)
|
15
|
+
# @avg_storage = @total_storage / @blobs_count if @blobs_count.positive?
|
16
16
|
|
17
|
-
@content_types = ActiveStorage::Blob.group(:content_type).count.sort_by { |_, count| -count }.first(5)
|
17
|
+
# @content_types = ActiveStorage::Blob.group(:content_type).count.sort_by { |_, count| -count }.first(5)
|
18
18
|
|
19
|
-
@largest_blobs = ActiveStorage::Blob.order(byte_size: :desc).limit(3)
|
19
|
+
# @largest_blobs = ActiveStorage::Blob.order(byte_size: :desc).limit(3)
|
20
|
+
|
21
|
+
@data = LatoStorage::PreloadDashboardDataJob.perform_now
|
20
22
|
end
|
21
23
|
|
22
24
|
def cleaner
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module LatoStorage
|
2
|
+
class PreloadDashboardDataJob < ApplicationJob
|
3
|
+
SEMAPHORE_CACHE_KEY = 'LatoStorage::PreloadDashboardDataJob/semaphore'
|
4
|
+
DATA_CACHE_KEY = 'LatoStorage::PreloadDashboardDataJob/data'
|
5
|
+
|
6
|
+
def perform(force_execution = false)
|
7
|
+
return load_data unless LatoStorage.config.optimize_performances
|
8
|
+
|
9
|
+
data = Rails.cache.read(DATA_CACHE_KEY)
|
10
|
+
return data || {} if Rails.cache.read(SEMAPHORE_CACHE_KEY)
|
11
|
+
|
12
|
+
if data && !force_execution
|
13
|
+
LatoStorage::PreloadDashboardDataJob.perform_later(true)
|
14
|
+
return data
|
15
|
+
end
|
16
|
+
|
17
|
+
Rails.cache.write(SEMAPHORE_CACHE_KEY, true, expires_in: 30.minutes)
|
18
|
+
data = load_data
|
19
|
+
Rails.cache.write(DATA_CACHE_KEY, data, expires_in: 12.hours)
|
20
|
+
return data
|
21
|
+
rescue StandardError => e
|
22
|
+
Rails.logger.error "Error in LatoStorage::PreloadDashboardDataJob: #{e.message}"
|
23
|
+
Rails.logger.error e.backtrace.join("\n")
|
24
|
+
Rails.cache.delete(SEMAPHORE_CACHE_KEY)
|
25
|
+
nil
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def load_data
|
31
|
+
blobs_count = ActiveStorage::Blob.count
|
32
|
+
attachments_count = ActiveStorage::Attachment.count
|
33
|
+
variant_records_count = defined?(ActiveStorage::VariantRecord) ? ActiveStorage::VariantRecord.count : 0
|
34
|
+
deletable_blobs_count = ActiveStorage::Blob.unattached.where('active_storage_blobs.created_at < ?', 12.hours.ago).count
|
35
|
+
total_storage = ActiveStorage::Blob.sum(:byte_size)
|
36
|
+
avg_storage = blobs_count.positive? ? total_storage / blobs_count : 0
|
37
|
+
content_types = ActiveStorage::Blob.group(:content_type).count.sort_by { |_, count| -count }.first(5)
|
38
|
+
largest_blobs = ActiveStorage::Blob.order(byte_size: :desc).limit(3).map do |blob|
|
39
|
+
{
|
40
|
+
id: blob.id,
|
41
|
+
filename: blob.filename.to_s,
|
42
|
+
byte_size: blob.byte_size,
|
43
|
+
created_at: blob.created_at,
|
44
|
+
content_type: blob.content_type,
|
45
|
+
service_name: blob.service_name,
|
46
|
+
checksum: blob.checksum,
|
47
|
+
url: Rails.application.routes.url_helpers.rails_blob_url(blob, only_path: true, expires_in: 12.hours)
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
{
|
52
|
+
blobs_count: blobs_count,
|
53
|
+
attachments_count: attachments_count,
|
54
|
+
variant_records_count: variant_records_count,
|
55
|
+
deletable_blobs_count: deletable_blobs_count,
|
56
|
+
total_storage: total_storage,
|
57
|
+
avg_storage: avg_storage,
|
58
|
+
content_types: content_types,
|
59
|
+
largest_blobs: largest_blobs
|
60
|
+
}
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -1,10 +1,16 @@
|
|
1
1
|
<%= lato_page_head I18n.t('lato_storage.storage') %>
|
2
2
|
|
3
|
+
<% if LatoStorage.config.optimize_performances %>
|
4
|
+
<div class="alert alert-info mb-3">
|
5
|
+
<%= I18n.t('lato_storage.optimize_performances_active') %>
|
6
|
+
</div>
|
7
|
+
<% end %>
|
8
|
+
|
3
9
|
<div class="row">
|
4
10
|
<div class="col col-6 col-lg-3 mb-3">
|
5
11
|
<div class="card">
|
6
12
|
<div class="card-body text-center">
|
7
|
-
<div class="fw-bold fs-2"><%= @blobs_count %></div>
|
13
|
+
<div class="fw-bold fs-2"><%= @data[:blobs_count] %></div>
|
8
14
|
<div><%= I18n.t('lato_storage.total_blobs') %></div>
|
9
15
|
<%= link_to I18n.t('lato_storage.cta_see_all'), lato_storage.blobs_path, class: 'btn btn-primary btn-sm mt-3', data: { lato_action_target: 'trigger', turbo_frame: 'lato_index_default_active_storage_blob', action_size: 'xl', action_title: I18n.t('lato_storage.blobs') } %>
|
10
16
|
</div>
|
@@ -14,7 +20,7 @@
|
|
14
20
|
<div class="col col-6 col-lg-3 mb-3">
|
15
21
|
<div class="card">
|
16
22
|
<div class="card-body text-center">
|
17
|
-
<div class="fw-bold fs-2"><%= @attachments_count %></div>
|
23
|
+
<div class="fw-bold fs-2"><%= @data[:attachments_count] %></div>
|
18
24
|
<div><%= I18n.t('lato_storage.total_attachments') %></div>
|
19
25
|
<%= link_to I18n.t('lato_storage.cta_see_all'), lato_storage.attachments_path, class: 'btn btn-primary btn-sm mt-3', data: { lato_action_target: 'trigger', turbo_frame: 'lato_index_default_active_storage_attachment', action_size: 'xl', action_title: I18n.t('lato_storage.attachments') } %>
|
20
26
|
</div>
|
@@ -24,7 +30,7 @@
|
|
24
30
|
<div class="col col-6 col-lg-3 mb-3">
|
25
31
|
<div class="card">
|
26
32
|
<div class="card-body text-center">
|
27
|
-
<div class="fw-bold fs-2"><%= @variant_records_count %></div>
|
33
|
+
<div class="fw-bold fs-2"><%= @data[:variant_records_count] %></div>
|
28
34
|
<div><%= I18n.t('lato_storage.total_variant_records') %></div>
|
29
35
|
<%= link_to I18n.t('lato_storage.cta_see_all'), lato_storage.variant_records_path, class: 'btn btn-primary btn-sm mt-3', data: { lato_action_target: 'trigger', turbo_frame: 'lato_index_default_active_storage_variant_record', action_size: 'xl', action_title: I18n.t('lato_storage.variant_records') } %>
|
30
36
|
</div>
|
@@ -34,7 +40,7 @@
|
|
34
40
|
<div class="col col-6 col-lg-3 mb-3">
|
35
41
|
<div class="card">
|
36
42
|
<div class="card-body text-center">
|
37
|
-
<div class="fw-bold fs-2"><%= @deletable_blobs_count %></div>
|
43
|
+
<div class="fw-bold fs-2"><%= @data[:deletable_blobs_count] %></div>
|
38
44
|
<div><%= I18n.t('lato_storage.deletable_blobs') %></div>
|
39
45
|
<%= link_to I18n.t('lato_storage.cta_free_space'), lato_storage.cleaner_path, class: 'btn btn-primary btn-sm mt-3', data: { turbo_method: :post, lato_action_target: 'trigger', turbo_frame: 'lato_operation' } %>
|
40
46
|
</div>
|
@@ -53,10 +59,10 @@
|
|
53
59
|
</h5>
|
54
60
|
</div>
|
55
61
|
<div class="card-body">
|
56
|
-
<% if @content_types.any? %>
|
57
|
-
<% total = @content_types.sum { |_, count| count } %>
|
62
|
+
<% if @data[:content_types].any? %>
|
63
|
+
<% total = @data[:content_types].sum { |_, count| count } %>
|
58
64
|
<ul class="list-group list-group-flush">
|
59
|
-
<% @content_types.each do |content_type, count| %>
|
65
|
+
<% @data[:content_types].each do |content_type, count| %>
|
60
66
|
<li class="list-group-item">
|
61
67
|
<div class="d-flex justify-content-between align-items-center">
|
62
68
|
<strong><%= content_type %></strong>
|
@@ -91,7 +97,7 @@
|
|
91
97
|
<div class="col col-12 col-md-6 mb-3 mb-md-0">
|
92
98
|
<div class="card">
|
93
99
|
<div class="card-body text-center">
|
94
|
-
<div class="fw-bold fs-2"><%= format_bytes @total_storage %></div>
|
100
|
+
<div class="fw-bold fs-2"><%= format_bytes @data[:total_storage] %></div>
|
95
101
|
<div><%= I18n.t('lato_storage.total_storage') %></div>
|
96
102
|
</div>
|
97
103
|
</div>
|
@@ -100,7 +106,7 @@
|
|
100
106
|
<div class="col col-12 col-md-6 mb-3 mb-md-0">
|
101
107
|
<div class="card">
|
102
108
|
<div class="card-body text-center">
|
103
|
-
<div class="fw-bold fs-2"><%= format_bytes @avg_storage %></div>
|
109
|
+
<div class="fw-bold fs-2"><%= format_bytes @data[:avg_storage] %></div>
|
104
110
|
<div><%= I18n.t('lato_storage.avg_storage') %></div>
|
105
111
|
</div>
|
106
112
|
</div>
|
@@ -115,15 +121,15 @@
|
|
115
121
|
</h5>
|
116
122
|
</div>
|
117
123
|
<div class="card-body">
|
118
|
-
<% if @largest_blobs.any? %>
|
124
|
+
<% if @data[:largest_blobs].any? %>
|
119
125
|
<div class="list-group list-group-flush">
|
120
|
-
<% @largest_blobs.each do |blob| %>
|
121
|
-
<a class="list-group-item list-group-item-action" href="<%=
|
126
|
+
<% @data[:largest_blobs].each do |blob| %>
|
127
|
+
<a class="list-group-item list-group-item-action" href="<%= blob[:url] %>" target="_blank" rel="noopener noreferrer" download>
|
122
128
|
<div class="d-flex justify-content-between align-items-center">
|
123
|
-
<strong class="text-truncate"><%= blob
|
129
|
+
<strong class="text-truncate"><%= blob[:filename] %></strong>
|
124
130
|
<div class="d-flex align-items-center ms-3">
|
125
131
|
<span class="badge bg-primary rounded-pill">
|
126
|
-
<%= format_bytes blob
|
132
|
+
<%= format_bytes blob[:byte_size] %>
|
127
133
|
</span>
|
128
134
|
<i class="bi bi-download ms-2"></i>
|
129
135
|
</div>
|
data/config/locales/en.yml
CHANGED
@@ -16,4 +16,5 @@ en:
|
|
16
16
|
cta_see_all: "See all"
|
17
17
|
blobs: "Blobs"
|
18
18
|
attachments: "Attachments"
|
19
|
-
variant_records: "Variant Records"
|
19
|
+
variant_records: "Variant Records"
|
20
|
+
optimize_performances_active: "The displayed data is cached to optimize performance. The shown values are therefore not updated in real-time and may not reflect the most recent changes."
|
data/config/locales/it.yml
CHANGED
@@ -17,3 +17,4 @@ it:
|
|
17
17
|
blobs: "Blob"
|
18
18
|
attachments: "Allegati"
|
19
19
|
variant_records: "Varianti"
|
20
|
+
optimize_performances_active: "I dati visualizzati sono cachati per ottimizzare le prestazioni. I valori mostrati non sono quindi aggiornati in tempo reale e potrebbero non riflettere le modifiche più recenti."
|
data/lib/lato_storage/config.rb
CHANGED
@@ -3,8 +3,16 @@ module LatoStorage
|
|
3
3
|
# This class contains the default configuration of the engine.
|
4
4
|
##
|
5
5
|
class Config
|
6
|
-
|
6
|
+
|
7
|
+
# This option allows to optimize performances by skipping count queries.
|
8
|
+
# If set to true, it will not perform count queries for collections and use other methods instead.
|
9
|
+
# This can significantly speed up operations but may lead to inaccuracies in counts.
|
10
|
+
# This is really useful for large datasets where performance is critical.
|
11
|
+
# Default is false.
|
12
|
+
attr_accessor :optimize_performances
|
13
|
+
|
7
14
|
def initialize
|
15
|
+
@optimize_performances = false
|
8
16
|
end
|
9
17
|
end
|
10
18
|
end
|
data/lib/lato_storage/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lato_storage
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gregorio Galante
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-
|
11
|
+
date: 2025-07-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -57,6 +57,7 @@ files:
|
|
57
57
|
- app/controllers/lato_storage/variant_records_controller.rb
|
58
58
|
- app/helpers/lato_storage/application_helper.rb
|
59
59
|
- app/jobs/lato_storage/application_job.rb
|
60
|
+
- app/jobs/lato_storage/preload_dashboard_data_job.rb
|
60
61
|
- app/mailers/lato_storage/application_mailer.rb
|
61
62
|
- app/views/lato_storage/application/index.html.erb
|
62
63
|
- app/views/lato_storage/attachments/index.html.erb
|