Remove need for timex

This commit is contained in:
Chris McCord 2022-01-17 14:11:26 -05:00
parent ffee2bf6f3
commit e4dd585e39
4 changed files with 38 additions and 25 deletions

View file

@ -366,15 +366,12 @@ defmodule LiveBeats.MediaLibrary do
end end
end end
def delete_expired_songs(count, interval) do def expire_songs_older_than(count, interval) do
#for substracting the interval of time when from_now/2 is invoked
count = count * -1
Ecto.Multi.new() Ecto.Multi.new()
|> Ecto.Multi.delete_all( |> Ecto.Multi.delete_all(
:delete_expired_songs, :delete_expired_songs,
from(s in Song, from(s in Song,
where: s.inserted_at < from_now(^count, ^interval), where: s.inserted_at < from_now(^(-count), ^interval),
select: %{user_id: s.user_id, mp3_filepath: s.mp3_filepath} select: %{user_id: s.user_id, mp3_filepath: s.mp3_filepath}
) )
) )

View file

@ -1,10 +1,12 @@
defmodule LiveBeats.SongsCleaner do defmodule LiveBeats.SongsCleaner do
@moduledoc """ @moduledoc """
Remove user songs that were added ... ago Expire user songs using a polling interval.
""" """
use GenServer
alias LiveBeats.MediaLibrary alias LiveBeats.MediaLibrary
use GenServer
@poll_interval :timer.minutes(60)
def start_link(opts) do def start_link(opts) do
GenServer.start_link(__MODULE__, opts) GenServer.start_link(__MODULE__, opts)
@ -12,24 +14,21 @@ defmodule LiveBeats.SongsCleaner do
@impl true @impl true
def init(opts) do def init(opts) do
schedule_cleanup()
count = Keyword.fetch!(opts, :count) count = Keyword.fetch!(opts, :count)
interval = Keyword.fetch!(opts, :interval) interval = Keyword.fetch!(opts, :interval)
MediaLibrary.delete_expired_songs(count, interval) MediaLibrary.expire_songs_older_than(count, interval)
{:ok, %{count: count, interval: interval}} {:ok, schedule_cleanup(%{count: count, interval: interval})}
end end
@impl true @impl true
def handle_info(:remove_songs, %{count: count, interval: interval} = state) do def handle_info(:remove_songs, %{count: count, interval: interval} = state) do
MediaLibrary.delete_expired_songs(count, interval) MediaLibrary.expire_songs_older_than(count, interval)
schedule_cleanup() {:noreply, schedule_cleanup(state)}
{:noreply, state}
end end
defp schedule_cleanup do defp schedule_cleanup(state) do
Process.send_after(self(), :remove_songs, :timer.hours(3)) Process.send_after(self(), :remove_songs, @poll_interval)
state
end end
end end

View file

@ -53,7 +53,6 @@ defmodule LiveBeats.MixProject do
{:heroicons, "~> 0.2.2"}, {:heroicons, "~> 0.2.2"},
{:castore, "~> 0.1.13"}, {:castore, "~> 0.1.13"},
{:tailwind, "~> 0.1"}, {:tailwind, "~> 0.1"},
{:timex, "~> 3.0", only: :test}
] ]
end end

View file

@ -9,7 +9,14 @@ defmodule LiveBeats.MediaLibraryTest do
import LiveBeats.AccountsFixtures import LiveBeats.AccountsFixtures
import LiveBeats.MediaLibraryFixtures import LiveBeats.MediaLibraryFixtures
@invalid_attrs %{album_artist: nil, artist: nil, date_recorded: nil, date_released: nil, duration: nil, title: nil} @invalid_attrs %{
album_artist: nil,
artist: nil,
date_recorded: nil,
date_released: nil,
duration: nil,
title: nil
}
test "list_profile_songs/1 returns all songs for a profile" do test "list_profile_songs/1 returns all songs for a profile" do
user = user_fixture() user = user_fixture()
@ -25,7 +32,15 @@ defmodule LiveBeats.MediaLibraryTest do
test "update_song/2 with valid data updates the song" do test "update_song/2 with valid data updates the song" do
song = song_fixture() song = song_fixture()
update_attrs = %{album_artist: "some updated album_artist", artist: "some updated artist", date_recorded: ~N[2021-10-27 20:11:00], date_released: ~N[2021-10-27 20:11:00], duration: 43, title: "some updated title"}
update_attrs = %{
album_artist: "some updated album_artist",
artist: "some updated artist",
date_recorded: ~N[2021-10-27 20:11:00],
date_released: ~N[2021-10-27 20:11:00],
duration: 43,
title: "some updated title"
}
assert {:ok, %Song{} = song} = MediaLibrary.update_song(song, update_attrs) assert {:ok, %Song{} = song} = MediaLibrary.update_song(song, update_attrs)
assert song.album_artist == "some updated album_artist" assert song.album_artist == "some updated album_artist"
@ -54,13 +69,14 @@ defmodule LiveBeats.MediaLibraryTest do
assert %Ecto.Changeset{} = MediaLibrary.change_song(song) assert %Ecto.Changeset{} = MediaLibrary.change_song(song)
end end
test "delete_expired_songs/2 deletes the song expired before the required interval" do require IEx
test "expire_songs_older_than/2 deletes the song expired before the required interval" do
user = user_fixture() user = user_fixture()
today = Timex.now() today = DateTime.utc_now()
three_months_ago = add_n_months(today, -3) three_months_ago = add_n_months(today, -3)
four_months_ago = add_n_months(today, -4) four_months_ago = add_n_months(today, -4)
one_month_ago = add_n_months(today, 1) one_month_ago = add_n_months(today, -1)
expired_song_1 = expired_song_1 =
song_fixture(user_id: user.id, title: "song1", inserted_at: four_months_ago) song_fixture(user_id: user.id, title: "song1", inserted_at: four_months_ago)
@ -70,7 +86,7 @@ defmodule LiveBeats.MediaLibraryTest do
active_song = song_fixture(user_id: user.id, title: "song3", inserted_at: one_month_ago) active_song = song_fixture(user_id: user.id, title: "song3", inserted_at: one_month_ago)
MediaLibrary.delete_expired_songs(-2, "month") MediaLibrary.expire_songs_older_than(2, "month")
assert_raise Ecto.NoResultsError, fn -> MediaLibrary.get_song!(expired_song_1.id) end assert_raise Ecto.NoResultsError, fn -> MediaLibrary.get_song!(expired_song_1.id) end
assert_raise Ecto.NoResultsError, fn -> MediaLibrary.get_song!(expired_song_2.id) end assert_raise Ecto.NoResultsError, fn -> MediaLibrary.get_song!(expired_song_2.id) end
@ -79,8 +95,10 @@ defmodule LiveBeats.MediaLibraryTest do
end end
defp add_n_months(datetime, n) do defp add_n_months(datetime, n) do
seconds = 30 * (60 * 60 * 24) * n
datetime datetime
|> Timex.shift(months: n) |> DateTime.add(seconds, :second)
|> DateTime.to_naive() |> DateTime.to_naive()
|> NaiveDateTime.truncate(:second) |> NaiveDateTime.truncate(:second)
end end