Merge branch 'develop' of ssh.gitgud.io:lambadalambda/pleroma into develop
[akkoma] / lib / pleroma / web / ostatus / ostatus_controller.ex
1 defmodule Pleroma.Web.OStatus.OStatusController do
2 use Pleroma.Web, :controller
3
4 alias Pleroma.{User, Activity}
5 alias Pleroma.Web.OStatus.{FeedRepresenter, ActivityRepresenter}
6 alias Pleroma.Repo
7 alias Pleroma.Web.{OStatus, Federator}
8 import Ecto.Query
9
10 def feed_redirect(conn, %{"nickname" => nickname}) do
11 user = User.get_cached_by_nickname(nickname)
12 redirect conn, external: OStatus.feed_path(user)
13 end
14
15 def feed(conn, %{"nickname" => nickname}) do
16 user = User.get_cached_by_nickname(nickname)
17 query = from activity in Activity,
18 where: fragment("? @> ?", activity.data, ^%{actor: user.ap_id}),
19 limit: 20,
20 order_by: [desc: :inserted_at]
21
22 activities = query
23 |> Repo.all
24
25 response = user
26 |> FeedRepresenter.to_simple_form(activities, [user])
27 |> :xmerl.export_simple(:xmerl_xml)
28 |> to_string
29
30 conn
31 |> put_resp_content_type("application/atom+xml")
32 |> send_resp(200, response)
33 end
34
35 def salmon_incoming(conn, params) do
36 {:ok, body, _conn} = read_body(conn)
37 {:ok, magic_key} = Pleroma.Web.Salmon.fetch_magic_key(body)
38 {:ok, doc} = Pleroma.Web.Salmon.decode_and_validate(magic_key, body)
39
40 Federator.enqueue(:incoming_doc, doc)
41
42 conn
43 |> send_resp(200, "")
44 end
45
46 def object(conn, %{"uuid" => uuid}) do
47 with id <- o_status_url(conn, :object, uuid),
48 %Activity{} = activity <- Activity.get_create_activity_by_object_ap_id(id),
49 %User{} = user <- User.get_cached_by_ap_id(activity.data["actor"]) do
50 case get_format(conn) do
51 "html" -> redirect(conn, to: "/notice/#{activity.id}")
52 _ -> represent_activity(conn, activity, user)
53 end
54 end
55 end
56
57 def activity(conn, %{"uuid" => uuid}) do
58 with id <- o_status_url(conn, :activity, uuid),
59 %Activity{} = activity <- Activity.get_by_ap_id(id),
60 %User{} = user <- User.get_cached_by_ap_id(activity.data["actor"]) do
61 case get_format(conn) do
62 "html" -> redirect(conn, to: "/notice/#{activity.id}")
63 _ -> represent_activity(conn, activity, user)
64 end
65 end
66 end
67
68 defp represent_activity(conn, activity, user) do
69 response = activity
70 |> ActivityRepresenter.to_simple_form(user, true)
71 |> ActivityRepresenter.wrap_with_entry
72 |> :xmerl.export_simple(:xmerl_xml)
73 |> to_string
74
75 conn
76 |> put_resp_content_type("application/atom+xml")
77 |> send_resp(200, response)
78 end
79 end