forked from AkkomaGang/akkoma
Add Twitter API for the pinned statuses
``` # Only return statuses that have been pinned GET /api/statuses/user_timeline.json?pinned=true # Pin POST /api/statuses/pin/:id # Unpin POST /api/statuses/unpin/:id ```
This commit is contained in:
parent
1b06e6fdf3
commit
44a1e69484
8 changed files with 119 additions and 3 deletions
|
@ -355,6 +355,9 @@ defmodule Pleroma.Web.Router do
|
|||
post("/statuses/unretweet/:id", TwitterAPI.Controller, :unretweet)
|
||||
post("/statuses/destroy/:id", TwitterAPI.Controller, :delete_post)
|
||||
|
||||
post("/statuses/pin/:id", TwitterAPI.Controller, :pin)
|
||||
post("/statuses/unpin/:id", TwitterAPI.Controller, :unpin)
|
||||
|
||||
get("/pleroma/friend_requests", TwitterAPI.Controller, :friend_requests)
|
||||
post("/pleroma/friendships/approve", TwitterAPI.Controller, :approve_friend_request)
|
||||
post("/pleroma/friendships/deny", TwitterAPI.Controller, :deny_friend_request)
|
||||
|
|
|
@ -153,6 +153,7 @@ def to_map(
|
|||
announcement_count = object["announcement_count"] || 0
|
||||
favorited = opts[:for] && opts[:for].ap_id in (object["likes"] || [])
|
||||
repeated = opts[:for] && opts[:for].ap_id in (object["announcements"] || [])
|
||||
pinned = activity.id in user.info.pinned_activities
|
||||
|
||||
mentions = opts[:mentioned] || []
|
||||
|
||||
|
@ -202,6 +203,7 @@ def to_map(
|
|||
"repeat_num" => announcement_count,
|
||||
"favorited" => to_boolean(favorited),
|
||||
"repeated" => to_boolean(repeated),
|
||||
"pinned" => pinned,
|
||||
"external_url" => object["external_url"] || object["id"],
|
||||
"tags" => tags,
|
||||
"activity_type" => "post",
|
||||
|
|
|
@ -82,6 +82,14 @@ def unrepeat(%User{} = user, ap_id_or_id) do
|
|||
end
|
||||
end
|
||||
|
||||
def pin(%User{} = user, ap_id_or_id) do
|
||||
CommonAPI.pin(ap_id_or_id, user)
|
||||
end
|
||||
|
||||
def unpin(%User{} = user, ap_id_or_id) do
|
||||
CommonAPI.unpin(ap_id_or_id, user)
|
||||
end
|
||||
|
||||
def fav(%User{} = user, ap_id_or_id) do
|
||||
with {:ok, _fav, %{data: %{"id" => id}}} <- CommonAPI.favorite(ap_id_or_id, user),
|
||||
%Activity{} = activity <- Activity.get_create_activity_by_object_ap_id(id) do
|
||||
|
|
|
@ -375,6 +375,30 @@ def unretweet(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
|||
end
|
||||
end
|
||||
|
||||
def pin(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
||||
with {_, {:ok, id}} <- {:param_cast, Ecto.Type.cast(:integer, id)},
|
||||
{:ok, activity} <- TwitterAPI.pin(user, id) do
|
||||
conn
|
||||
|> put_view(ActivityView)
|
||||
|> render("activity.json", %{activity: activity, for: user})
|
||||
else
|
||||
{:error, message} -> bad_request_reply(conn, message)
|
||||
err -> err
|
||||
end
|
||||
end
|
||||
|
||||
def unpin(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
||||
with {_, {:ok, id}} <- {:param_cast, Ecto.Type.cast(:integer, id)},
|
||||
{:ok, activity} <- TwitterAPI.unpin(user, id) do
|
||||
conn
|
||||
|> put_view(ActivityView)
|
||||
|> render("activity.json", %{activity: activity, for: user})
|
||||
else
|
||||
{:error, message} -> bad_request_reply(conn, message)
|
||||
err -> err
|
||||
end
|
||||
end
|
||||
|
||||
def register(conn, params) do
|
||||
with {:ok, user} <- TwitterAPI.register_user(params) do
|
||||
conn
|
||||
|
|
|
@ -243,6 +243,7 @@ def render(
|
|||
announcement_count = object["announcement_count"] || 0
|
||||
favorited = opts[:for] && opts[:for].ap_id in (object["likes"] || [])
|
||||
repeated = opts[:for] && opts[:for].ap_id in (object["announcements"] || [])
|
||||
pinned = activity.id in user.info.pinned_activities
|
||||
|
||||
attentions =
|
||||
activity.recipients
|
||||
|
@ -300,6 +301,7 @@ def render(
|
|||
"repeat_num" => announcement_count,
|
||||
"favorited" => !!favorited,
|
||||
"repeated" => !!repeated,
|
||||
"pinned" => pinned,
|
||||
"external_url" => object["external_url"] || object["id"],
|
||||
"tags" => tags,
|
||||
"activity_type" => "post",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
# Pleroma: A lightweight social networking server
|
||||
# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
|
||||
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
||||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenterTest do
|
||||
|
@ -157,6 +157,7 @@ test "an activity" do
|
|||
"repeat_num" => 3,
|
||||
"favorited" => false,
|
||||
"repeated" => false,
|
||||
"pinned" => false,
|
||||
"external_url" => "some url",
|
||||
"tags" => ["nsfw", "content", "mentioning"],
|
||||
"activity_type" => "post",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
# Pleroma: A lightweight social networking server
|
||||
# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
|
||||
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
||||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
defmodule Pleroma.Web.TwitterAPI.ControllerTest do
|
||||
|
@ -1694,4 +1694,79 @@ test "it updates `data[name]` of referenced Object with provided value", %{
|
|||
assert object.data["name"] == description
|
||||
end
|
||||
end
|
||||
|
||||
describe "POST /api/statuses/user_timeline.json?user_id=:user_id&pinned=true" do
|
||||
test "it returns a list of pinned statuses", %{conn: conn} do
|
||||
Pleroma.Config.put([:instance, :max_pinned_statuses], 1)
|
||||
|
||||
user = insert(:user, %{name: "egor"})
|
||||
{:ok, %{id: activity_id}} = CommonAPI.post(user, %{"status" => "HI!!!"})
|
||||
{:ok, _} = CommonAPI.pin(activity_id, user)
|
||||
|
||||
resp =
|
||||
conn
|
||||
|> get("/api/statuses/user_timeline.json", %{user_id: user.id, pinned: true})
|
||||
|> json_response(200)
|
||||
|
||||
assert length(resp) == 1
|
||||
assert [%{"id" => ^activity_id, "pinned" => true}] = resp
|
||||
end
|
||||
end
|
||||
|
||||
describe "POST /api/statuses/pin/:id" do
|
||||
setup do
|
||||
Pleroma.Config.put([:instance, :max_pinned_statuses], 1)
|
||||
[user: insert(:user)]
|
||||
end
|
||||
|
||||
test "without valid credentials", %{conn: conn} do
|
||||
note_activity = insert(:note_activity)
|
||||
conn = post(conn, "/api/statuses/pin/#{note_activity.id}.json")
|
||||
assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
|
||||
end
|
||||
|
||||
test "with credentials", %{conn: conn, user: user} do
|
||||
{:ok, activity} = CommonAPI.post(user, %{"status" => "test!"})
|
||||
|
||||
request_path = "/api/statuses/pin/#{activity.id}.json"
|
||||
|
||||
response =
|
||||
conn
|
||||
|> with_credentials(user.nickname, "test")
|
||||
|> post(request_path)
|
||||
|
||||
user = refresh_record(user)
|
||||
|
||||
assert json_response(response, 200) == ActivityRepresenter.to_map(activity, %{user: user})
|
||||
end
|
||||
end
|
||||
|
||||
describe "POST /api/statuses/unpin/:id" do
|
||||
setup do
|
||||
Pleroma.Config.put([:instance, :max_pinned_statuses], 1)
|
||||
[user: insert(:user)]
|
||||
end
|
||||
|
||||
test "without valid credentials", %{conn: conn} do
|
||||
note_activity = insert(:note_activity)
|
||||
conn = post(conn, "/api/statuses/unpin/#{note_activity.id}.json")
|
||||
assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
|
||||
end
|
||||
|
||||
test "with credentials", %{conn: conn, user: user} do
|
||||
{:ok, activity} = CommonAPI.post(user, %{"status" => "test!"})
|
||||
{:ok, activity} = CommonAPI.pin(activity.id, user)
|
||||
|
||||
request_path = "/api/statuses/unpin/#{activity.id}.json"
|
||||
|
||||
response =
|
||||
conn
|
||||
|> with_credentials(user.nickname, "test")
|
||||
|> post(request_path)
|
||||
|
||||
user = refresh_record(user)
|
||||
|
||||
assert json_response(response, 200) == ActivityRepresenter.to_map(activity, %{user: user})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
# Pleroma: A lightweight social networking server
|
||||
# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
|
||||
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
||||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do
|
||||
|
@ -132,6 +132,7 @@ test "a create activity with a note" do
|
|||
"possibly_sensitive" => false,
|
||||
"repeat_num" => 0,
|
||||
"repeated" => false,
|
||||
"pinned" => false,
|
||||
"statusnet_conversation_id" => convo_id,
|
||||
"summary" => "",
|
||||
"statusnet_html" =>
|
||||
|
|
Loading…
Reference in a new issue