From f8a651172a3814db43236d90c5ffbb395f1620e1 Mon Sep 17 00:00:00 2001 From: mydearxym Date: Thu, 24 Jun 2021 21:15:20 +0800 Subject: [PATCH 1/2] refactor: enhance delete article --- lib/groupher_server/cms/cms.ex | 4 +- .../cms/delegates/article_curd.ex | 52 +++++++++++-------- .../resolvers/cms_resolver.ex | 4 +- .../cms/articles/blog_test.exs | 3 +- .../groupher_server/cms/articles/job_test.exs | 3 +- .../cms/articles/post_test.exs | 3 +- 6 files changed, 41 insertions(+), 28 deletions(-) diff --git a/lib/groupher_server/cms/cms.ex b/lib/groupher_server/cms/cms.ex index 32d6ac2c6..5a5b9c422 100644 --- a/lib/groupher_server/cms/cms.ex +++ b/lib/groupher_server/cms/cms.ex @@ -92,8 +92,8 @@ defmodule GroupherServer.CMS do defdelegate mark_delete_article(thread, id), to: ArticleCURD defdelegate undo_mark_delete_article(thread, id), to: ArticleCURD - defdelegate remove_article(thread, id), to: ArticleCURD - defdelegate remove_article(thread, id, reason), to: ArticleCURD + defdelegate delete_article(article), to: ArticleCURD + defdelegate delete_article(article, reason), to: ArticleCURD defdelegate update_active_timestamp(thread, article), to: ArticleCURD defdelegate sink_article(thread, id), to: ArticleCURD diff --git a/lib/groupher_server/cms/delegates/article_curd.ex b/lib/groupher_server/cms/delegates/article_curd.ex index 8e99317f7..898d45fa7 100644 --- a/lib/groupher_server/cms/delegates/article_curd.ex +++ b/lib/groupher_server/cms/delegates/article_curd.ex @@ -7,7 +7,15 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do import GroupherServer.CMS.Helper.Matcher import Helper.Utils, - only: [done: 1, pick_by: 2, module_to_atom: 1, get_config: 2, ensure: 2, module_to_upcase: 1] + only: [ + done: 1, + pick_by: 2, + module_to_atom: 1, + get_config: 2, + ensure: 2, + module_to_upcase: 1, + thread_of_article: 1 + ] import GroupherServer.CMS.Delegate.Helper, only: [mark_viewer_emotion_states: 2] import Helper.ErrorCode @@ -328,26 +336,26 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do @doc """ remove article forever """ - def remove_article(thread, id, reason \\ @remove_article_hint) do - with {:ok, info} <- match(thread), - {:ok, article} <- ORM.find(info.model, id, preload: [:communities, [author: :user]]) do - Multi.new() - |> Multi.run(:remove_article, fn _, _ -> - article |> ORM.delete() - end) - |> Multi.run(:update_community_article_count, fn _, _ -> - CommunityCURD.update_community_count_field(article.communities, thread) - end) - |> Multi.run(:update_user_published_meta, fn _, _ -> - Accounts.update_published_states(article.author.user.id, thread) - end) - |> Multi.run(:delete_document, fn _, _ -> - Document.remove(thread, id) - end) - # TODO: notify author - |> Repo.transaction() - |> result() - end + def delete_article(article, reason \\ @remove_article_hint) do + article = Repo.preload(article, [:communities, [author: :user]]) + {:ok, thread} = thread_of_article(article) + + Multi.new() + |> Multi.run(:delete_article, fn _, _ -> + article |> ORM.delete() + end) + |> Multi.run(:update_community_article_count, fn _, _ -> + CommunityCURD.update_community_count_field(article.communities, thread) + end) + |> Multi.run(:update_user_published_meta, fn _, _ -> + Accounts.update_published_states(article.author.user.id, thread) + end) + |> Multi.run(:delete_document, fn _, _ -> + Document.remove(thread, article.id) + end) + # TODO: notify author + |> Repo.transaction() + |> result() end @spec ensure_author_exists(User.t()) :: {:ok, User.t()} @@ -497,7 +505,7 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do defp result({:ok, %{update_edit_status: result}}), do: {:ok, result} defp result({:ok, %{update_article: result}}), do: {:ok, result} - defp result({:ok, %{remove_article: result}}), do: {:ok, result} + defp result({:ok, %{delete_article: result}}), do: {:ok, result} # NOTE: for read article, order is import defp result({:ok, %{set_viewer_has_states: result}}), do: result |> done() defp result({:ok, %{update_article_meta: result}}), do: {:ok, result} diff --git a/lib/groupher_server_web/resolvers/cms_resolver.ex b/lib/groupher_server_web/resolvers/cms_resolver.ex index 7cf3fad7c..3fadf2bd4 100644 --- a/lib/groupher_server_web/resolvers/cms_resolver.ex +++ b/lib/groupher_server_web/resolvers/cms_resolver.ex @@ -73,7 +73,9 @@ defmodule GroupherServerWeb.Resolvers.CMS do CMS.update_article(article, args) end - def delete_article(_root, %{passport_source: content}, _info), do: ORM.delete(content) + def delete_article(_root, %{passport_source: article}, _info) do + CMS.delete_article(article) + end # ####################### # article actions diff --git a/test/groupher_server/cms/articles/blog_test.exs b/test/groupher_server/cms/articles/blog_test.exs index 83f97a162..928e2dc4a 100644 --- a/test/groupher_server/cms/articles/blog_test.exs +++ b/test/groupher_server/cms/articles/blog_test.exs @@ -168,12 +168,13 @@ defmodule GroupherServer.Test.Articles.Blog do assert article_doc.body == blog_doc.body end + @tag :wip test "delete blog should also delete related document", ~m(user community blog_attrs)a do {:ok, blog} = CMS.create_article(community, :blog, blog_attrs, user) {:ok, _article_doc} = ORM.find_by(ArticleDocument, %{article_id: blog.id, thread: "BLOG"}) {:ok, _blog_doc} = ORM.find_by(BlogDocument, %{blog_id: blog.id}) - CMS.remove_article(:blog, blog.id) + {:ok, _} = CMS.delete_article(blog) {:error, _} = ORM.find(Blog, blog.id) {:error, _} = ORM.find_by(ArticleDocument, %{article_id: blog.id, thread: "BLOG"}) diff --git a/test/groupher_server/cms/articles/job_test.exs b/test/groupher_server/cms/articles/job_test.exs index 8769c6cd9..505bd2404 100644 --- a/test/groupher_server/cms/articles/job_test.exs +++ b/test/groupher_server/cms/articles/job_test.exs @@ -169,12 +169,13 @@ defmodule GroupherServer.Test.Articles.Job do assert article_doc.body == job_doc.body end + @tag :wip test "delete job should also delete related document", ~m(user community job_attrs)a do {:ok, job} = CMS.create_article(community, :job, job_attrs, user) {:ok, _article_doc} = ORM.find_by(ArticleDocument, %{article_id: job.id, thread: "JOB"}) {:ok, _job_doc} = ORM.find_by(JobDocument, %{job_id: job.id}) - CMS.remove_article(:job, job.id) + {:ok, _} = CMS.delete_article(job) {:error, _} = ORM.find(Job, job.id) {:error, _} = ORM.find_by(ArticleDocument, %{article_id: job.id, thread: "JOB"}) diff --git a/test/groupher_server/cms/articles/post_test.exs b/test/groupher_server/cms/articles/post_test.exs index 9d98efc3a..459209ffe 100644 --- a/test/groupher_server/cms/articles/post_test.exs +++ b/test/groupher_server/cms/articles/post_test.exs @@ -203,12 +203,13 @@ defmodule GroupherServer.Test.CMS.Articles.Post do assert article_doc.body == post_doc.body end + @tag :wip test "delete post should also delete related document", ~m(user community post_attrs)a do {:ok, post} = CMS.create_article(community, :post, post_attrs, user) {:ok, _article_doc} = ORM.find_by(ArticleDocument, %{article_id: post.id, thread: "POST"}) {:ok, _post_doc} = ORM.find_by(PostDocument, %{post_id: post.id}) - CMS.remove_article(:post, post.id) + {:ok, _} = CMS.delete_article(post) {:error, _} = ORM.find(Post, post.id) {:error, _} = ORM.find_by(ArticleDocument, %{article_id: post.id, thread: "POST"}) From 3f5e07a4bbb88db9c0864881a10d91c14ba79b43 Mon Sep 17 00:00:00 2001 From: mydearxym Date: Thu, 24 Jun 2021 21:29:48 +0800 Subject: [PATCH 2/2] refactor: ignore delete document result --- lib/groupher_server/cms/delegates/article_curd.ex | 2 ++ test/groupher_server/cms/articles/blog_test.exs | 1 - test/groupher_server/cms/articles/job_test.exs | 1 - test/groupher_server/cms/articles/post_test.exs | 1 - 4 files changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/groupher_server/cms/delegates/article_curd.ex b/lib/groupher_server/cms/delegates/article_curd.ex index 898d45fa7..62c04c714 100644 --- a/lib/groupher_server/cms/delegates/article_curd.ex +++ b/lib/groupher_server/cms/delegates/article_curd.ex @@ -352,6 +352,8 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do end) |> Multi.run(:delete_document, fn _, _ -> Document.remove(thread, article.id) + # for those history & test setup case + {:ok, :pass} end) # TODO: notify author |> Repo.transaction() diff --git a/test/groupher_server/cms/articles/blog_test.exs b/test/groupher_server/cms/articles/blog_test.exs index 928e2dc4a..b3fdc4f6e 100644 --- a/test/groupher_server/cms/articles/blog_test.exs +++ b/test/groupher_server/cms/articles/blog_test.exs @@ -168,7 +168,6 @@ defmodule GroupherServer.Test.Articles.Blog do assert article_doc.body == blog_doc.body end - @tag :wip test "delete blog should also delete related document", ~m(user community blog_attrs)a do {:ok, blog} = CMS.create_article(community, :blog, blog_attrs, user) {:ok, _article_doc} = ORM.find_by(ArticleDocument, %{article_id: blog.id, thread: "BLOG"}) diff --git a/test/groupher_server/cms/articles/job_test.exs b/test/groupher_server/cms/articles/job_test.exs index 505bd2404..c05a6792a 100644 --- a/test/groupher_server/cms/articles/job_test.exs +++ b/test/groupher_server/cms/articles/job_test.exs @@ -169,7 +169,6 @@ defmodule GroupherServer.Test.Articles.Job do assert article_doc.body == job_doc.body end - @tag :wip test "delete job should also delete related document", ~m(user community job_attrs)a do {:ok, job} = CMS.create_article(community, :job, job_attrs, user) {:ok, _article_doc} = ORM.find_by(ArticleDocument, %{article_id: job.id, thread: "JOB"}) diff --git a/test/groupher_server/cms/articles/post_test.exs b/test/groupher_server/cms/articles/post_test.exs index 459209ffe..471c59e4f 100644 --- a/test/groupher_server/cms/articles/post_test.exs +++ b/test/groupher_server/cms/articles/post_test.exs @@ -203,7 +203,6 @@ defmodule GroupherServer.Test.CMS.Articles.Post do assert article_doc.body == post_doc.body end - @tag :wip test "delete post should also delete related document", ~m(user community post_attrs)a do {:ok, post} = CMS.create_article(community, :post, post_attrs, user) {:ok, _article_doc} = ORM.find_by(ArticleDocument, %{article_id: post.id, thread: "POST"})