+
+ def notifications(%{assigns: %{user: user}} = conn, params) do
+ notifications = Notification.for_user(user, params)
+ result = Enum.map(notifications, fn (%{id: id, activity: activity, inserted_at: created_at}) ->
+ actor = User.get_cached_by_ap_id(activity.data["actor"])
+ created_at = NaiveDateTime.to_iso8601(created_at)
+ |> String.replace(~r/(\.\d+)?$/, ".000Z", global: false)
+ case activity.data["type"] do
+ "Create" ->
+ %{id: id, type: "mention", created_at: created_at, account: AccountView.render("account.json", %{user: actor}), status: StatusView.render("status.json", %{activity: activity})}
+ "Like" ->
+ liked_activity = Activity.get_create_activity_by_object_ap_id(activity.data["object"])
+ %{id: id, type: "favourite", created_at: created_at, account: AccountView.render("account.json", %{user: actor}), status: StatusView.render("status.json", %{activity: liked_activity})}
+ "Announce" ->
+ announced_activity = Activity.get_create_activity_by_object_ap_id(activity.data["object"])
+ %{id: id, type: "reblog", created_at: created_at, account: AccountView.render("account.json", %{user: actor}), status: StatusView.render("status.json", %{activity: announced_activity})}
+ "Follow" ->
+ %{id: id, type: "follow", created_at: created_at, account: AccountView.render("account.json", %{user: actor})}
+ _ -> nil
+ end
+ end)
+ |> Enum.filter(&(&1))
+
+ conn
+ |> add_link_headers(:notifications, notifications)
+ |> json(result)
+ end
+
+ def relationships(%{assigns: %{user: user}} = conn, %{"id" => id}) do
+ id = List.wrap(id)
+ q = from u in User,
+ where: u.id in ^id
+ targets = Repo.all(q)
+ render conn, AccountView, "relationships.json", %{user: user, targets: targets}
+ end
+
+ def upload(%{assigns: %{user: user}} = conn, %{"file" => file}) do
+ with {:ok, object} <- ActivityPub.upload(file) do
+ data = object.data
+ |> Map.put("id", object.id)
+
+ render conn, StatusView, "attachment.json", %{attachment: data}
+ end
+ end
+
+ def favourited_by(conn, %{"id" => id}) do
+ with %Activity{data: %{"object" => %{"likes" => likes} = data}} <- Repo.get(Activity, id) do
+ q = from u in User,
+ where: u.ap_id in ^likes
+ users = Repo.all(q)
+ render conn, AccountView, "accounts.json", %{users: users, as: :user}
+ else
+ _ -> json(conn, [])
+ end
+ end
+
+ def reblogged_by(conn, %{"id" => id}) do
+ with %Activity{data: %{"object" => %{"announcements" => announces}}} <- Repo.get(Activity, id) do
+ q = from u in User,
+ where: u.ap_id in ^announces
+ users = Repo.all(q)
+ render conn, AccountView, "accounts.json", %{users: users, as: :user}
+ else
+ _ -> json(conn, [])
+ end
+ end
+
+ def empty_array(conn, _) do
+ Logger.debug("Unimplemented, returning an empty array")
+ json(conn, [])
+ end