108 lines
3.7 KiB
Elixir
108 lines
3.7 KiB
Elixir
|
defmodule Pleroma.Web.TwitterAPI.UserController do
|
||
|
use Pleroma.Web, :controller
|
||
|
alias Ecto.Changeset
|
||
|
alias Pleroma.{Activity, Object, Repo, User}
|
||
|
alias Pleroma.Web.ActivityPub.ActivityPub
|
||
|
alias Pleroma.Web.OStatus
|
||
|
alias Pleroma.Web.TwitterAPI.{ErrorView, Utils}
|
||
|
|
||
|
@httpoison Application.get_env(:pleroma, :httpoison)
|
||
|
|
||
|
def verify_credentials(%{assigns: %{user: user}} = conn, _params) do
|
||
|
render conn, "show.json", %{user: user, for: user}
|
||
|
end
|
||
|
|
||
|
#TODO: DRY the code
|
||
|
|
||
|
def follow(%{assigns: %{user: follower}} = conn, params) do
|
||
|
case find_user(conn, params) do
|
||
|
{:ok, followed = %User{}} ->
|
||
|
case User.follow(follower, followed) do
|
||
|
{:ok, follower = %User{}} ->
|
||
|
{:ok, _activity} = ActivityPub.follow(follower, followed)
|
||
|
render conn, "show.json", %{user: followed, for: follower}
|
||
|
{:error, message} ->
|
||
|
conn
|
||
|
|> put_status(:bad_request)
|
||
|
|> render(ErrorView, "error.json", %{request_path: conn.request_path, message: message})
|
||
|
end
|
||
|
{:error, response} -> response
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def unfollow(%{assigns: %{user: follower}} = conn, params) do
|
||
|
case find_user(conn, params) do
|
||
|
{:ok, unfollowed = %User{}} ->
|
||
|
case User.unfollow(follower, unfollowed) do
|
||
|
{:ok, follower = %User{ap_id: ap_id}, %Activity{data: %{"id" => id}}} ->
|
||
|
{:ok, _activity} = ActivityPub.insert(%{
|
||
|
"type" => "Undo",
|
||
|
"actor" => ap_id,
|
||
|
"object" => id, # get latest Follow for these users
|
||
|
"published" => Utils.make_date()
|
||
|
})
|
||
|
render conn, "show.json", %{user: unfollowed, for: follower}
|
||
|
{:error, message} ->
|
||
|
conn
|
||
|
|> put_status(:bad_request)
|
||
|
|> render(ErrorView, "error.json", %{request_path: conn.request_path, message: message})
|
||
|
end
|
||
|
{:error, response} -> response
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def register(conn, params) do
|
||
|
params = %{
|
||
|
nickname: params["nickname"],
|
||
|
name: params["fullname"],
|
||
|
bio: params["bio"],
|
||
|
email: params["email"],
|
||
|
password: params["password"],
|
||
|
password_confirmation: params["confirm"]
|
||
|
}
|
||
|
|
||
|
changeset = User.register_changeset(%User{}, params)
|
||
|
|
||
|
with {:ok, user} <- Repo.insert(changeset) do
|
||
|
render conn, "show.json", %{user: user}
|
||
|
else
|
||
|
{:error, changeset} ->
|
||
|
errors = Changeset.traverse_errors(changeset, fn {msg, _opts} -> msg end)
|
||
|
conn
|
||
|
|> put_status(:bad_request)
|
||
|
|> render(ErrorView, "error.json",
|
||
|
%{request_path: conn.request_path, message: Poison.encode!(errors)})
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def update_avatar(%{assigns: %{user: user}} = conn, params) do
|
||
|
{:ok, %Object{data: data}} = ActivityPub.upload(params)
|
||
|
change = Changeset.change(user, %{avatar: data})
|
||
|
{:ok, user} = Repo.update(change)
|
||
|
render conn, "show.json", %{user: user}
|
||
|
end
|
||
|
|
||
|
def external_profile(%{assigns: %{user: current_user}} = conn, %{"profileurl" => uri}) do
|
||
|
with {:ok, %User{} = user} <- OStatus.find_or_make_user(uri) do
|
||
|
with url <- user.info["topic"],
|
||
|
{:ok, %{body: body}} <- @httpoison.get(url, [], follow_redirect: true, timeout: 10000, recv_timeout: 20000) do
|
||
|
OStatus.handle_incoming(body)
|
||
|
end
|
||
|
render(conn, "show.json", %{user: user, for: current_user})
|
||
|
else _e ->
|
||
|
{:error, "Couldn't find user"}
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def find_user(%{assigns: %{user: user}} = conn, params) do
|
||
|
case User.get_by_params(user, params) do
|
||
|
{:ok, user = %User{}} -> {:ok, user}
|
||
|
{status, message} ->
|
||
|
response = conn
|
||
|
|> put_status(status)
|
||
|
|> render(ErrorView, "error.json", %{request_path: conn.request_path, message: message})
|
||
|
{:error, response}
|
||
|
end
|
||
|
end
|
||
|
end
|