aboutsummaryrefslogtreecommitdiff
path: root/lib/pleroma/web
diff options
context:
space:
mode:
Diffstat (limited to 'lib/pleroma/web')
-rw-r--r--lib/pleroma/web/mastodon_api/mastodon_api.ex48
-rw-r--r--lib/pleroma/web/mastodon_api/mastodon_api_controller.ex2
2 files changed, 19 insertions, 31 deletions
diff --git a/lib/pleroma/web/mastodon_api/mastodon_api.ex b/lib/pleroma/web/mastodon_api/mastodon_api.ex
index 54cb6c97a..08ea5f967 100644
--- a/lib/pleroma/web/mastodon_api/mastodon_api.ex
+++ b/lib/pleroma/web/mastodon_api/mastodon_api.ex
@@ -2,61 +2,49 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPI do
import Ecto.Query
import Ecto.Changeset
- alias Pleroma.Repo
+ alias Pleroma.Activity
+ alias Pleroma.Notification
+ alias Pleroma.Pagination
alias Pleroma.User
- @default_limit 20
-
def get_followers(user, params \\ %{}) do
user
|> User.get_followers_query()
- |> paginate(params)
- |> Repo.all()
+ |> Pagination.fetch_paginated(params)
end
def get_friends(user, params \\ %{}) do
user
|> User.get_friends_query()
- |> paginate(params)
- |> Repo.all()
+ |> Pagination.fetch_paginated(params)
end
- def paginate(query, params \\ %{}) do
+ def get_notifications(user, params \\ %{}) do
options = cast_params(params)
- query
- |> restrict(:max_id, options)
- |> restrict(:since_id, options)
- |> restrict(:limit, options)
- |> order_by([u], fragment("? desc nulls last", u.id))
+ user
+ |> Notification.for_user_query()
+ |> restrict(:exclude_types, options)
+ |> Pagination.fetch_paginated(params)
end
- def cast_params(params) do
+ defp cast_params(params) do
param_types = %{
- max_id: :string,
- since_id: :string,
- limit: :integer
+ exclude_types: {:array, :string}
}
changeset = cast({%{}, param_types}, params, Map.keys(param_types))
changeset.changes
end
- defp restrict(query, :max_id, %{max_id: max_id}) do
- query
- |> where([q], q.id < ^max_id)
- end
-
- defp restrict(query, :since_id, %{since_id: since_id}) do
- query
- |> where([q], q.id > ^since_id)
- end
-
- defp restrict(query, :limit, options) do
- limit = Map.get(options, :limit, @default_limit)
+ defp restrict(query, :exclude_types, %{exclude_types: mastodon_types = [_ | _]}) do
+ ap_types =
+ mastodon_types
+ |> Enum.map(&Activity.from_mastodon_notification_type/1)
+ |> Enum.filter(& &1)
query
- |> limit(^limit)
+ |> where([q, a], not fragment("? @> ARRAY[?->>'type']::varchar[]", ^ap_types, a.data))
end
defp restrict(query, _, _), do: query
diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
index 952aa2453..2eb1da561 100644
--- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
+++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
@@ -502,7 +502,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
end
def notifications(%{assigns: %{user: user}} = conn, params) do
- notifications = Notification.for_user(user, params)
+ notifications = MastodonAPI.get_notifications(user, params)
conn
|> add_link_headers(:notifications, notifications)