Marker: added unread_count field
This commit is contained in:
parent
6281e4795a
commit
d4270397dc
|
@ -18,6 +18,7 @@ defmodule Pleroma.Marker do
|
|||
field(:last_read_id, :string, default: "")
|
||||
field(:timeline, :string, default: "")
|
||||
field(:lock_version, :integer, default: 0)
|
||||
field(:unread_count, :integer, default: 0)
|
||||
|
||||
belongs_to(:user, User, type: FlakeId.Ecto.CompatType)
|
||||
timestamps()
|
||||
|
@ -38,7 +39,7 @@ def upsert(%User{} = user, attrs) do
|
|||
|
||||
Multi.insert(multi, timeline, marker,
|
||||
returning: true,
|
||||
on_conflict: {:replace, [:last_read_id]},
|
||||
on_conflict: {:replace, [:last_read_id, :unread_count]},
|
||||
conflict_target: [:user_id, :timeline]
|
||||
)
|
||||
end)
|
||||
|
@ -55,7 +56,7 @@ defp get_marker(user, timeline) do
|
|||
@doc false
|
||||
defp changeset(marker, attrs) do
|
||||
marker
|
||||
|> cast(attrs, [:last_read_id])
|
||||
|> cast(attrs, [:last_read_id, :unread_count])
|
||||
|> validate_required([:user_id, :timeline, :last_read_id])
|
||||
|> validate_inclusion(:timeline, @timelines)
|
||||
end
|
||||
|
|
|
@ -10,6 +10,7 @@ def render("markers.json", %{markers: markers}) do
|
|||
Map.put_new(acc, m.timeline, %{
|
||||
last_read_id: m.last_read_id,
|
||||
version: m.lock_version,
|
||||
unread_count: m.unread_count,
|
||||
updated_at: NaiveDateTime.to_iso8601(m.updated_at)
|
||||
})
|
||||
end)
|
||||
|
|
|
@ -0,0 +1,49 @@
|
|||
defmodule Pleroma.Repo.Migrations.AddUnreadToMarker do
|
||||
use Ecto.Migration
|
||||
import Ecto.Query
|
||||
alias Pleroma.Repo
|
||||
alias Pleroma.Notification
|
||||
|
||||
def up do
|
||||
alter table(:markers) do
|
||||
add_if_not_exists(:unread_count, :integer, default: 0)
|
||||
end
|
||||
|
||||
flush()
|
||||
|
||||
update_markers()
|
||||
end
|
||||
|
||||
def down do
|
||||
alter table(:markers) do
|
||||
remove_if_exists(:unread_count, :integer)
|
||||
end
|
||||
end
|
||||
|
||||
def update_markers do
|
||||
from(q in Notification,
|
||||
select: %{
|
||||
timeline: "notifications",
|
||||
user_id: q.user_id,
|
||||
unread_count: fragment("COUNT(*) FILTER (WHERE seen = false) as unread_count"),
|
||||
last_read_id: fragment("(MAX(id) FILTER (WHERE seen = true)::text) as last_read_id ")
|
||||
},
|
||||
group_by: [q.user_id]
|
||||
)
|
||||
|> Repo.all()
|
||||
|> Enum.reduce(Ecto.Multi.new(), fn attrs, multi ->
|
||||
marker =
|
||||
Pleroma.Marker
|
||||
|> struct(attrs)
|
||||
|> Ecto.Changeset.change()
|
||||
|
||||
multi
|
||||
|> Ecto.Multi.insert(attrs[:user_id], marker,
|
||||
returning: true,
|
||||
on_conflict: {:replace, [:last_read_id, :unread_count]},
|
||||
conflict_target: [:user_id, :timeline]
|
||||
)
|
||||
end)
|
||||
|> Pleroma.Repo.transaction()
|
||||
end
|
||||
end
|
|
@ -15,7 +15,7 @@ test "gets markers with correct scopes", %{conn: conn} do
|
|||
{:ok, %{"notifications" => marker}} =
|
||||
Pleroma.Marker.upsert(
|
||||
user,
|
||||
%{"notifications" => %{"last_read_id" => "69420"}}
|
||||
%{"notifications" => %{"last_read_id" => "69420", "unread_count" => 7}}
|
||||
)
|
||||
|
||||
response =
|
||||
|
@ -28,6 +28,7 @@ test "gets markers with correct scopes", %{conn: conn} do
|
|||
assert response == %{
|
||||
"notifications" => %{
|
||||
"last_read_id" => "69420",
|
||||
"unread_count" => 7,
|
||||
"updated_at" => NaiveDateTime.to_iso8601(marker.updated_at),
|
||||
"version" => 0
|
||||
}
|
||||
|
@ -70,7 +71,8 @@ test "creates a marker with correct scopes", %{conn: conn} do
|
|||
"notifications" => %{
|
||||
"last_read_id" => "69420",
|
||||
"updated_at" => _,
|
||||
"version" => 0
|
||||
"version" => 0,
|
||||
"unread_count" => 0
|
||||
}
|
||||
} = response
|
||||
end
|
||||
|
@ -98,6 +100,7 @@ test "updates exist marker", %{conn: conn} do
|
|||
assert response == %{
|
||||
"notifications" => %{
|
||||
"last_read_id" => "69888",
|
||||
"unread_count" => 0,
|
||||
"updated_at" => NaiveDateTime.to_iso8601(marker.updated_at),
|
||||
"version" => 0
|
||||
}
|
||||
|
|
|
@ -8,17 +8,19 @@ defmodule Pleroma.Web.MastodonAPI.MarkerViewTest do
|
|||
import Pleroma.Factory
|
||||
|
||||
test "returns markers" do
|
||||
marker1 = insert(:marker, timeline: "notifications", last_read_id: "17")
|
||||
marker1 = insert(:marker, timeline: "notifications", last_read_id: "17", unread_count: 5)
|
||||
marker2 = insert(:marker, timeline: "home", last_read_id: "42")
|
||||
|
||||
assert MarkerView.render("markers.json", %{markers: [marker1, marker2]}) == %{
|
||||
"home" => %{
|
||||
last_read_id: "42",
|
||||
unread_count: 0,
|
||||
updated_at: NaiveDateTime.to_iso8601(marker2.updated_at),
|
||||
version: 0
|
||||
},
|
||||
"notifications" => %{
|
||||
last_read_id: "17",
|
||||
unread_count: 5,
|
||||
updated_at: NaiveDateTime.to_iso8601(marker1.updated_at),
|
||||
version: 0
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue