Add unique index and unique constraint check, uniqueness test fails
authorKaren Konou <konoukaren@gmail.com>
Sat, 9 Feb 2019 19:52:11 +0000 (20:52 +0100)
committerKaren Konou <konoukaren@gmail.com>
Sat, 9 Feb 2019 19:52:11 +0000 (20:52 +0100)
lib/pleroma/web/thread_mute.ex
priv/repo/migrations/20190205114625_create_thread_mutes.exs
test/web/thread_mute_test.exs

index 146de0d804a1464863791acbca57182523a6a42a..b5bff86bebc616e327611c88e91cadb92b6775a1 100644 (file)
@@ -13,12 +13,22 @@ defmodule Pleroma.Web.ThreadMute do
     field(:context, :string)
   end
 
+  def changeset(mute, params \\ %{}) do
+    mute
+    |> Ecto.Changeset.cast(params, [:user_id, :context])
+    |> Ecto.Changeset.foreign_key_constraint(:user_id)
+    |> Ecto.Changeset.unique_constraint(:user_id, name: :unique_index)
+  end
+
   def add_mute(user, id) do
     activity = Activity.get_by_id(id)
     context = activity.data["context"]
-    mute = %Pleroma.Web.ThreadMute{user_id: user.id, context: context}
-    Repo.insert(mute)
-    {:ok, activity}
+    changeset = changeset(%Pleroma.Web.ThreadMute{}, %{user_id: user.id, context: context})
+
+    case Repo.insert(changeset) do
+      {:ok, _} -> {:ok, activity}
+      {:error, _} -> {:error, "conversation is already muted"}
+    end
   end
 
   def remove_mute(user, id) do
index b16f557f0b8082667b7e34992c376f372c476d22..8e9eccbae8b5592ecad540e7c0ea904e9ee465f5 100644 (file)
@@ -7,6 +7,6 @@ defmodule Pleroma.Repo.Migrations.CreateThreadMutes do
       add :context, :string
     end
     
-    create index(:thread_mutes, [:user_id])
+    create unique_index(:thread_mutes, [:user_id, :context], name: :unique_index)
   end
 end
index 119a06f5291cb1fbe435eeee39c90b146caf18c2..f3a24613c56f59690113e0aaf2a14cde7cf629f8 100644 (file)
@@ -18,17 +18,20 @@ defmodule Pleroma.Web.ThreadMuteTest do
     end
 
     test "add mute", %{user: user, activity: activity} do
-      id = activity.id
-      {:ok, _activity} = add_mute(user, id)
+      {:ok, _activity} = add_mute(user, activity.id)
       assert muted?(user, activity)
     end
 
     test "remove mute", %{user: user, activity: activity} do
-      id = activity.id
-
-      add_mute(user, id)
-      {:ok, _activity} = remove_mute(user, id)
+      add_mute(user, activity.id)
+      {:ok, _activity} = remove_mute(user, activity.id)
       refute muted?(user, activity)
     end
+
+    test "check that mutes can't be duplicate", %{user: user, activity: activity} do
+      add_mute(user, activity.id)
+      assert muted?(user, activity)
+      {:error, _} = add_mute(user, activity.id)
+    end
   end
 end