Add server-side caching and HTTP caching when serving events in the timeline

This commit is contained in:
Jorge Manrubia
2025-09-09 11:30:05 +02:00
parent fc2aa65cb7
commit 61fd84ab5e
12 changed files with 66 additions and 59 deletions
@@ -2,5 +2,6 @@ class Events::DaysController < ApplicationController
include DayTimelinesScoped
def index
fresh_when @day_timeline
end
end
+2
View File
@@ -4,5 +4,7 @@ class EventsController < ApplicationController
enable_collection_filtering only: :index
def index
Rails.logger.info "***** #{@day_timeline.cache_key}"
fresh_when @day_timeline
end
end
+1 -1
View File
@@ -58,7 +58,7 @@ class Filter < ApplicationRecord
end
def cache_key
ActiveSupport::Cache.expand_cache_key collections.cache_key_with_version, super
ActiveSupport::Cache.expand_cache_key [ params_digest ], "filter"
end
private
+4
View File
@@ -73,4 +73,8 @@ module Filter::Params
end
end
end
def params_digest
super.presence || self.class.digest_params(as_params)
end
end
+4
View File
@@ -45,6 +45,10 @@ class User::DayTimeline
week_starts_at + 1.week
end
def cache_key
ActiveSupport::Cache.expand_cache_key [ user, filter, day.to_date, events ], "day-timeline"
end
private
def first_day_with_activity_this_week?
day.monday? || (earliest_time.present? && earliest_time < day.beginning_of_week(:monday))
+4
View File
@@ -82,6 +82,10 @@ class User::Filtering
end
end
def cache_key
ActiveSupport::Cache.expand_cache_key( [ user, filter, expanded? ], "user-filtering")
end
private
def supports_collection_filtering?
@collection_filtering_route_resolver.present?
+1 -8
View File
@@ -1,13 +1,6 @@
<section class="events__day" data-controller="related-element"
data-related-element-highlight-class="event--related">
<% if day_timeline.has_activity? %>
<div class="events__columns">
<%= render "events/day_timeline_column", event_type: "added", day_timeline: day_timeline %>
<%= render "events/day_timeline_column", event_type: "updated", day_timeline: day_timeline %>
<%= render "events/day_timeline_column", event_type: "closed", day_timeline: day_timeline %>
</div>
<% end %>
<%= render "events/day_timeline/columns", day_timeline: day_timeline %>
<%= render "events/weekly_highlights", day_timeline: day_timeline if day_timeline.has_weekly_highlights? %>
<%= render "events/empty_days", day_timeline: day_timeline %>
</section>
@@ -1,11 +0,0 @@
<% day_timeline.events.group_by { event_column(it) }.each do |column, events_grouped_by_column| %>
<div class="events__column">
<h2 class="events__column-header"><%= column %></h2>
<% events_grouped_by_column.group_by { it.created_at.hour }.each do |hour, events| %>
<%= event_cluster_tag(hour, column) do %>
<%= render partial: "events/event", collection: events %>
<%= local_datetime_tag events.first.created_at, class: "event__timestamp txt-small translucent" %>
<% end %>
<% end %>
</div>
<% end %>
@@ -0,0 +1,9 @@
<% cache day_timeline.events do %>
<% if day_timeline.has_activity? %>
<div class="events__columns">
<%= render "events/day_timeline/column", event_type: "added", day_timeline: day_timeline %>
<%= render "events/day_timeline/column", event_type: "updated", day_timeline: day_timeline %>
<%= render "events/day_timeline/column", event_type: "closed", day_timeline: day_timeline %>
</div>
<% end %>
<% end %>
-1
View File
@@ -5,7 +5,6 @@
<% content_for :header do %>
<%= render "filters/menu", user_filtering: @user_filtering %>
<%= render "filters/menu/add_card_button", user_filtering: @user_filtering %>
<h1 class="header__title overflow-ellipsis">
+40 -38
View File
@@ -1,41 +1,43 @@
<nav data-controller="dialog" data-action="keydown.esc->dialog#close click@document->dialog#closeOnClickOutside">
<%= render "filters/menu/button" %>
<% cache user_filtering do %>
<nav data-controller="dialog" data-action="keydown.esc->dialog#close click@document->dialog#closeOnClickOutside">
<%= render "filters/menu/button" %>
<%= tag.dialog class: "fizzy-menu filter popup popup--animated panel margin-block-start-half",
data: {
action: "turbo:before-cache@document->dialog#close keydown->navigable-list#navigate filter:changed->navigable-list#reset toggle->filter#filter",
controller: "filter navigable-list",
dialog_target: "dialog",
navigable_list_focus_on_selection_value: false,
navigable_list_actionable_items_value: true } do %>
<div class="flex gap">
<%= text_field_tag :search, nil,
type: "search",
role: "combobox",
placeholder: "Filter…",
class: "input input--transparent txt-small",
autofocus: true,
autocorrect: "off",
autocomplete: "off",
aria: { activedescendant: "" },
data: {
"1p-ignore": "true",
filter_target: "input",
navigable_list_target: "input",
action: "input->filter#filter" } %>
<button class="fizzy-menu__close btn borderless txt-small" data-action="dialog#close">
<%= icon_tag "close" %>
<span class="for-screen-reader">Close menu</span>
</button>
</div>
<%= tag.dialog class: "fizzy-menu filter popup popup--animated panel margin-block-start-half",
data: {
action: "turbo:before-cache@document->dialog#close keydown->navigable-list#navigate filter:changed->navigable-list#reset toggle->filter#filter",
controller: "filter navigable-list",
dialog_target: "dialog",
navigable_list_focus_on_selection_value: false,
navigable_list_actionable_items_value: true } do %>
<div class="flex gap">
<%= text_field_tag :search, nil,
type: "search",
role: "combobox",
placeholder: "Filter…",
class: "input input--transparent txt-small",
autofocus: true,
autocorrect: "off",
autocomplete: "off",
aria: { activedescendant: "" },
data: {
"1p-ignore": "true",
filter_target: "input",
navigable_list_target: "input",
action: "input->filter#filter" } %>
<button class="fizzy-menu__close btn borderless txt-small" data-action="dialog#close">
<%= icon_tag "close" %>
<span class="for-screen-reader">Close menu</span>
</button>
</div>
<%= render "filters/menu/hotkeys" %>
<%= render "filters/menu/custom", user_filtering: user_filtering %>
<%= render "filters/menu/collections", user_filtering: user_filtering %>
<%= render "filters/menu/tags", user_filtering: user_filtering %>
<%= render "filters/menu/users", user_filtering: user_filtering %>
<%= render "filters/menu/places", user_filtering: user_filtering %>
<%= render "filters/menu/hotkeys" %>
<%= render "filters/menu/custom", user_filtering: user_filtering %>
<%= render "filters/menu/collections", user_filtering: user_filtering %>
<%= render "filters/menu/tags", user_filtering: user_filtering %>
<%= render "filters/menu/users", user_filtering: user_filtering %>
<%= render "filters/menu/places", user_filtering: user_filtering %>
<%= render "filters/menu/shortcut_notice" %>
<% end %>
</nav>
<%= render "filters/menu/shortcut_notice" %>
<% end %>
</nav>
<% end %>