@ -4,6 +4,7 @@
defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
use Pleroma.Web , :controller
alias Pleroma.Activity
alias Pleroma.Config
alias Pleroma.Filter
@ -13,21 +14,17 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
alias Pleroma.Stats
alias Pleroma.User
alias Pleroma.Web
alias Pleroma.Web.ActivityPub.ActivityPub
alias Pleroma.Web.ActivityPub.Visibility
alias Pleroma.Web.CommonAPI
alias Pleroma.Web.MediaProxy
alias Pleroma.Web.Push
alias Push.Subscription
alias Pleroma.Web.MastodonAPI.AccountView
alias Pleroma.Web.MastodonAPI.FilterView
alias Pleroma.Web.MastodonAPI.ListView
alias Pleroma.Web.MastodonAPI.MastodonAPI
alias Pleroma.Web.MastodonAPI.MastodonView
alias Pleroma.Web.MastodonAPI.PushSubscriptionView
alias Pleroma.Web.MastodonAPI.StatusView
alias Pleroma.Web.MastodonAPI.ReportView
alias Pleroma.Web.ActivityPub.ActivityPub
alias Pleroma.Web.ActivityPub.Utils
alias Pleroma.Web.ActivityPub.Visibility
alias Pleroma.Web.MastodonAPI.StatusView
alias Pleroma.Web.MediaProxy
alias Pleroma.Web.OAuth.App
alias Pleroma.Web.OAuth.Authorization
alias Pleroma.Web.OAuth.Token
@ -134,8 +131,8 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
json ( conn , account )
end
def user ( %{ assigns : %{ user : for_user } } = conn , %{ " id " = > id} ) do
with % User { } = user <- Repo. get ( User , id) ,
def user ( %{ assigns : %{ user : for_user } } = conn , %{ " id " = > nickname_or_ id} ) do
with % User { } = user <- User. get_cached_by_nickname_or_id ( nickname_or_ id) ,
true <- User . auth_active? ( user ) || user . id == for_user . id || User . superuser? ( for_user ) do
account = AccountView . render ( " account.json " , %{ user : user , for : for_user } )
json ( conn , account )
@ -193,6 +190,11 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
end
defp add_link_headers ( conn , method , activities , param \\ nil , params \\ %{ } ) do
params =
conn . params
|> Map . drop ( [ " since_id " , " max_id " ] )
|> Map . merge ( params )
last = List . last ( activities )
first = List . first ( activities )
@ -292,13 +294,17 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
end
def dm_timeline ( %{ assigns : %{ user : user } } = conn , params ) do
query =
ActivityPub . fetch_activities_query (
[ user . ap_id ] ,
Map . merge ( params , %{ " type " = > " Create " , visibility : " direct " } )
)
params =
params
|> Map . put ( " type " , " Create " )
|> Map . put ( " blocking_user " , user )
|> Map . put ( " user " , user )
|> Map . put ( :visibility , " direct " )
activities = Repo . all ( query )
activities =
[ user . ap_id ]
|> ActivityPub . fetch_activities_query ( params )
|> Repo . all ( )
conn
|> add_link_headers ( :dm_timeline , activities )
@ -646,9 +652,9 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|> render ( " index.json " , %{ activities : activities , for : user , as : :activity } )
end
def followers ( %{ assigns : %{ user : for_user } } = conn , %{ " id " = > id } ) do
def followers ( %{ assigns : %{ user : for_user } } = conn , %{ " id " = > id } = params ) do
with % User { } = user <- Repo . get ( User , id ) ,
{ :ok , followers } <- User . get_followers ( user ) do
followers <- MastodonAPI . get_followers ( user , params ) do
followers =
cond do
for_user && user . id == for_user . id -> followers
@ -657,14 +663,15 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
end
conn
|> add_link_headers ( :followers , followers , user )
|> put_view ( AccountView )
|> render ( " accounts.json " , %{ users : followers , as : :user } )
end
end
def following ( %{ assigns : %{ user : for_user } } = conn , %{ " id " = > id } ) do
def following ( %{ assigns : %{ user : for_user } } = conn , %{ " id " = > id } = params ) do
with % User { } = user <- Repo . get ( User , id ) ,
{ :ok , followers } <- User . get_friends ( user ) do
followers <- MastodonAPI . get_friends ( user , params ) do
followers =
cond do
for_user && user . id == for_user . id -> followers
@ -673,6 +680,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
end
conn
|> add_link_headers ( :following , followers , user )
|> put_view ( AccountView )
|> render ( " accounts.json " , %{ users : followers , as : :user } )
end
@ -688,16 +696,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
def authorize_follow_request ( %{ assigns : %{ user : followed } } = conn , %{ " id " = > id } ) do
with % User { } = follower <- Repo . get ( User , id ) ,
{ :ok , follower } <- User . maybe_follow ( follower , followed ) ,
% Activity { } = follow_activity <- Utils . fetch_latest_follow ( follower , followed ) ,
{ :ok , follow_activity } <- Utils . update_follow_state ( follow_activity , " accept " ) ,
{ :ok , _activity } <-
ActivityPub . accept ( %{
to : [ follower . ap_id ] ,
actor : followed ,
object : follow_activity . data [ " id " ] ,
type : " Accept "
} ) do
{ :ok , follower } <- CommonAPI . accept_follow_request ( follower , followed ) do
conn
|> put_view ( AccountView )
|> render ( " relationship.json " , %{ user : followed , target : follower } )
@ -711,15 +710,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
def reject_follow_request ( %{ assigns : %{ user : followed } } = conn , %{ " id " = > id } ) do
with % User { } = follower <- Repo . get ( User , id ) ,
% Activity { } = follow_activity <- Utils . fetch_latest_follow ( follower , followed ) ,
{ :ok , follow_activity } <- Utils . update_follow_state ( follow_activity , " reject " ) ,
{ :ok , _activity } <-
ActivityPub . reject ( %{
to : [ follower . ap_id ] ,
actor : followed ,
object : follow_activity . data [ " id " ] ,
type : " Reject "
} ) do
{ :ok , follower } <- CommonAPI . reject_follow_request ( follower , followed ) do
conn
|> put_view ( AccountView )
|> render ( " relationship.json " , %{ user : followed , target : follower } )
@ -733,14 +724,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
def follow ( %{ assigns : %{ user : follower } } = conn , %{ " id " = > id } ) do
with % User { } = followed <- Repo . get ( User , id ) ,
{ :ok , follower } <- User . maybe_direct_follow ( follower , followed ) ,
{ :ok , _activity } <- ActivityPub . follow ( follower , followed ) ,
{ :ok , follower , followed } <-
User . wait_and_refresh (
Config . get ( [ :activitypub , :follow_handshake_timeout ] ) ,
follower ,
followed
) do
{ :ok , follower , followed , _ } <- CommonAPI . follow ( follower , followed ) do
conn
|> put_view ( AccountView )
|> render ( " relationship.json " , %{ user : follower , target : followed } )
@ -754,8 +738,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
def follow ( %{ assigns : %{ user : follower } } = conn , %{ " uri " = > uri } ) do
with % User { } = followed <- Repo . get_by ( User , nickname : uri ) ,
{ :ok , follower } <- User . maybe_direct_follow ( follower , followed ) ,
{ :ok , _activity } <- ActivityPub . follow ( follower , followed ) do
{ :ok , follower , followed , _ } <- CommonAPI . follow ( follower , followed ) do
conn
|> put_view ( AccountView )
|> render ( " account.json " , %{ user : followed , for : follower } )
@ -769,8 +752,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
def unfollow ( %{ assigns : %{ user : follower } } = conn , %{ " id " = > id } ) do
with % User { } = followed <- Repo . get ( User , id ) ,
{ :ok , _activity } <- ActivityPub . unfollow ( follower , followed ) ,
{ :ok , follower , _ } <- User . unfollow ( follower , followed ) do
{ :ok , follower } <- CommonAPI . unfollow ( follower , followed ) do
conn
|> put_view ( AccountView )
|> render ( " relationship.json " , %{ user : follower , target : followed } )
@ -1128,7 +1110,8 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
compose : %{
me : " #{ user . id } " ,
default_privacy : user . info . default_scope ,
default_sensitive : false
default_sensitive : false ,
allow_content_types : Config . get ( [ :instance , :allowed_post_formats ] )
} ,
media_attachments : %{
accept_content_types : [
@ -1273,7 +1256,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
end
end
defp get_or_make_app ( ) do
defp get_or_make_app do
find_attrs = %{ client_name : @local_mastodon_name , redirect_uris : " . " }
scopes = [ " read " , " write " , " follow " , " push " ]
@ -1424,37 +1407,8 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
json ( conn , %{ } )
end
def create_push_subscription ( %{ assigns : %{ user : user , token : token } } = conn , params ) do
true = Push . enabled ( )
Subscription . delete_if_exists ( user , token )
{ :ok , subscription } = Subscription . create ( user , token , params )
view = PushSubscriptionView . render ( " push_subscription.json " , subscription : subscription )
json ( conn , view )
end
def get_push_subscription ( %{ assigns : %{ user : user , token : token } } = conn , _params ) do
true = Push . enabled ( )
subscription = Subscription . get ( user , token )
view = PushSubscriptionView . render ( " push_subscription.json " , subscription : subscription )
json ( conn , view )
end
def update_push_subscription (
%{ assigns : %{ user : user , token : token } } = conn ,
params
) do
true = Push . enabled ( )
{ :ok , subscription } = Subscription . update ( user , token , params )
view = PushSubscriptionView . render ( " push_subscription.json " , subscription : subscription )
json ( conn , view )
end
def delete_push_subscription ( %{ assigns : %{ user : user , token : token } } = conn , _params ) do
true = Push . enabled ( )
{ :ok , _response } = Subscription . delete ( user , token )
json ( conn , %{ } )
end
# fallback action
#
def errors ( conn , _ ) do
conn
|> put_status ( 500 )
@ -1483,7 +1437,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
url ,
[ ] ,
adapter : [
timeout : timeout ,
recv_timeout : timeout ,
pool : :default
]