Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Pleroma
pleroma
Commits
059005ff
Verified
Commit
059005ff
authored
Oct 11, 2019
by
minibikini
Browse files
Replace `user.following` with Pleroma.FollowingRelationship
parent
2c7ff32e
Changes
28
Hide whitespace changes
Inline
Side-by-side
lib/mix/tasks/pleroma/database.ex
View file @
059005ff
...
...
@@ -52,9 +52,9 @@ def run(["bump_all_conversations"]) do
def
run
([
"update_users_following_followers_counts"
])
do
start_pleroma
()
users
=
Repo
.
all
(
User
)
Enum
.
each
(
users
,
&
User
.
remove_duplicated_following
/
1
)
Enum
.
each
(
users
,
&
User
.
update_follower_count
/
1
)
User
|>
Repo
.
all
(
)
|>
Enum
.
each
(
&
User
.
update_follower_count
/
1
)
end
def
run
([
"prune_objects"
|
args
])
do
...
...
lib/mix/tasks/pleroma/relay.ex
View file @
059005ff
...
...
@@ -36,8 +36,9 @@ def run(["unfollow", target]) do
def
run
([
"list"
])
do
start_pleroma
()
with
%
User
{
following:
following
}
=
_user
<-
Relay
.
get_actor
()
do
following
with
%
User
{}
=
user
<-
Relay
.
get_actor
()
do
user
|>
User
.
following
()
|>
Enum
.
map
(
fn
entry
->
URI
.
parse
(
entry
)
.
host
end
)
|>
Enum
.
uniq
()
|>
Enum
.
each
(
&
shell_info
(
&1
))
...
...
lib/mix/tasks/pleroma/user.ex
View file @
059005ff
...
...
@@ -162,7 +162,7 @@ def run(["unsubscribe", nickname]) do
user
=
User
.
get_cached_by_id
(
user
.
id
)
if
Enum
.
empty?
(
u
ser
.
following
)
do
if
Enum
.
empty?
(
U
ser
.
get_friends
(
user
)
)
do
shell_info
(
"Successfully unsubscribed all followers from
#{
user
.
nickname
}
"
)
end
else
...
...
lib/pleroma/bbs/handler.ex
View file @
059005ff
...
...
@@ -97,7 +97,7 @@ def handle_command(state, "home") do
|>
Map
.
put
(
"user"
,
user
)
activities
=
[
user
.
ap_id
|
u
ser
.
following
]
[
user
.
ap_id
|
Pleroma
.
U
ser
.
following
(
user
)
]
|>
ActivityPub
.
fetch_activities
(
params
)
Enum
.
each
(
activities
,
fn
activity
->
...
...
lib/pleroma/following_relationship.ex
0 → 100644
View file @
059005ff
# Pleroma: A lightweight social networking server
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule
Pleroma
.
FollowingRelationship
do
use
Ecto
.
Schema
import
Ecto
.
Changeset
import
Ecto
.
Query
alias
FlakeId
.
Ecto
.
CompatType
alias
Pleroma
.
Repo
alias
Pleroma
.
User
schema
"following_relationships"
do
field
(
:state
,
:string
,
default:
"accept"
)
belongs_to
(
:follower
,
User
,
type:
CompatType
)
belongs_to
(
:following
,
User
,
type:
CompatType
)
timestamps
()
end
def
changeset
(%
__MODULE__
{}
=
following_relationship
,
attrs
)
do
following_relationship
|>
cast
(
attrs
,
[
:state
])
|>
put_assoc
(
:follower
,
attrs
.
follower
)
|>
put_assoc
(
:following
,
attrs
.
following
)
|>
validate_required
([
:state
,
:follower
,
:following
])
end
def
get
(%
User
{}
=
follower
,
%
User
{}
=
following
)
do
__MODULE__
|>
where
(
follower_id:
^
follower
.
id
,
following_id:
^
following
.
id
)
|>
Repo
.
one
()
end
def
update
(
follower
,
following
,
"reject"
),
do
:
unfollow
(
follower
,
following
)
def
update
(%
User
{}
=
follower
,
%
User
{}
=
following
,
state
)
do
case
get
(
follower
,
following
)
do
nil
->
follow
(
follower
,
following
,
state
)
following_relationship
->
following_relationship
|>
cast
(%{
state:
state
},
[
:state
])
|>
validate_required
([
:state
])
|>
Repo
.
update
()
end
end
def
follow
(%
User
{}
=
follower
,
%
User
{}
=
following
,
state
\\
"accept"
)
do
%
__MODULE__
{}
|>
changeset
(%{
follower:
follower
,
following:
following
,
state:
state
})
|>
Repo
.
insert
(
on_conflict:
:nothing
)
end
def
unfollow
(%
User
{}
=
follower
,
%
User
{}
=
following
)
do
case
get
(
follower
,
following
)
do
nil
->
{
:ok
,
nil
}
%
__MODULE__
{}
=
following_relationship
->
Repo
.
delete
(
following_relationship
)
end
end
def
follower_count
(%
User
{}
=
user
)
do
%{
followers:
user
,
deactivated:
false
}
|>
User
.
Query
.
build
()
|>
Repo
.
aggregate
(
:count
,
:id
)
end
def
following_count
(%
User
{
id:
nil
}),
do
:
0
def
following_count
(%
User
{}
=
user
)
do
%{
friends:
user
,
deactivated:
false
}
|>
User
.
Query
.
build
()
|>
Repo
.
aggregate
(
:count
,
:id
)
end
def
get_follow_requests
(%
User
{
id:
id
})
do
__MODULE__
|>
join
(
:inner
,
[
r
],
f
in
assoc
(
r
,
:follower
))
|>
where
([
r
],
r
.
state
==
"pending"
)
|>
where
([
r
],
r
.
following_id
==
^
id
)
|>
select
([
r
,
f
],
f
)
|>
Repo
.
all
()
end
def
following?
(%
User
{
id:
follower_id
},
%
User
{
id:
followed_id
})
do
__MODULE__
|>
where
(
follower_id:
^
follower_id
,
following_id:
^
followed_id
,
state:
"accept"
)
|>
Repo
.
exists?
()
end
def
following
(%
User
{}
=
user
)
do
following
=
__MODULE__
|>
join
(
:inner
,
[
r
],
u
in
User
,
on:
r
.
following_id
==
u
.
id
)
|>
where
([
r
],
r
.
follower_id
==
^
user
.
id
)
|>
where
([
r
],
r
.
state
==
"accept"
)
|>
select
([
r
,
u
],
u
.
follower_address
)
|>
Repo
.
all
()
if
user
.
nickname
in
[
nil
,
"internal.fetch"
]
do
following
else
[
user
.
follower_address
|
following
]
end
end
end
lib/pleroma/user.ex
View file @
059005ff
...
...
@@ -13,6 +13,7 @@ defmodule Pleroma.User do
alias
Pleroma
.
Activity
alias
Pleroma
.
Conversation
.
Participation
alias
Pleroma
.
Delivery
alias
Pleroma
.
FollowingRelationship
alias
Pleroma
.
Keys
alias
Pleroma
.
Notification
alias
Pleroma
.
Object
...
...
@@ -52,7 +53,6 @@ defmodule Pleroma.User do
field
(
:password
,
:string
,
virtual:
true
)
field
(
:password_confirmation
,
:string
,
virtual:
true
)
field
(
:keys
,
:string
)
field
(
:following
,
{
:array
,
:string
},
default:
[])
field
(
:ap_id
,
:string
)
field
(
:avatar
,
:map
)
field
(
:local
,
:boolean
,
default:
true
)
...
...
@@ -162,13 +162,7 @@ def restrict_deactivated(query) do
)
end
def
following_count
(%
User
{
following:
[]}),
do
:
0
def
following_count
(%
User
{}
=
user
)
do
user
|>
get_friends_query
()
|>
Repo
.
aggregate
(
:count
,
:id
)
end
defdelegate
following_count
(
user
),
to:
FollowingRelationship
defp
truncate_if_exists
(
params
,
key
,
max_length
)
do
if
Map
.
has_key?
(
params
,
key
)
and
is_binary
(
params
[
key
])
do
...
...
@@ -216,7 +210,7 @@ def update_changeset(struct, params \\ %{}) do
name_limit
=
Pleroma
.
Config
.
get
([
:instance
,
:user_name_length
],
100
)
struct
|>
cast
(
params
,
[
:bio
,
:name
,
:avatar
,
:following
])
|>
cast
(
params
,
[
:bio
,
:name
,
:avatar
])
|>
unique_constraint
(
:nickname
)
|>
validate_format
(
:nickname
,
local_nickname_regex
())
|>
validate_length
(
:bio
,
max:
bio_limit
)
...
...
@@ -324,7 +318,6 @@ defp put_following_and_follower_address(changeset) do
followers
=
ap_followers
(%
User
{
nickname:
get_field
(
changeset
,
:nickname
)})
changeset
|>
put_change
(
:following
,
[
followers
])
|>
put_change
(
:follower_address
,
followers
)
end
...
...
@@ -378,8 +371,11 @@ def needs_update?(%User{local: false} = user) do
def
needs_update?
(
_
),
do
:
true
@spec
maybe_direct_follow
(
User
.
t
(),
User
.
t
())
::
{
:ok
,
User
.
t
()}
|
{
:error
,
String
.
t
()}
def
maybe_direct_follow
(%
User
{}
=
follower
,
%
User
{
local:
true
,
info:
%{
locked:
true
}})
do
{
:ok
,
follower
}
def
maybe_direct_follow
(
%
User
{}
=
follower
,
%
User
{
local:
true
,
info:
%{
locked:
true
}}
=
followed
)
do
follow
(
follower
,
followed
,
"pending"
)
end
def
maybe_direct_follow
(%
User
{}
=
follower
,
%
User
{
local:
true
}
=
followed
)
do
...
...
@@ -397,37 +393,22 @@ def maybe_direct_follow(%User{} = follower, %User{} = followed) do
@doc
"A mass follow for local users. Respects blocks in both directions but does not create activities."
@spec
follow_all
(
User
.
t
(),
list
(
User
.
t
()))
::
{
atom
(),
User
.
t
()}
def
follow_all
(
follower
,
followeds
)
do
followed_addresses
=
followeds
|>
Enum
.
reject
(
fn
followed
->
blocks?
(
follower
,
followed
)
||
blocks?
(
followed
,
follower
)
end
)
|>
Enum
.
map
(
fn
%{
follower_address:
fa
}
->
fa
end
)
q
=
from
(
u
in
User
,
where:
u
.
id
==
^
follower
.
id
,
update:
[
set:
[
following:
fragment
(
"array(select distinct unnest (array_cat(?, ?)))"
,
u
.
following
,
^
followed_addresses
)
]
],
select:
u
)
followeds
=
Enum
.
reject
(
followeds
,
fn
followed
->
blocks?
(
follower
,
followed
)
||
blocks?
(
followed
,
follower
)
end
)
{
1
,
[
follower
]}
=
Repo
.
update_all
(
q
,
[]
)
Enum
.
each
(
followeds
,
&
follow
(
follower
,
&1
,
"accept"
)
)
Enum
.
each
(
followeds
,
&
update_follower_count
/
1
)
set_cache
(
follower
)
end
def
follow
(%
User
{}
=
follower
,
%
User
{
info:
info
}
=
followed
)
do
defdelegate
following
(
user
),
to:
FollowingRelationship
def
follow
(%
User
{}
=
follower
,
%
User
{
info:
info
}
=
followed
,
state
\\
"accept"
)
do
deny_follow_blocked
=
Pleroma
.
Config
.
get
([
:user
,
:deny_follow_blocked
])
ap_followers
=
followed
.
follower_address
cond
do
info
.
deactivated
->
...
...
@@ -441,14 +422,7 @@ def follow(%User{} = follower, %User{info: info} = followed) do
Websub
.
subscribe
(
follower
,
followed
)
end
q
=
from
(
u
in
User
,
where:
u
.
id
==
^
follower
.
id
,
update:
[
push:
[
following:
^
ap_followers
]],
select:
u
)
{
1
,
[
follower
]}
=
Repo
.
update_all
(
q
,
[])
FollowingRelationship
.
follow
(
follower
,
followed
,
state
)
follower
=
maybe_update_following_count
(
follower
)
...
...
@@ -459,17 +433,8 @@ def follow(%User{} = follower, %User{info: info} = followed) do
end
def
unfollow
(%
User
{}
=
follower
,
%
User
{}
=
followed
)
do
ap_followers
=
followed
.
follower_address
if
following?
(
follower
,
followed
)
and
follower
.
ap_id
!=
followed
.
ap_id
do
q
=
from
(
u
in
User
,
where:
u
.
id
==
^
follower
.
id
,
update:
[
pull:
[
following:
^
ap_followers
]],
select:
u
)
{
1
,
[
follower
]}
=
Repo
.
update_all
(
q
,
[])
FollowingRelationship
.
unfollow
(
follower
,
followed
)
follower
=
maybe_update_following_count
(
follower
)
...
...
@@ -483,10 +448,7 @@ def unfollow(%User{} = follower, %User{} = followed) do
end
end
@spec
following?
(
User
.
t
(),
User
.
t
())
::
boolean
def
following?
(%
User
{}
=
follower
,
%
User
{}
=
followed
)
do
Enum
.
member?
(
follower
.
following
,
followed
.
follower_address
)
end
defdelegate
following?
(
follower
,
followed
),
to:
FollowingRelationship
def
locked?
(%
User
{}
=
user
)
do
user
.
info
.
locked
||
false
...
...
@@ -707,16 +669,7 @@ def get_friends_ids(user, page \\ nil) do
|>
Repo
.
all
()
end
@spec
get_follow_requests
(
User
.
t
())
::
{
:ok
,
[
User
.
t
()]}
def
get_follow_requests
(%
User
{}
=
user
)
do
user
|>
Activity
.
follow_requests_for_actor
()
|>
join
(
:inner
,
[
a
],
u
in
User
,
on:
a
.
actor
==
u
.
ap_id
)
|>
where
([
a
,
u
],
not
fragment
(
"? @> ?"
,
u
.
following
,
^
[
user
.
follower_address
]))
|>
group_by
([
a
,
u
],
u
.
id
)
|>
select
([
a
,
u
],
u
)
|>
Repo
.
all
()
end
defdelegate
get_follow_requests
(
user
),
to:
FollowingRelationship
def
increase_note_count
(%
User
{}
=
user
)
do
User
...
...
@@ -899,18 +852,6 @@ def increment_unread_conversation_count(conversation, %User{local: true} = user)
def
increment_unread_conversation_count
(
_
,
_
),
do
:
:noop
def
remove_duplicated_following
(%
User
{
following:
following
}
=
user
)
do
uniq_following
=
Enum
.
uniq
(
following
)
if
length
(
following
)
==
length
(
uniq_following
)
do
{
:ok
,
user
}
else
user
|>
update_changeset
(%{
following:
uniq_following
})
|>
update_and_set_cache
()
end
end
@spec
get_users_from_set
([
String
.
t
()],
boolean
())
::
[
User
.
t
()]
def
get_users_from_set
(
ap_ids
,
local_only
\\
true
)
do
criteria
=
%{
ap_id:
ap_ids
,
deactivated:
false
}
...
...
lib/pleroma/user/query.ex
View file @
059005ff
...
...
@@ -28,6 +28,8 @@ defmodule Pleroma.User.Query do
"""
import
Ecto
.
Query
import
Pleroma
.
Web
.
AdminAPI
.
Search
,
only:
[
not_empty_string:
1
]
alias
Pleroma
.
FollowingRelationship
alias
Pleroma
.
User
@type
criteria
::
...
...
@@ -130,18 +132,40 @@ defp compose_query({:deactivated, true}, query) do
|>
where
([
u
],
not
is_nil
(
u
.
nickname
))
end
defp
compose_query
({
:followers
,
%
User
{
id:
id
,
follower_address:
follower_address
}},
query
)
do
where
(
query
,
[
u
],
fragment
(
"? <@ ?"
,
^
[
follower_address
],
u
.
following
))
defp
compose_query
({
:followers
,
%
User
{
id:
id
}},
query
)
do
query
|>
where
([
u
],
u
.
id
!=
^
id
)
|>
join
(
:inner
,
[
u
],
r
in
FollowingRelationship
,
as:
:relationships
,
on:
r
.
following_id
==
^
id
and
r
.
follower_id
==
u
.
id
)
|>
where
([
relationships:
r
],
r
.
state
==
"accept"
)
end
defp
compose_query
({
:friends
,
%
User
{
id:
id
,
following:
following
}},
query
)
do
where
(
query
,
[
u
],
u
.
follower_address
in
^
following
)
defp
compose_query
({
:friends
,
%
User
{
id:
id
}},
query
)
do
query
|>
where
([
u
],
u
.
id
!=
^
id
)
|>
join
(
:inner
,
[
u
],
r
in
FollowingRelationship
,
as:
:relationships
,
on:
r
.
following_id
==
u
.
id
and
r
.
follower_id
==
^
id
)
|>
where
([
relationships:
r
],
r
.
state
==
"accept"
)
end
defp
compose_query
({
:recipients_from_activity
,
to
},
query
)
do
where
(
query
,
[
u
],
u
.
ap_id
in
^
to
or
fragment
(
"? && ?"
,
u
.
following
,
^
to
))
query
|>
join
(
:left
,
[
u
],
r
in
FollowingRelationship
,
as:
:relationships
,
on:
r
.
follower_id
==
u
.
id
)
|>
join
(
:left
,
[
relationships:
r
],
f
in
User
,
as:
:following
,
on:
f
.
id
==
r
.
following_id
)
|>
where
(
[
u
,
following:
f
,
relationships:
r
],
u
.
ap_id
in
^
to
or
(
f
.
follower_address
in
^
to
and
r
.
state
==
"accept"
)
)
end
defp
compose_query
({
:order_by
,
key
},
query
)
do
...
...
lib/pleroma/web/activity_pub/activity_pub.ex
View file @
059005ff
...
...
@@ -501,7 +501,9 @@ defp fetch_activities_for_context_query(context, opts) do
public
=
[
Pleroma
.
Constants
.
as_public
()]
recipients
=
if
opts
[
"user"
],
do
:
[
opts
[
"user"
]
.
ap_id
|
opts
[
"user"
]
.
following
]
++
public
,
else
:
public
if
opts
[
"user"
],
do
:
[
opts
[
"user"
]
.
ap_id
|
User
.
following
(
opts
[
"user"
])]
++
public
,
else
:
public
from
(
activity
in
Activity
)
|>
maybe_preload_objects
(
opts
)
...
...
@@ -652,7 +654,7 @@ defp user_activities_recipients(%{"godmode" => true}) do
defp
user_activities_recipients
(%{
"reading_user"
=>
reading_user
})
do
if
reading_user
do
[
Pleroma
.
Constants
.
as_public
()]
++
[
reading_user
.
ap_id
|
reading_u
ser
.
following
]
[
Pleroma
.
Constants
.
as_public
()]
++
[
reading_user
.
ap_id
|
U
ser
.
following
(
reading_user
)
]
else
[
Pleroma
.
Constants
.
as_public
()]
end
...
...
lib/pleroma/web/activity_pub/activity_pub_controller.ex
View file @
059005ff
...
...
@@ -319,12 +319,12 @@ def read_inbox(
when
page?
in
[
true
,
"true"
]
do
activities
=
if
params
[
"max_id"
]
do
ActivityPub
.
fetch_activities
([
user
.
ap_id
|
u
ser
.
following
],
%{
ActivityPub
.
fetch_activities
([
user
.
ap_id
|
U
ser
.
following
(
user
)
],
%{
"max_id"
=>
params
[
"max_id"
],
"limit"
=>
10
})
else
ActivityPub
.
fetch_activities
([
user
.
ap_id
|
u
ser
.
following
],
%{
"limit"
=>
10
})
ActivityPub
.
fetch_activities
([
user
.
ap_id
|
U
ser
.
following
(
user
)
],
%{
"limit"
=>
10
})
end
conn
...
...
lib/pleroma/web/activity_pub/transmogrifier.ex
View file @
059005ff
...
...
@@ -7,6 +7,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
A module to handle coding from internal to wire ActivityPub and back.
"""
alias
Pleroma
.
Activity
alias
Pleroma
.
FollowingRelationship
alias
Pleroma
.
Object
alias
Pleroma
.
Object
.
Containment
alias
Pleroma
.
Repo
...
...
@@ -474,7 +475,8 @@ def handle_incoming(
{
_
,
false
}
<-
{
:user_locked
,
User
.
locked?
(
followed
)},
{
_
,
{
:ok
,
follower
}}
<-
{
:follow
,
User
.
follow
(
follower
,
followed
)},
{
_
,
{
:ok
,
_
}}
<-
{
:follow_state_update
,
Utils
.
update_follow_state_for_all
(
activity
,
"accept"
)}
do
{
:follow_state_update
,
Utils
.
update_follow_state_for_all
(
activity
,
"accept"
)},
{
:ok
,
_relationship
}
<-
FollowingRelationship
.
update
(
follower
,
followed
,
"accept"
)
do
ActivityPub
.
accept
(%{
to:
[
follower
.
ap_id
],
actor:
followed
,
...
...
@@ -484,6 +486,7 @@ def handle_incoming(
else
{
:user_blocked
,
true
}
->
{
:ok
,
_
}
=
Utils
.
update_follow_state_for_all
(
activity
,
"reject"
)
{
:ok
,
_relationship
}
=
FollowingRelationship
.
update
(
follower
,
followed
,
"reject"
)
ActivityPub
.
reject
(%{
to:
[
follower
.
ap_id
],
...
...
@@ -494,6 +497,7 @@ def handle_incoming(
{
:follow
,
{
:error
,
_
}}
->
{
:ok
,
_
}
=
Utils
.
update_follow_state_for_all
(
activity
,
"reject"
)
{
:ok
,
_relationship
}
=
FollowingRelationship
.
update
(
follower
,
followed
,
"reject"
)
ActivityPub
.
reject
(%{
to:
[
follower
.
ap_id
],
...
...
@@ -522,7 +526,7 @@ def handle_incoming(
{
:ok
,
follow_activity
}
<-
get_follow_activity
(
follow_object
,
followed
),
{
:ok
,
follow_activity
}
<-
Utils
.
update_follow_state_for_all
(
follow_activity
,
"accept"
),
%
User
{
local:
true
}
=
follower
<-
User
.
get_cached_by_ap_id
(
follow_activity
.
data
[
"actor"
]),
{
:ok
,
_
follower
}
=
User
.
follow
(
follower
,
followed
)
do
{
:ok
,
_
relationship
}
<-
FollowingRelationship
.
update
(
follower
,
followed
,
"accept"
)
do
ActivityPub
.
accept
(%{
to:
follow_activity
.
data
[
"to"
],
type:
"Accept"
,
...
...
@@ -544,6 +548,7 @@ def handle_incoming(
{
:ok
,
follow_activity
}
<-
get_follow_activity
(
follow_object
,
followed
),
{
:ok
,
follow_activity
}
<-
Utils
.
update_follow_state_for_all
(
follow_activity
,
"reject"
),
%
User
{
local:
true
}
=
follower
<-
User
.
get_cached_by_ap_id
(
follow_activity
.
data
[
"actor"
]),
{
:ok
,
_relationship
}
<-
FollowingRelationship
.
update
(
follower
,
followed
,
"reject"
),
{
:ok
,
activity
}
<-
ActivityPub
.
reject
(%{
to:
follow_activity
.
data
[
"to"
],
...
...
@@ -552,8 +557,6 @@ def handle_incoming(
object:
follow_activity
.
data
[
"id"
],
local:
false
})
do
User
.
unfollow
(
follower
,
followed
)
{
:ok
,
activity
}
else
_e
->
:error
...
...
@@ -1050,46 +1053,24 @@ defp strip_internal_tags(object), do: object
def
perform
(
:user_upgrade
,
user
)
do
# we pass a fake user so that the followers collection is stripped away
old_follower_address
=
User
.
ap_followers
(%
User
{
nickname:
user
.
nickname
})
q
=
from
(
u
in
User
,
where:
^
old_follower_address
in
u
.
following
,
update:
[
set:
[
following:
fragment
(
"array_replace(?,?,?)"
,
u
.
following
,
^
old_follower_address
,
^
user
.
follower_address
)
]
]
)
Repo
.
update_all
(
q
,
[])
maybe_retire_websub
(
user
.
ap_id
)
q
=
from
(
a
in
Activity
,
where:
^
old_follower_address
in
a
.
recipients
,
update:
[
set:
[
recipients:
fragment
(
"array_replace(?,?,?)"
,
a
.
recipients
,
^
old_follower_address
,
^
user
.
follower_address
)
]
from
(
a
in
Activity
,
where:
^
old_follower_address
in
a
.
recipients
,
update:
[
set:
[
recipients:
fragment
(
"array_replace(?,?,?)"
,
a
.
recipients
,
^
old_follower_address
,
^
user
.
follower_address
)
]
)
Repo
.
update_all
(
q
,
[])
]
)
|>
Repo
.
update_all
([])
end
def
upgrade_user_from_ap_id
(
ap_id
)
do
...
...
lib/pleroma/web/activity_pub/visibility.ex
View file @
059005ff
...
...
@@ -58,7 +58,7 @@ def visible_for_user?(activity, nil) do
end
def
visible_for_user?
(
activity
,
user
)
do
x
=
[
user
.
ap_id
|
u
ser
.
following
]
x
=
[
user
.
ap_id
|
U
ser
.
following
(
user
)
]
y
=
[
activity
.
actor
]
++
activity
.
data
[
"to"
]
++
(
activity
.
data
[
"cc"
]
||
[])
visible_for_user?
(
activity
,
nil
)
||
Enum
.
any?
(
x
,
&
(
&1
in
y
))
end
...
...
lib/pleroma/web/common_api/common_api.ex
View file @
059005ff
...
...
@@ -6,6 +6,7 @@ defmodule Pleroma.Web.CommonAPI do
alias
Pleroma
.
Activity
alias
Pleroma
.
ActivityExpiration
alias
Pleroma
.
Conversation
.
Participation
alias
Pleroma
.
FollowingRelationship
alias
Pleroma
.
Object
alias
Pleroma
.
ThreadMute
alias
Pleroma
.
User
...
...
@@ -40,6 +41,7 @@ def accept_follow_request(follower, followed) do
with
{
:ok
,
follower
}
<-
User
.
follow
(
follower
,
followed
),
%
Activity
{}
=
follow_activity
<-
Utils
.
fetch_latest_follow
(
follower
,
followed
),
{
:ok
,
follow_activity
}
<-
Utils
.
update_follow_state_for_all
(
follow_activity
,
"accept"
),
{
:ok
,
_relationship
}
<-
FollowingRelationship
.
update
(
follower
,
followed
,
"accept"
),
{
:ok
,
_activity
}
<-
ActivityPub
.
accept
(%{
to:
[
follower
.
ap_id
],
...
...
@@ -54,6 +56,7 @@ def accept_follow_request(follower, followed) do
def
reject_follow_request
(
follower
,
followed
)
do
with
%
Activity
{}
=
follow_activity
<-
Utils
.
fetch_latest_follow
(
follower
,
followed
),
{
:ok
,
follow_activity
}
<-
Utils
.
update_follow_state_for_all
(
follow_activity
,
"reject"
),
{
:ok
,
_relationship
}
<-
FollowingRelationship
.
update
(
follower
,
followed
,
"reject"
),
{
:ok
,
_activity
}
<-
ActivityPub
.
reject
(%{
to:
[
follower
.
ap_id
],
...
...
lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex
View file @
059005ff
...
...
@@ -10,6 +10,7 @@ defmodule Pleroma.Web.MastodonAPI.TimelineController do
alias
Pleroma
.
Pagination