X-Git-Url: http://git.squeep.com/?a=blobdiff_plain;f=lib%2Fpleroma%2Flist.ex;h=a5b1cad680ddf20dc3eb23e5981917cfa765a840;hb=3589b30ddc9d0c23ca6f00264cff05e53be1b270;hp=657d42626aed33f3050e2fc1e516284225a2988e;hpb=a8369db4f222676040a072ceb0bde647ef237f14;p=akkoma diff --git a/lib/pleroma/list.ex b/lib/pleroma/list.ex index 657d42626..a5b1cad68 100644 --- a/lib/pleroma/list.ex +++ b/lib/pleroma/list.ex @@ -1,10 +1,19 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2019 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + defmodule Pleroma.List do use Ecto.Schema - import Ecto.{Changeset, Query} - alias Pleroma.{User, Repo} + + import Ecto.Query + import Ecto.Changeset + + alias Pleroma.Activity + alias Pleroma.Repo + alias Pleroma.User schema "lists" do - belongs_to(:user, Pleroma.User) + belongs_to(:user, User, type: Pleroma.FlakeId) field(:title, :string) field(:following, {:array, :string}, default: []) @@ -23,7 +32,7 @@ defmodule Pleroma.List do |> validate_required([:following]) end - def for_user(user, opts) do + def for_user(user, _opts) do query = from( l in Pleroma.List, @@ -35,7 +44,7 @@ defmodule Pleroma.List do Repo.all(query) end - def get(%{id: user_id} = _user, id) do + def get(id, %{id: user_id} = _user) do query = from( l in Pleroma.List, @@ -46,14 +55,48 @@ defmodule Pleroma.List do Repo.one(query) end - def get_following(%Pleroma.List{following: following} = list) do - q = from( - u in User, - where: u.follower_address in ^following - ) + def get_following(%Pleroma.List{following: following} = _list) do + q = + from( + u in User, + where: u.follower_address in ^following + ) + {:ok, Repo.all(q)} end + # Get lists the activity should be streamed to. + def get_lists_from_activity(%Activity{actor: ap_id}) do + actor = User.get_cached_by_ap_id(ap_id) + + query = + from( + l in Pleroma.List, + where: fragment("? && ?", l.following, ^[actor.follower_address]) + ) + + Repo.all(query) + end + + # Get lists to which the account belongs. + def get_lists_account_belongs(%User{} = owner, account_id) do + user = User.get_cached_by_id(account_id) + + query = + from( + l in Pleroma.List, + where: + l.user_id == ^owner.id and + fragment( + "? = ANY(?)", + ^user.follower_address, + l.following + ) + ) + + Repo.all(query) + end + def rename(%Pleroma.List{} = list, title) do list |> title_changeset(%{title: title}) @@ -65,7 +108,6 @@ defmodule Pleroma.List do Repo.insert(list) end - # TODO check that user is following followed def follow(%Pleroma.List{following: following} = list, %User{} = followed) do update_follows(list, %{following: Enum.uniq([followed.follower_address | following])}) end