diff --git a/app/controllers/related_contents_controller.rb b/app/controllers/related_contents_controller.rb index 5306fdb3058..2d8ecfa7e85 100644 --- a/app/controllers/related_contents_controller.rb +++ b/app/controllers/related_contents_controller.rb @@ -15,6 +15,8 @@ def create flash[:success] = t("related_content.success") elsif related_content.same_parent_and_child? flash[:error] = t("related_content.error_itself") + elsif related_content.duplicate? + flash[:error] = t("related_content.error_duplicate") else flash[:error] = t("related_content.error", url: Setting["url"]) end diff --git a/app/models/related_content.rb b/app/models/related_content.rb index 3b9074d32d1..5765dc8ef8a 100644 --- a/app/models/related_content.rb +++ b/app/models/related_content.rb @@ -35,6 +35,10 @@ def same_parent_and_child? parent_relationable == child_relationable end + def duplicate? + parent_relationable.relationed_contents.include?(child_relationable) + end + private def different_parent_and_child diff --git a/config/locales/en/general.yml b/config/locales/en/general.yml index 47616b616fb..83a67108591 100644 --- a/config/locales/en/general.yml +++ b/config/locales/en/general.yml @@ -927,6 +927,7 @@ en: help: "You can add links of %{models} inside of %{org}." submit: "Add" error: "Link not valid. Remember to start with %{url}." + error_duplicate: "The related content you are adding already exists." error_itself: "Link not valid. You cannot relate a content to itself." success: "You added a new related content" is_related: "Is it related content?" diff --git a/config/locales/es/general.yml b/config/locales/es/general.yml index 903e96d0701..3386c5f9785 100644 --- a/config/locales/es/general.yml +++ b/config/locales/es/general.yml @@ -927,6 +927,7 @@ es: help: "Puedes introducir cualquier enlace de %{models} que esté dentro de %{org}." submit: "Añadir" error: "Enlace no válido. Recuerda que debe empezar por %{url}." + error_duplicate: "El contenido relacionado que estás añadiendo ya existe." error_itself: "Enlace no válido. No se puede relacionar un contenido consigo mismo." success: "Has añadido un nuevo contenido relacionado" is_related: "¿Es contenido relacionado?" diff --git a/spec/shared/system/relationable.rb b/spec/shared/system/relationable.rb index 430e78408fa..f2a07da8580 100644 --- a/spec/shared/system/relationable.rb +++ b/spec/shared/system/relationable.rb @@ -117,6 +117,21 @@ end end + scenario "returns an error when the related content already exists" do + create(:related_content, parent_relationable: relationable, child_relationable: related1) + login_as(user) + visit relationable.url + + click_button "Add related content" + + within("#related_content") do + fill_in "url", with: url + related1.url.to_s + click_button "Add" + end + + expect(page).to have_content "The related content you are adding already exists." + end + scenario "related content can be scored positively" do related_content = create(:related_content, parent_relationable: relationable, child_relationable: related1, author: build(:user))