[MastoAPI] Add bookmarks

This commit is contained in:
Haelwenn (lanodan) Monnier 2018-12-14 12:14:24 +01:00
parent 1cd33aa8cd
commit c143b43bc4
No known key found for this signature in database
GPG Key ID: D5B7A8E43C997DEE
5 changed files with 66 additions and 2 deletions

View File

@ -31,6 +31,7 @@ defmodule Pleroma.User do
field(:follower_address, :string)
field(:search_distance, :float, virtual: true)
field(:tags, {:array, :string}, default: [])
field(:bookmarks, {:array, :string}, default: [])
field(:last_refreshed_at, :naive_datetime)
has_many(:notifications, Notification)
embeds_one(:info, Pleroma.User.Info)
@ -897,6 +898,24 @@ defmodule Pleroma.User do
updated_user
end
def bookmark(%User{} = user, status_id) do
bookmarks = Enum.uniq(user.bookmarks ++ [status_id])
update_bookmarks(user, bookmarks)
end
def unbookmark(%User{} = user, status_id) do
bookmarks = Enum.uniq(user.bookmarks -- [status_id])
update_bookmarks(user, bookmarks)
end
def update_bookmarks(%User{} = user, bookmarks) do
user
|> change(%{bookmarks: bookmarks})
|> update_and_set_cache
:ok
end
defp normalize_tags(tags) do
[tags]
|> List.flatten()

View File

@ -405,6 +405,24 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
end
end
def bookmark_status(%{assigns: %{user: user}} = conn, %{"id" => id}) do
with %Activity{} = activity <- Repo.get(Activity, id),
%User{} = user <- User.get_by_nickname(user.nickname),
true <- ActivityPub.visible_for_user?(activity, user),
:ok <- User.bookmark(user, activity.data["object"]["id"]) do
try_render(conn, StatusView, "status.json", %{activity: activity, for: user})
end
end
def unbookmark_status(%{assigns: %{user: user}} = conn, %{"id" => id}) do
with %Activity{} = activity <- Repo.get(Activity, id),
%User{} = user <- User.get_by_nickname(user.nickname),
true <- ActivityPub.visible_for_user?(activity, user),
:ok <- User.unbookmark(user, activity.data["object"]["id"]) do
try_render(conn, StatusView, "status.json", %{activity: activity, for: user})
end
end
def notifications(%{assigns: %{user: user}} = conn, params) do
notifications = Notification.for_user(user, params)
@ -820,6 +838,17 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|> render("index.json", %{activities: activities, for: user, as: :activity})
end
def bookmarks(%{assigns: %{user: user}} = conn, _) do
user = Repo.get(User, user.id)
activities =
user.bookmarks
|> Enum.map(fn id -> Activity.get_create_activity_by_object_ap_id(id) end)
conn
|> render(StatusView, "index.json", %{activities: activities, for: user, as: :activity})
end
def get_lists(%{assigns: %{user: user}} = conn, opts) do
lists = Pleroma.List.for_user(user, opts)
res = ListView.render("lists.json", lists: lists)

View File

@ -71,6 +71,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
favourites_count: 0,
reblogged: false,
favourited: false,
bookmarked: false,
muted: false,
sensitive: false,
spoiler_text: "",
@ -90,6 +91,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
def render("status.json", %{activity: %{data: %{"object" => object}} = activity} = opts) do
user = User.get_cached_by_ap_id(activity.data["actor"])
bookmarked = object["id"] in user.bookmarks
like_count = object["like_count"] || 0
announcement_count = object["announcement_count"] || 0
@ -134,6 +137,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
favourites_count: like_count,
reblogged: present?(repeated),
favourited: present?(favorited),
bookmarked: bookmarked,
muted: false,
sensitive: sensitive,
spoiler_text: object["summary"] || "",

View File

@ -175,6 +175,7 @@ defmodule Pleroma.Web.Router do
get("/timelines/direct", MastodonAPIController, :dm_timeline)
get("/favourites", MastodonAPIController, :favourites)
get("/bookmarks", MastodonAPIController, :bookmarks)
post("/statuses", MastodonAPIController, :post_status)
delete("/statuses/:id", MastodonAPIController, :delete_status)
@ -183,6 +184,8 @@ defmodule Pleroma.Web.Router do
post("/statuses/:id/unreblog", MastodonAPIController, :unreblog_status)
post("/statuses/:id/favourite", MastodonAPIController, :fav_status)
post("/statuses/:id/unfavourite", MastodonAPIController, :unfav_status)
post("/statuses/:id/bookmark", MastodonAPIController, :bookmark_status)
post("/statuses/:id/unbookmark", MastodonAPIController, :unbookmark_status)
post("/notifications/clear", MastodonAPIController, :clear_notifications)
post("/notifications/dismiss", MastodonAPIController, :dismiss_notification)
@ -219,8 +222,6 @@ defmodule Pleroma.Web.Router do
get("/suggestions", MastodonAPIController, :suggestions)
get("/endorsements", MastodonAPIController, :empty_array)
get("/bookmarks", MastodonAPIController, :empty_array)
end
scope "/api/web", Pleroma.Web.MastodonAPI do

View File

@ -0,0 +1,11 @@
defmodule Pleroma.Repo.Migrations.AddBookmarkssToUsers do
use Ecto.Migration
def change do
alter table(:users) do
add :bookmarks, {:array, :string}
end
create index(:users, [:bookmarks], using: :gin)
end
end