end
defp restrict_since(query, _), do: query
+ defp restrict_tag(query, %{"tag" => tag}) do
+ from activity in query,
+ where: fragment("? <@ (? #> '{\"object\",\"tag\"}')", ^tag, activity.data)
+ end
+ defp restrict_tag(query, _), do: query
+
defp restrict_recipients(query, recipients) do
Enum.reduce(recipients, query, fn (recipient, q) ->
map = %{ to: [recipient] }
base_query
|> restrict_recipients(recipients)
+ |> restrict_tag(opts)
|> restrict_since(opts)
|> restrict_local(opts)
|> restrict_max(opts)
end
end
+ def hashtag_timeline(%{assigns: %{user: user}} = conn, params) do
+ params = params
+ |> Map.put("type", "Create")
+ |> Map.put("local_only", !!params["local"])
+
+ activities = ActivityPub.fetch_public_activities(params)
+ |> Enum.reverse
+
+ conn
+ |> render(StatusView, "index.json", %{activities: activities, for: user, as: :activity})
+ end
+
def empty_array(conn, _) do
Logger.debug("Unimplemented, returning an empty array")
json(conn, [])
post "/apps", MastodonAPIController, :create_app
get "/timelines/public", MastodonAPIController, :public_timeline
+ get "/timelines/tag/:tag", MastodonAPIController, :hashtag_timeline
get "/statuses/:id", MastodonAPIController, :get_status
get "/statuses/:id/context", MastodonAPIController, :get_context
test "returns the relationships for the current user", %{conn: conn} do
user = insert(:user)
other_user = insert(:user)
-
{:ok, user} = User.follow(user, other_user)
conn = conn
assert media["type"] == "image"
end
+
+ test "hashtag timeline", %{conn: conn} do
+ following = insert(:user)
+
+ {:ok, activity} = TwitterAPI.create_status(following, %{"status" => "test #2hu"})
+ {:ok, [_activity]} = OStatus.fetch_activity_from_url("https://shitposter.club/notice/2827873")
+
+ conn = conn
+ |> get("/api/v1/timelines/tag/2hu")
+
+ assert [%{"id" => id}] = json_response(conn, 200)
+
+ assert id == activity.id
+ end
end