Skip to content
GitLab
Menu
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
396c32a6
Commit
396c32a6
authored
Jul 19, 2017
by
lain
Browse files
Add follower_address to users, add on generation.
parent
7e9647b1
Changes
4
Hide whitespace changes
Inline
Side-by-side
lib/pleroma/user.ex
View file @
396c32a6
...
...
@@ -21,6 +21,7 @@ defmodule Pleroma.User do
field
:avatar
,
:map
field
:local
,
:boolean
,
default:
true
field
:info
,
:map
,
default:
%{}
field
:follower_address
,
:string
timestamps
()
end
...
...
@@ -58,7 +59,7 @@ def user_info(%User{} = user) do
select:
count
(
a
.
id
)
follower_count_query
=
from
u
in
User
,
where:
fragment
(
"? @> ?"
,
u
.
following
,
^
U
ser
.
ap_
follower
s
(
user
)
),
where:
fragment
(
"? @> ?"
,
u
.
following
,
^
u
ser
.
follower
_address
),
select:
count
(
u
.
id
)
%{
...
...
@@ -70,7 +71,7 @@ def user_info(%User{} = user) do
@email_regex
~r/^[a-zA-Z0-9.!#$%&'*+\/
=
?^
_
`
{
|
}
~
-
]
+
@
[
a
-
zA
-
Z0
-
9
](
?:
[
a
-
zA
-
Z0
-
9
-
]{
0
,
61
}[
a
-
zA
-
Z0
-
9
])
?(?:
\
.
[
a
-
zA
-
Z0
-
9
](
?:
[
a
-
zA
-
Z0
-
9
-
]{
0
,
61
}[
a
-
zA
-
Z0
-
9
])
?)
*
$
/
def
remote_user_creation
(
params
)
do
%
User
{}
changes
=
%
User
{}
|>
cast
(
params
,
[
:bio
,
:name
,
:ap_id
,
:nickname
,
:info
,
:avatar
])
|>
validate_required
([
:name
,
:ap_id
,
:nickname
])
|>
unique_constraint
(
:nickname
)
...
...
@@ -78,6 +79,13 @@ def remote_user_creation(params) do
|>
validate_length
(
:bio
,
max:
5000
)
|>
validate_length
(
:name
,
max:
100
)
|>
put_change
(
:local
,
false
)
if
changes
.
valid?
do
followers
=
User
.
ap_followers
(%
User
{
nickname:
changes
.
changes
[
:nickname
]})
changes
|>
put_change
(
:follower_address
,
followers
)
else
changes
end
end
def
register_changeset
(
struct
,
params
\\
%{})
do
...
...
@@ -100,13 +108,14 @@ def register_changeset(struct, params \\ %{}) do
|>
put_change
(
:password_hash
,
hashed
)
|>
put_change
(
:ap_id
,
ap_id
)
|>
put_change
(
:following
,
[
followers
])
|>
put_change
(
:follower_address
,
followers
)
else
changeset
end
end
def
follow
(%
User
{}
=
follower
,
%
User
{}
=
followed
)
do
ap_followers
=
User
.
ap_
followe
rs
(
followe
d
)
ap_followers
=
followe
d
.
followe
r_address
if
following?
(
follower
,
followed
)
do
{
:error
,
"Could not follow user:
#{
followed
.
nickname
}
is already on your list."
}
...
...
@@ -125,7 +134,7 @@ def follow(%User{} = follower, %User{} = followed) do
end
def
unfollow
(%
User
{}
=
follower
,
%
User
{}
=
followed
)
do
ap_followers
=
User
.
ap_
followe
rs
(
followe
d
)
ap_followers
=
followe
d
.
followe
r_address
if
following?
(
follower
,
followed
)
do
following
=
follower
.
following
|>
List
.
delete
(
ap_followers
)
...
...
@@ -140,7 +149,7 @@ def unfollow(%User{} = follower, %User{} = followed) do
end
def
following?
(%
User
{}
=
follower
,
%
User
{}
=
followed
)
do
Enum
.
member?
(
follower
.
following
,
User
.
ap_
followe
rs
(
followe
d
)
)
Enum
.
member?
(
follower
.
following
,
followe
d
.
followe
r_address
)
end
def
get_by_ap_id
(
ap_id
)
do
...
...
priv/repo/migrations/20170719152213_add_follower_address_to_user.exs
0 → 100644
View file @
396c32a6
defmodule
Pleroma
.
Repo
.
Migrations
.
AddFollowerAddressToUser
do
use
Ecto
.
Migration
import
Ecto
.
Query
import
Supervisor
.
Spec
alias
Pleroma
.
{
Repo
,
User
}
def
up
do
alter
table
(
:users
)
do
add
:follower_address
,
:string
,
unique:
true
end
flush
()
children
=
[
# Start the endpoint when the application starts
supervisor
(
Pleroma
.
Web
.
Endpoint
,
[])
]
opts
=
[
strategy:
:one_for_one
,
name:
Pleroma
.
Supervisor
]
Supervisor
.
start_link
(
children
,
opts
)
Enum
.
each
(
Repo
.
all
(
User
),
fn
(
user
)
->
if
!user
.
follower_address
do
cs
=
Ecto
.
Changeset
.
change
(
user
,
%{
follower_address:
User
.
ap_followers
(
user
)})
Repo
.
update!
(
cs
)
end
end
)
end
def
down
do
alter
table
(
:users
)
do
remove
:follower_address
end
end
end
test/support/factory.ex
View file @
396c32a6
...
...
@@ -9,7 +9,7 @@ def user_factory do
password_hash:
Comeonin
.
Pbkdf2
.
hashpwsalt
(
"test"
),
bio:
sequence
(
:bio
,
&
"Tester Number
#{
&1
}
"
),
}
%{
user
|
ap_id:
Pleroma
.
User
.
ap_id
(
user
)
}
%{
user
|
ap_id:
Pleroma
.
User
.
ap_id
(
user
)
,
follower_address:
Pleroma
.
User
.
ap_followers
(
user
)
}
end
def
note_factory
do
...
...
test/user_test.exs
View file @
396c32a6
...
...
@@ -103,6 +103,7 @@ test "it sets the password_hash, ap_id and following fields" do
assert
is_binary
(
changeset
.
changes
[
:password_hash
])
assert
changeset
.
changes
[
:ap_id
]
==
User
.
ap_id
(%
User
{
nickname:
@full_user_data
.
nickname
})
assert
changeset
.
changes
[
:following
]
==
[
User
.
ap_followers
(%
User
{
nickname:
@full_user_data
.
nickname
})]
assert
changeset
.
changes
.
follower_address
==
"
#{
changeset
.
changes
.
ap_id
}
/followers"
end
end
...
...
@@ -162,6 +163,12 @@ test "it confirms validity" do
assert
cs
.
valid?
end
test
"it sets the follower_adress"
do
cs
=
User
.
remote_user_creation
(
@valid_remote
)
# remote users get a fake local follower address
assert
cs
.
changes
.
follower_address
==
User
.
ap_followers
(%
User
{
nickname:
@valid_remote
[
:nickname
]
})
end
test
"it enforces the fqn format for nicknames"
do
cs
=
User
.
remote_user_creation
(%{
@valid_remote
|
nickname:
"bla"
})
assert
cs
.
changes
.
local
==
false
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment