diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/pleroma/conversation.ex | 11 | ||||
| -rw-r--r-- | lib/pleroma/conversation/participation.ex | 4 | ||||
| -rw-r--r-- | lib/pleroma/conversation/participation_recipient_ship.ex | 34 | ||||
| -rw-r--r-- | lib/pleroma/user.ex | 7 | 
4 files changed, 56 insertions, 0 deletions
| diff --git a/lib/pleroma/conversation.ex b/lib/pleroma/conversation.ex index bc97b39ca..fb0dfedca 100644 --- a/lib/pleroma/conversation.ex +++ b/lib/pleroma/conversation.ex @@ -4,6 +4,7 @@  defmodule Pleroma.Conversation do    alias Pleroma.Conversation.Participation +  alias Pleroma.Conversation.Participation.RecipientShip    alias Pleroma.Repo    alias Pleroma.User    use Ecto.Schema @@ -39,6 +40,15 @@ defmodule Pleroma.Conversation do      Repo.get_by(__MODULE__, ap_id: ap_id)    end +  def maybe_set_recipients(participation, activity) do +    participation = Repo.preload(participation, :recipients) + +    if participation.recipients |> Enum.empty?() do +      recipients = User.get_all_by_ap_id(activity.recipients) +      RecipientShip.create(recipients, participation) +    end +  end +    @doc """    This will    1. Create a conversation if there isn't one already @@ -60,6 +70,7 @@ defmodule Pleroma.Conversation do            {:ok, participation} =              Participation.create_for_user_and_conversation(user, conversation, opts) +          maybe_set_recipients(participation, activity)            participation          end) diff --git a/lib/pleroma/conversation/participation.ex b/lib/pleroma/conversation/participation.ex index 77b3f61e9..121efb671 100644 --- a/lib/pleroma/conversation/participation.ex +++ b/lib/pleroma/conversation/participation.ex @@ -5,6 +5,7 @@  defmodule Pleroma.Conversation.Participation do    use Ecto.Schema    alias Pleroma.Conversation +  alias Pleroma.Conversation.Participation.RecipientShip    alias Pleroma.Repo    alias Pleroma.User    alias Pleroma.Web.ActivityPub.ActivityPub @@ -17,6 +18,9 @@ defmodule Pleroma.Conversation.Participation do      field(:read, :boolean, default: false)      field(:last_activity_id, Pleroma.FlakeId, virtual: true) +    has_many(:recipient_ships, RecipientShip) +    has_many(:recipients, through: [:recipient_ships, :user]) +      timestamps()    end diff --git a/lib/pleroma/conversation/participation_recipient_ship.ex b/lib/pleroma/conversation/participation_recipient_ship.ex new file mode 100644 index 000000000..27c0c89cd --- /dev/null +++ b/lib/pleroma/conversation/participation_recipient_ship.ex @@ -0,0 +1,34 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Conversation.Participation.RecipientShip do +  use Ecto.Schema + +  alias Pleroma.Conversation.Participation +  alias Pleroma.User +  alias Pleroma.Repo + +  import Ecto.Changeset + +  schema "conversation_participation_recipient_ships" do +    belongs_to(:user, User, type: Pleroma.FlakeId) +    belongs_to(:participation, Participation) +  end + +  def creation_cng(struct, params) do +    struct +    |> cast(params, [:user_id, :participation_id]) +    |> validate_required([:user_id, :participation_id]) +  end + +  def create(%User{} = user, participation), do: create([user], participation) + +  def create(users, participation) do +    Enum.each(users, fn user -> +      %__MODULE__{} +      |> creation_cng(%{user_id: user.id, participation_id: participation.id}) +      |> Repo.insert!() +    end) +  end +end diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 6e2fd3af8..a021e77f0 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -450,6 +450,13 @@ defmodule Pleroma.User do      Repo.get_by(User, ap_id: ap_id)    end +  def get_all_by_ap_id(ap_ids) do +    from(u in __MODULE__, +      where: u.ap_id in ^ap_ids +    ) +    |> Repo.all() +  end +    # This is mostly an SPC migration fix. This guesses the user nickname by taking the last part    # of the ap_id and the domain and tries to get that user    def get_by_guessed_nickname(ap_id) do | 
