|> cast(params, [:bio, :name])
|> unique_constraint(:nickname)
|> validate_format(:nickname, ~r/^[a-zA-Z\d]+$/)
- |> validate_length(:bio, min: 1, max: 1000)
+ |> validate_length(:bio, max: 1000)
|> validate_length(:name, min: 1, max: 100)
end
+ def upgrade_changeset(struct, params \\ %{}) do
+ struct
+ |> cast(params, [:bio, :name, :info, :follower_address, :avatar])
+ |> unique_constraint(:nickname)
+ |> validate_format(:nickname, ~r/^[a-zA-Z\d]+$/)
+ |> validate_length(:bio, max: 5000)
+ |> validate_length(:name, max: 100)
+ end
+
def password_update_changeset(struct, params) do
changeset = struct
|> cast(params, [:password, :password_confirmation])
def register_changeset(struct, params \\ %{}) do
changeset = struct
|> cast(params, [:bio, :email, :name, :nickname, :password, :password_confirmation])
- |> validate_required([:bio, :email, :name, :nickname, :password, :password_confirmation])
+ |> validate_required([:email, :name, :nickname, :password, :password_confirmation])
|> validate_confirmation(:password)
|> unique_constraint(:email)
|> unique_constraint(:nickname)
|> validate_format(:nickname, ~r/^[a-zA-Z\d]+$/)
|> validate_format(:email, @email_regex)
- |> validate_length(:bio, min: 1, max: 1000)
+ |> validate_length(:bio, max: 1000)
|> validate_length(:name, min: 1, max: 100)
if changeset.valid? do
end
end
+ def invalidate_cache(user) do
+ Cachex.del(:user_cache, "ap_id:#{user.ap_id}")
+ Cachex.del(:user_cache, "nickname:#{user.nickname}")
+ end
+
def get_cached_by_ap_id(ap_id) do
key = "ap_id:#{ap_id}"
Cachex.get!(:user_cache, key, fallback: fn(_) -> get_by_ap_id(ap_id) end)
end
end
- # TODO: these queries could be more efficient if the type in postgresql wasn't map, but array.
def get_followers(%User{id: id, follower_address: follower_address}) do
q = from u in User,
- where: fragment("? @> ?", u.following, ^follower_address ),
+ where: ^follower_address in u.following,
where: u.id != ^id
{:ok, Repo.all(q)}
def update_follower_count(%User{} = user) do
follower_count_query = from u in User,
- where: fragment("? @> ?", u.following, ^user.follower_address),
+ where: ^user.follower_address in u.following,
where: u.id != ^user.id,
select: count(u.id)
update_and_set_cache(cs)
end
- def get_notified_from_activity(%Activity{data: %{"to" => to}}) do
+ def get_notified_from_activity(%Activity{recipients: to}) do
query = from u in User,
where: u.ap_id in ^to,
where: u.local == true
Repo.all(query)
end
- def get_recipients_from_activity(%Activity{data: %{"to" => to}}) do
+ def get_recipients_from_activity(%Activity{recipients: to}) do
query = from u in User,
where: u.ap_id in ^to,
- or_where: fragment("? \\\?| ?", u.following, ^to)
+ or_where: fragment("? && ?", u.following, ^to)
query = from u in query,
where: u.local == true
if user = get_by_ap_id(ap_id) do
user
else
- with {:ok, user} <- ActivityPub.make_user_from_ap_id(ap_id) do
- user
+ ap_try = ActivityPub.make_user_from_ap_id(ap_id)
+
+ case ap_try do
+ {:ok, user} -> user
+ _ ->
+ case OStatus.make_user(ap_id) do
+ {:ok, user} -> user
+ _ -> {:error, "Could not fetch by ap id"}
+ end
end
end
end
end
def ap_enabled?(%User{info: info}), do: info["ap_enabled"]
+ def ap_enabled?(_), do: false
end