Browse Source

Conversation: Add Conversations and Participations.

tags/v1.1.4
lain 5 years ago
parent
commit
d1da6b155a
6 changed files with 127 additions and 0 deletions
  1. +30
    -0
      lib/conversation.ex
  2. +31
    -0
      lib/conversation/participation.ex
  3. +26
    -0
      priv/repo/migrations/20190408123347_create_conversations.exs
  4. +22
    -0
      test/conversation/participation_test.exs
  5. +12
    -0
      test/conversation_test.exs
  6. +6
    -0
      test/support/factory.ex

+ 30
- 0
lib/conversation.ex View File

@@ -0,0 +1,30 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Conversation do
alias Pleroma.Repo
alias Pleroma.Conversation.Participation
use Ecto.Schema
import Ecto.Changeset

schema "conversations" do
field(:ap_id, :string)
has_many(:participations, Participation)

timestamps()
end

def creation_cng(struct, params) do
struct
|> cast(params, [:ap_id])
|> validate_required([:ap_id])
|> unique_constraint(:ap_id)
end

def create_for_ap_id(ap_id) do
%__MODULE__{}
|> creation_cng(%{ap_id: ap_id})
|> Repo.insert()
end
end

+ 31
- 0
lib/conversation/participation.ex View File

@@ -0,0 +1,31 @@
# 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 do
use Ecto.Schema
alias Pleroma.User
alias Pleroma.Conversation
alias Pleroma.Repo
import Ecto.Changeset

schema "conversation_participations" do
belongs_to(:user, User, type: Pleroma.FlakeId)
belongs_to(:conversation, Conversation)
field(:read, :boolean, default: false)

timestamps()
end

def creation_cng(struct, params) do
struct
|> cast(params, [:user_id, :conversation_id])
|> validate_required([:user_id, :conversation_id])
end

def create_for_user_and_conversation(user, conversation) do
%__MODULE__{}
|> creation_cng(%{user_id: user.id, conversation_id: conversation.id})
|> Repo.insert()
end
end

+ 26
- 0
priv/repo/migrations/20190408123347_create_conversations.exs View File

@@ -0,0 +1,26 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Repo.Migrations.CreateConversations do
use Ecto.Migration

def change do
create table(:conversations) do
add(:ap_id, :string, null: false)
timestamps()
end

create table(:conversation_participations) do
add(:user_id, references(:users, type: :uuid, on_delete: :delete_all))
add(:conversation_id, references(:conversations, on_delete: :delete_all))
add(:read, :boolean, default: false)

timestamps()
end

create index(:conversation_participations, [:user_id])
create index(:conversation_participations, [:conversation_id])
create unique_index(:conversations, [:ap_id])
end
end

+ 22
- 0
test/conversation/participation_test.exs View File

@@ -0,0 +1,22 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Conversation.ParticipationTest do
use Pleroma.DataCase

import Pleroma.Factory

alias Pleroma.Conversation.Participation

test "it creates a participation for a conversation and a user" do
user = insert(:user)
conversation = insert(:conversation)

{:ok, %Participation{} = participation} =
Participation.create_for_user_and_conversation(user, conversation)

assert participation.user_id == user.id
assert participation.conversation_id == conversation.id
end
end

+ 12
- 0
test/conversation_test.exs View File

@@ -0,0 +1,12 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.ConversationTest do
use Pleroma.DataCase
alias Pleroma.Conversation

test "it creates a conversation for given ap_id" do
assert {:ok, %Conversation{}} = Conversation.create_for_ap_id("https://some_ap_id")
end
end

+ 6
- 0
test/support/factory.ex View File

@@ -5,6 +5,12 @@
defmodule Pleroma.Factory do
use ExMachina.Ecto, repo: Pleroma.Repo

def conversation_factory do
%Pleroma.Conversation{
ap_id: sequence(:ap_id, &"https://some_conversation/#{&1}")
}
end

def user_factory do
user = %Pleroma.User{
name: sequence(:name, &"Test テスト User #{&1}"),


Loading…
Cancel
Save