From e429d256d6060661f3564e5a46b33e49027be19b Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Sun, 31 May 2020 22:48:04 -0400 Subject: [PATCH] Add configurable refresh frequency to feeds --- lib/frenzy/feed.ex | 9 ++++++++- lib/frenzy/update_feeds.ex | 13 +++++++++++-- lib/frenzy_web/controllers/feed_controller.ex | 8 +++++++- lib/frenzy_web/templates/feed/edit.html.eex | 14 ++++++++++---- .../20200531201714_feeds_add_refresh_frequency.exs | 10 ++++++++++ 5 files changed, 46 insertions(+), 8 deletions(-) create mode 100644 priv/repo/migrations/20200531201714_feeds_add_refresh_frequency.exs diff --git a/lib/frenzy/feed.ex b/lib/frenzy/feed.ex index a869431..7eaf57a 100644 --- a/lib/frenzy/feed.ex +++ b/lib/frenzy/feed.ex @@ -36,6 +36,8 @@ defmodule Frenzy.Feed do field :title, :string field :favicon, :string field :favicon_url, :string + field :last_refreshed_at, :utc_datetime + field :refresh_frequency, :integer, default: 30 belongs_to :group, Frenzy.Group belongs_to :pipeline, Frenzy.Pipeline @@ -54,6 +56,8 @@ defmodule Frenzy.Feed do title: String.t() | nil, favicon: String.t() | nil, favicon_url: String.t() | nil, + last_refreshed_at: DateTime.t() | nil, + refresh_frequency: integer(), group: Frenzy.Group.t() | Ecto.Association.NotLoaded.t(), pipeline: Frenzy.Pipeline.t() | nil | Ecto.Association.NotLoaded.t(), items: [Frenzy.Item.t()] | Ecto.Association.NotLoaded.t(), @@ -71,8 +75,11 @@ defmodule Frenzy.Feed do :last_updated, :pipeline_id, :favicon, - :favicon_url + :favicon_url, + :last_refreshed_at, + :refresh_frequency ]) |> validate_required([:feed_url]) + |> validate_inclusion(:refresh_frequency, [30 * 60, 60 * 60, 6 * 60 * 60, 24 * 60 * 60]) end end diff --git a/lib/frenzy/update_feeds.ex b/lib/frenzy/update_feeds.ex index 1161843..00b0eeb 100644 --- a/lib/frenzy/update_feeds.ex +++ b/lib/frenzy/update_feeds.ex @@ -40,8 +40,17 @@ defmodule Frenzy.UpdateFeeds do defp update_feeds() do Logger.info("Updating all feeds") - Repo.all(from(Feed)) - |> Enum.map(&update_feed/1) + {_count, feeds} = + Feed + |> where( + [f], + is_nil(f.last_refreshed_at) or + f.last_refreshed_at <= from_now(-1 * f.refresh_frequency, "second") + ) + |> select([f], f) + |> Repo.update_all(set: [last_refreshed_at: DateTime.utc_now()]) + + Enum.map(feeds, &update_feed/1) prune_old_items() end diff --git a/lib/frenzy_web/controllers/feed_controller.ex b/lib/frenzy_web/controllers/feed_controller.ex index c9b1515..50c9bf1 100644 --- a/lib/frenzy_web/controllers/feed_controller.ex +++ b/lib/frenzy_web/controllers/feed_controller.ex @@ -77,7 +77,13 @@ defmodule FrenzyWeb.FeedController do render(conn, "edit.html", %{ feed: feed, changeset: edit_changeset, - pipelines: [{"No Pipeline", nil} | pipelines] + pipelines: [{"No Pipeline", nil} | pipelines], + refresh_frequencies: [ + {"Every 30 minutes", 30 * 60}, + {"Every hour", 60 * 60}, + {"Every 6 hours", 6 * 60 * 60}, + {"Every 24 hours", 24 * 60 * 60} + ] }) end diff --git a/lib/frenzy_web/templates/feed/edit.html.eex b/lib/frenzy_web/templates/feed/edit.html.eex index 48b6350..cb56090 100644 --- a/lib/frenzy_web/templates/feed/edit.html.eex +++ b/lib/frenzy_web/templates/feed/edit.html.eex @@ -1,6 +1,12 @@

Edit Feed

<%= form_for @changeset, Routes.feed_path(@conn, :update, @feed.id), fn f -> %> +
+ +
+ <%= select f, :refresh_frequency, @refresh_frequencies, class: "custom-select" %> +
+
@@ -8,11 +14,11 @@
<%= if @feed.pipeline_id do %> -
- <% end %>
diff --git a/priv/repo/migrations/20200531201714_feeds_add_refresh_frequency.exs b/priv/repo/migrations/20200531201714_feeds_add_refresh_frequency.exs new file mode 100644 index 0000000..0e7e9fb --- /dev/null +++ b/priv/repo/migrations/20200531201714_feeds_add_refresh_frequency.exs @@ -0,0 +1,10 @@ +defmodule Frenzy.Repo.Migrations.FeedsAddRefreshFrequency do + use Ecto.Migration + + def change do + alter table(:feeds) do + add :last_refreshed_at, :naive_datetime, default: nil + add :refresh_frequency, :integer, default: 30 * 60 + end + end +end