Merge branch 'media-proxy-follow-redirect' into 'develop'
[akkoma] / lib / pleroma / web / admin_api / admin_api_controller.ex
1 defmodule Pleroma.Web.AdminAPI.AdminAPIController do
2 use Pleroma.Web, :controller
3 alias Pleroma.{User, Repo}
4 alias Pleroma.Web.ActivityPub.Relay
5
6 import Pleroma.Web.ControllerHelper, only: [json_response: 3]
7
8 require Logger
9
10 action_fallback(:errors)
11
12 def user_delete(conn, %{"nickname" => nickname}) do
13 user = User.get_by_nickname(nickname)
14
15 if user.local == true do
16 User.delete(user)
17 else
18 User.delete(user)
19 end
20
21 conn
22 |> json(nickname)
23 end
24
25 def user_create(
26 conn,
27 %{"nickname" => nickname, "email" => email, "password" => password}
28 ) do
29 new_user = %{
30 nickname: nickname,
31 name: nickname,
32 email: email,
33 password: password,
34 password_confirmation: password,
35 bio: "."
36 }
37
38 User.register_changeset(%User{}, new_user)
39 |> Repo.insert!()
40
41 conn
42 |> json(new_user.nickname)
43 end
44
45 def tag_users(conn, %{"nicknames" => nicknames, "tags" => tags}) do
46 with {:ok, _} <- User.tag(nicknames, tags),
47 do: json_response(conn, :no_content, "")
48 end
49
50 def untag_users(conn, %{"nicknames" => nicknames, "tags" => tags}) do
51 with {:ok, _} <- User.untag(nicknames, tags),
52 do: json_response(conn, :no_content, "")
53 end
54
55 def right_add(conn, %{"permission_group" => permission_group, "nickname" => nickname})
56 when permission_group in ["moderator", "admin"] do
57 user = User.get_by_nickname(nickname)
58
59 info =
60 %{}
61 |> Map.put("is_" <> permission_group, true)
62
63 info_cng = User.Info.admin_api_update(user.info, info)
64
65 cng =
66 Ecto.Changeset.change(user)
67 |> Ecto.Changeset.put_embed(:info, info_cng)
68
69 {:ok, user} = User.update_and_set_cache(cng)
70
71 conn
72 |> json(info)
73 end
74
75 def right_get(conn, %{"nickname" => nickname}) do
76 user = User.get_by_nickname(nickname)
77
78 conn
79 |> json(%{
80 is_moderator: user.info.is_moderator,
81 is_admin: user.info.is_admin
82 })
83 end
84
85 def right_add(conn, _) do
86 conn
87 |> put_status(404)
88 |> json(%{error: "No such permission_group"})
89 end
90
91 def right_delete(
92 %{assigns: %{user: %User{:nickname => admin_nickname}}} = conn,
93 %{
94 "permission_group" => permission_group,
95 "nickname" => nickname
96 }
97 )
98 when permission_group in ["moderator", "admin"] do
99 if admin_nickname == nickname do
100 conn
101 |> put_status(403)
102 |> json(%{error: "You can't revoke your own admin status."})
103 else
104 user = User.get_by_nickname(nickname)
105
106 info =
107 %{}
108 |> Map.put("is_" <> permission_group, false)
109
110 info_cng = User.Info.admin_api_update(user.info, info)
111
112 cng =
113 Ecto.Changeset.change(user)
114 |> Ecto.Changeset.put_embed(:info, info_cng)
115
116 {:ok, user} = User.update_and_set_cache(cng)
117
118 conn
119 |> json(info)
120 end
121 end
122
123 def right_delete(conn, _) do
124 conn
125 |> put_status(404)
126 |> json(%{error: "No such permission_group"})
127 end
128
129 def relay_follow(conn, %{"relay_url" => target}) do
130 {status, message} = Relay.follow(target)
131
132 if status == :ok do
133 conn
134 |> json(target)
135 else
136 conn
137 |> put_status(500)
138 |> json(target)
139 end
140 end
141
142 def relay_unfollow(conn, %{"relay_url" => target}) do
143 {status, message} = Relay.unfollow(target)
144
145 if status == :ok do
146 conn
147 |> json(target)
148 else
149 conn
150 |> put_status(500)
151 |> json(target)
152 end
153 end
154
155 @shortdoc "Get a account registeration invite token (base64 string)"
156 def get_invite_token(conn, _params) do
157 {:ok, token} = Pleroma.UserInviteToken.create_token()
158
159 conn
160 |> json(token.token)
161 end
162
163 @shortdoc "Get a password reset token (base64 string) for given nickname"
164 def get_password_reset(conn, %{"nickname" => nickname}) do
165 (%User{local: true} = user) = User.get_by_nickname(nickname)
166 {:ok, token} = Pleroma.PasswordResetToken.create_token(user)
167
168 conn
169 |> json(token.token)
170 end
171
172 def errors(conn, {:param_cast, _}) do
173 conn
174 |> put_status(400)
175 |> json("Invalid parameters")
176 end
177
178 def errors(conn, _) do
179 conn
180 |> put_status(500)
181 |> json("Something went wrong")
182 end
183 end