From c9e096d05ef8d6ee2da6bb1424c4d2b68d48e67e Mon Sep 17 00:00:00 2001 From: mydearxym Date: Fri, 26 Mar 2021 14:21:30 +0800 Subject: [PATCH 1/5] refactor(article): add basic default meta map to post --- .../cms/delegates/article_curd.ex | 7 ++++ .../cms/delegates/article_operation.ex | 23 ++++++++++++ lib/groupher_server/cms/post.ex | 4 ++- mix.exs | 2 +- .../20210324064013_add_meta_to_posts.exs | 9 +++++ test/groupher_server/cms/post_meta_test.exs | 36 +++++++++++++++++++ .../editor_to_html_test/image_test.exs | 12 +++---- .../editor_to_html_test/people_test.exs | 4 +-- 8 files changed, 87 insertions(+), 10 deletions(-) create mode 100644 priv/repo/migrations/20210324064013_add_meta_to_posts.exs create mode 100644 test/groupher_server/cms/post_meta_test.exs diff --git a/lib/groupher_server/cms/delegates/article_curd.ex b/lib/groupher_server/cms/delegates/article_curd.ex index 61a97df56..8ea5469fb 100644 --- a/lib/groupher_server/cms/delegates/article_curd.ex +++ b/lib/groupher_server/cms/delegates/article_curd.ex @@ -74,6 +74,9 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do |> Multi.run(:set_community, fn _, %{create_content: content} -> ArticleOperation.set_community(community, thread, content.id) end) + |> Multi.run(:set_meta, fn _, %{create_content: content} -> + ArticleOperation.set_meta(thread, content.id) + end) |> Multi.run(:set_topic, fn _, %{create_content: content} -> exec_set_topic(thread, content.id, attrs) end) @@ -407,6 +410,10 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do {:error, [message: "set community", code: ecode(:create_fails)]} end + defp create_content_result({:error, :set_meta, _result, _steps}) do + {:error, [message: "set meta info", code: ecode(:create_fails)]} + end + defp create_content_result({:error, :set_community_flag, _result, _steps}) do {:error, [message: "set community flag", code: ecode(:create_fails)]} end diff --git a/lib/groupher_server/cms/delegates/article_operation.ex b/lib/groupher_server/cms/delegates/article_operation.ex index d01431619..22fd4c954 100644 --- a/lib/groupher_server/cms/delegates/article_operation.ex +++ b/lib/groupher_server/cms/delegates/article_operation.ex @@ -29,6 +29,22 @@ defmodule GroupherServer.CMS.Delegate.ArticleOperation do alias GroupherServer.CMS.Repo, as: CMSRepo alias GroupherServer.Repo + @default_article_meta %{ + isEdited: false, + forbidComment: false, + isReported: false + # linkedPostsCount: 0, + # linkedJobsCount: 0, + # linkedWorksCount: 0, + # reaction: %{ + # rocketCount: 0, + # heartCount: 0, + # } + } + + @doc "for test usage" + def default_article_meta(), do: @default_article_meta + def pin_content(%Post{id: post_id}, %Community{id: community_id}, topic) do with {:ok, %{id: topic_id}} <- ORM.find_by(Topic, %{raw: topic}), {:ok, pined} <- @@ -277,6 +293,13 @@ defmodule GroupherServer.CMS.Delegate.ArticleOperation do def set_topic(_topic, _thread, _content_id), do: {:ok, :pass} + @doc "set meta info" + def set_meta(:post, content_id) do + ORM.update_by(Post, [id: content_id], %{meta: @default_article_meta}) + end + + def set_meta(_, _), do: {:ok, :pass} + # make sure the reuest tag is in the current community thread # example: you can't set a other thread tag to this thread's article diff --git a/lib/groupher_server/cms/post.ex b/lib/groupher_server/cms/post.ex index e4b7242d9..53e08b39f 100644 --- a/lib/groupher_server/cms/post.ex +++ b/lib/groupher_server/cms/post.ex @@ -23,7 +23,7 @@ defmodule GroupherServer.CMS.Post do @timestamps_opts [type: :utc_datetime_usec] @required_fields ~w(title body digest length)a - @optional_fields ~w(origial_community_id link_addr copy_right link_addr link_icon)a + @optional_fields ~w(origial_community_id link_addr copy_right link_addr link_icon meta)a @type t :: %Post{} schema "cms_posts" do @@ -36,6 +36,8 @@ defmodule GroupherServer.CMS.Post do field(:length, :integer) field(:views, :integer, default: 0) + field(:meta, :map) + has_many(:community_flags, {"posts_communities_flags", PostCommunityFlag}) # NOTE: this one is tricky, pin is dynamic changed when return by func: add_pin_contents_ifneed diff --git a/mix.exs b/mix.exs index d2eef50c0..1fcfd0076 100644 --- a/mix.exs +++ b/mix.exs @@ -62,7 +62,7 @@ defmodule GroupherServer.Mixfile do {:plug_cowboy, "~> 2.4.1"}, {:plug, "~> 1.11.0"}, # GraphQl tool - {:absinthe, "~> 1.6.1"}, + {:absinthe, "~> 1.6.2"}, # Plug support for Absinthe {:absinthe_plug, "~> 1.5.4"}, # Password hashing lib diff --git a/priv/repo/migrations/20210324064013_add_meta_to_posts.exs b/priv/repo/migrations/20210324064013_add_meta_to_posts.exs new file mode 100644 index 000000000..c99468520 --- /dev/null +++ b/priv/repo/migrations/20210324064013_add_meta_to_posts.exs @@ -0,0 +1,9 @@ +defmodule GroupherServer.Repo.Migrations.AddMetaToPosts do + use Ecto.Migration + + def change do + alter table(:cms_posts) do + add(:meta, :map) + end + end +end diff --git a/test/groupher_server/cms/post_meta_test.exs b/test/groupher_server/cms/post_meta_test.exs new file mode 100644 index 000000000..31ee82c4c --- /dev/null +++ b/test/groupher_server/cms/post_meta_test.exs @@ -0,0 +1,36 @@ +defmodule GroupherServer.Test.CMS.PostMeta do + use GroupherServer.TestTools + + alias Helper.ORM + alias GroupherServer.CMS + alias Helper.Utils + + @default_article_meta CMS.Delegate.ArticleOperation.default_article_meta() + + setup do + {:ok, user} = db_insert(:user) + # {:ok, post} = db_insert(:post) + {:ok, community} = db_insert(:community) + + post_attrs = mock_attrs(:post, %{community_id: community.id}) + + {:ok, ~m(user community post_attrs)a} + end + + describe "[cms post meta info]" do + alias CMS.{Author, Community, Post} + + @tag :wip2 + test "can get default meta info", ~m(user community post_attrs)a do + assert {:error, _} = ORM.find_by(Author, user_id: user.id) + + {:ok, post} = CMS.create_content(community, :post, post_attrs, user) + {:ok, post} = ORM.find_by(Post, id: post.id) + + # IO.inspect(Utils.keys_to_atoms(post.meta), label: "get post") + # IO.inspect(@default_article_meta, label: "the fuck") + + assert @default_article_meta == Utils.keys_to_atoms(post.meta) + end + end +end diff --git a/test/helper/converter/editor_to_html_test/image_test.exs b/test/helper/converter/editor_to_html_test/image_test.exs index 88d0e1a50..b23f8bb34 100644 --- a/test/helper/converter/editor_to_html_test/image_test.exs +++ b/test/helper/converter/editor_to_html_test/image_test.exs @@ -29,7 +29,7 @@ defmodule GroupherServer.Test.Helper.Converter.EditorToHTML.Image do } end - @tag :wip2 + @tag :wip test "single image parse should work" do editor_json = set_items("single", [ @@ -58,7 +58,7 @@ defmodule GroupherServer.Test.Helper.Converter.EditorToHTML.Image do assert Utils.str_occurence(converted, "this is a caption") == 2 end - @tag :wip2 + @tag :wip test "single image parse should work without wight && height" do editor_json = set_items("single", [ @@ -81,7 +81,7 @@ defmodule GroupherServer.Test.Helper.Converter.EditorToHTML.Image do assert Utils.str_occurence(converted, single_image_wrapper_class) == 1 end - @tag :wip2 + @tag :wip test "single image parse should work without caption" do editor_json = set_items("single", [ @@ -106,7 +106,7 @@ defmodule GroupherServer.Test.Helper.Converter.EditorToHTML.Image do assert Utils.str_occurence(converted, image_caption_class) == 0 end - @tag :wip2 + @tag :wip test "jiugongge image parse should work" do editor_json = set_items( @@ -132,7 +132,7 @@ defmodule GroupherServer.Test.Helper.Converter.EditorToHTML.Image do assert Utils.str_occurence(converted, jiugongge_image_class) == length(mock_images(9)) end - @tag :wip2 + @tag :wip test "gallery image parse should work" do editor_json = set_items( @@ -158,7 +158,7 @@ defmodule GroupherServer.Test.Helper.Converter.EditorToHTML.Image do assert Utils.str_occurence(converted, gallery_mini_image_class) == length(mock_images(9)) end - @tag :wip2 + @tag :wip test "edit exsit block will not change id value" do editor_json = set_items( diff --git a/test/helper/converter/editor_to_html_test/people_test.exs b/test/helper/converter/editor_to_html_test/people_test.exs index e9c90cc6f..8ac392959 100644 --- a/test/helper/converter/editor_to_html_test/people_test.exs +++ b/test/helper/converter/editor_to_html_test/people_test.exs @@ -29,7 +29,7 @@ defmodule GroupherServer.Test.Helper.Converter.EditorToHTML.People do } end - @tag :wip2 + @tag :wip test "multi people should have previewer" do editor_json = set_items("gallery", [ @@ -78,7 +78,7 @@ defmodule GroupherServer.Test.Helper.Converter.EditorToHTML.People do assert Utils.str_occurence(converted, mock_image()) == 4 end - @tag :wip2 + @tag :wip test "one people should not have previewer bar" do editor_json = set_items("gallery", [ From b64840ac9e6fdba8471a71a40814e5b4f9c0332c Mon Sep 17 00:00:00 2001 From: mydearxym Date: Fri, 26 Mar 2021 16:55:13 +0800 Subject: [PATCH 2/5] refactor(post-meta): basic isEdited logic --- .../cms/delegates/article_curd.ex | 18 ++++++++++++------ .../cms/delegates/article_operation.ex | 11 +++++++++++ test/groupher_server/cms/post_meta_test.exs | 13 +++++++++++++ test/groupher_server/cms/post_test.exs | 2 +- 4 files changed, 37 insertions(+), 7 deletions(-) diff --git a/lib/groupher_server/cms/delegates/article_curd.ex b/lib/groupher_server/cms/delegates/article_curd.ex index 8ea5469fb..39e427885 100644 --- a/lib/groupher_server/cms/delegates/article_curd.ex +++ b/lib/groupher_server/cms/delegates/article_curd.ex @@ -130,8 +130,12 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do |> Multi.run(:update_content, fn _, _ -> ORM.update(content, args) end) + |> Multi.run(:update_meta, fn _, _ -> + ArticleOperation.update_meta(content, :is_edited) + end) |> Multi.run(:update_tag, fn _, _ -> - exec_update_tags(content, args.tags) + # TODO: move it to ArticleOperation moudel + exec_update_tags(content, args) end) |> Repo.transaction() |> update_content_result() @@ -430,9 +434,6 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do {:error, [message: "log action", code: ecode(:create_fails)]} end - # except Job, other content will just pass, should use set_tag function instead - # defp exec_update_tags(_, _tags_ids), do: {:ok, :pass} - defp update_content_result({:ok, %{update_content: result}}), do: {:ok, result} defp update_content_result({:error, :update_content, result, _steps}), do: {:error, result} defp update_content_result({:error, :update_tag, result, _steps}), do: {:error, result} @@ -486,9 +487,12 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do {:ok, :pass} end - defp exec_update_tags(_content, tags_ids) when length(tags_ids) == 0, do: {:ok, :pass} + # except Job, other content will just pass, should use set_tag function instead + # defp exec_update_tags(_, _tags_ids), do: {:ok, :pass} - defp exec_update_tags(content, tags_ids) do + defp exec_update_tags(_content, %{tags: tags_ids}) when tags_ids == [], do: {:ok, :pass} + + defp exec_update_tags(content, %{tags: tags_ids}) do with {:ok, content} <- ORM.find(content.__struct__, content.id, preload: :tags) do tags = Enum.reduce(tags_ids, [], fn t, acc -> @@ -509,4 +513,6 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do |> Repo.update() end end + + defp exec_update_tags(_content, _), do: {:ok, :pass} end diff --git a/lib/groupher_server/cms/delegates/article_operation.ex b/lib/groupher_server/cms/delegates/article_operation.ex index 22fd4c954..e45b81992 100644 --- a/lib/groupher_server/cms/delegates/article_operation.ex +++ b/lib/groupher_server/cms/delegates/article_operation.ex @@ -300,6 +300,17 @@ defmodule GroupherServer.CMS.Delegate.ArticleOperation do def set_meta(_, _), do: {:ok, :pass} + @doc "update isEdited meta label if needed" + def update_meta(%Post{meta: %{"isEdited" => false} = meta} = content, :is_edited) do + ORM.update(content, %{meta: Map.merge(meta, %{"isEdited" => true})}) + end + + def update_meta(%Post{meta: nil} = content, :is_edited) do + ORM.update(content, %{meta: Map.merge(@default_article_meta, %{"isEdited" => true})}) + end + + def update_meta(_, _), do: {:ok, :pass} + # make sure the reuest tag is in the current community thread # example: you can't set a other thread tag to this thread's article diff --git a/test/groupher_server/cms/post_meta_test.exs b/test/groupher_server/cms/post_meta_test.exs index 31ee82c4c..0a81a4617 100644 --- a/test/groupher_server/cms/post_meta_test.exs +++ b/test/groupher_server/cms/post_meta_test.exs @@ -32,5 +32,18 @@ defmodule GroupherServer.Test.CMS.PostMeta do assert @default_article_meta == Utils.keys_to_atoms(post.meta) end + + @tag :wip2 + test "isEdited flag should set to true after post updated", ~m(user community post_attrs)a do + {:ok, post} = CMS.create_content(community, :post, post_attrs, user) + {:ok, post} = ORM.find_by(Post, id: post.id) + + assert post.meta["isEdited"] == false + + {:ok, _} = CMS.update_content(post, %{"title" => "new title"}) + {:ok, post} = ORM.find_by(Post, id: post.id) + + assert post.meta["isEdited"] == true + end end end diff --git a/test/groupher_server/cms/post_test.exs b/test/groupher_server/cms/post_test.exs index 1ce0187c1..71556f163 100644 --- a/test/groupher_server/cms/post_test.exs +++ b/test/groupher_server/cms/post_test.exs @@ -66,7 +66,7 @@ defmodule GroupherServer.Test.CMS.Post do assert author.user_id == user.id end - test "create post with an exsit community fails", ~m(user)a do + test "create post with an non-exsit community fails", ~m(user)a do invalid_attrs = mock_attrs(:post, %{community_id: non_exsit_id()}) ivalid_community = %Community{id: non_exsit_id()} From ea02dbce5c9efe3e93d1f2533e0095ee780a4c2e Mon Sep 17 00:00:00 2001 From: mydearxym Date: Tue, 30 Mar 2021 13:56:02 +0800 Subject: [PATCH 3/5] refactor(post-meta): basic frontend(GQL) workflow --- .../cms/delegates/article_curd.ex | 2 +- .../resolvers/cms_resolver.ex | 21 ++++++++++---- .../schema/cms/cms_types.ex | 25 ++++++++++++++++ lib/helper/utils.ex | 29 +++++++++++++++++-- test/groupher_server/cms/post_meta_test.exs | 13 +++++---- .../mutation/cms/post_test.exs | 19 ++++++++++++ .../query/cms/post_test.exs | 21 ++++++++++++-- 7 files changed, 113 insertions(+), 17 deletions(-) diff --git a/lib/groupher_server/cms/delegates/article_curd.ex b/lib/groupher_server/cms/delegates/article_curd.ex index 39e427885..e9f2a6471 100644 --- a/lib/groupher_server/cms/delegates/article_curd.ex +++ b/lib/groupher_server/cms/delegates/article_curd.ex @@ -434,7 +434,7 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do {:error, [message: "log action", code: ecode(:create_fails)]} end - defp update_content_result({:ok, %{update_content: result}}), do: {:ok, result} + defp update_content_result({:ok, %{update_meta: result}}), do: {:ok, result} defp update_content_result({:error, :update_content, result, _steps}), do: {:error, result} defp update_content_result({:error, :update_tag, result, _steps}), do: {:error, result} diff --git a/lib/groupher_server_web/resolvers/cms_resolver.ex b/lib/groupher_server_web/resolvers/cms_resolver.ex index f0d083e54..fd38a8812 100644 --- a/lib/groupher_server_web/resolvers/cms_resolver.ex +++ b/lib/groupher_server_web/resolvers/cms_resolver.ex @@ -11,6 +11,7 @@ defmodule GroupherServerWeb.Resolvers.CMS do alias CMS.{Post, Video, Repo, Job, Community, Category, Tag, Thread} alias Helper.ORM + alias Helper.Utils # ####################### # community .. @@ -102,12 +103,8 @@ defmodule GroupherServerWeb.Resolvers.CMS do CMS.create_content(%Community{id: community_id}, thread, args, user) end - def update_content(_root, %{passport_source: content, tags: _tags} = args, _info) do - CMS.update_content(content, args) - end - def update_content(_root, %{passport_source: content} = args, _info) do - ORM.update(content, args) + CMS.update_content(content, args) end def delete_content(_root, %{passport_source: content}, _info), do: ORM.delete(content) @@ -445,4 +442,18 @@ defmodule GroupherServerWeb.Resolvers.CMS do def tags_count(root, _, _) do CMS.count(%Community{id: root.id}, :tags) end + + @doc """ + covert normal map to absinthe fmt + e.g: + %{"exampleKey" => false } -> %{example_key: false } + """ + def get_article_meta(root, _, _) do + meta_info = + root.meta + |> Utils.snake_map_key() + |> Utils.keys_to_atoms() + + {:ok, meta_info} + end end diff --git a/lib/groupher_server_web/schema/cms/cms_types.ex b/lib/groupher_server_web/schema/cms/cms_types.ex index 3a1e64ef6..971635308 100644 --- a/lib/groupher_server_web/schema/cms/cms_types.ex +++ b/lib/groupher_server_web/schema/cms/cms_types.ex @@ -39,6 +39,16 @@ defmodule GroupherServerWeb.Schema.CMS.Types do field(:communities, list_of(:community), resolve: dataloader(CMS, :communities)) # field(:topic) + # article meta info + field(:meta, :article_meta) do + # NOTE: absinthe has issue with :map resolving, do it mannulay + resolve(&R.CMS.get_article_meta/3) + end + + # field :meta, :article_meta do + # resolve(&R.CMS.get_meta/3) + # end + field :comments, list_of(:comment) do arg(:filter, :members_filter) @@ -448,4 +458,19 @@ defmodule GroupherServerWeb.Schema.CMS.Types do field(:entries, list_of(:thread)) pagination_fields() end + + @desc "article meta info" + object :article_meta do + field(:is_edited, :boolean) + field(:forbid_comment, :boolean) + # field(:isReported, :boolean) + # field(:linked_posts_count, :integer) + # field(:linked_jobs_count, :integer) + # field(:linked_works_count, :integer) + + # reaction: %{ + # rocketCount: 0, + # heartCount: 0, + # } + end end diff --git a/lib/helper/utils.ex b/lib/helper/utils.ex index dc2a80580..18d0c464c 100644 --- a/lib/helper/utils.ex +++ b/lib/helper/utils.ex @@ -107,12 +107,13 @@ defmodule Helper.Utils do def keys_to_atoms(string) when is_binary(string), do: string def reduce_keys_to_atoms({key, val}) when is_map(val), - do: {String.to_existing_atom(key), keys_to_atoms(val)} + # do: {String.to_existing_atom(key), keys_to_atoms(val)} + do: {String.to_atom(key), keys_to_atoms(val)} def reduce_keys_to_atoms({key, val}) when is_list(val), - do: {String.to_existing_atom(key), Enum.map(val, &keys_to_atoms(&1))} + do: {String.to_atom(key), Enum.map(val, &keys_to_atoms(&1))} - def reduce_keys_to_atoms({key, val}), do: {String.to_existing_atom(key), val} + def reduce_keys_to_atoms({key, val}), do: {String.to_atom(key), val} @doc """ see https://stackoverflow.com/a/61559842/4050784 @@ -168,6 +169,28 @@ defmodule Helper.Utils do defp map_to_camel({k, v}), do: {Recase.to_camel(to_string(k)), v} + @spec snake_map_key(map) :: map + def snake_map_key(map) do + map_list = + Enum.map(map, fn {k, v} -> + v = + cond do + is_datetime?(v) -> + DateTime.to_iso8601(v) + + is_map(v) -> + snake_map_key(safe_map(v)) + + true -> + v + end + + {Recase.to_snake(to_string(k)), v} + end) + + Enum.into(map_list, %{}) + end + def is_datetime?(%DateTime{}), do: true def is_datetime?(_), do: false diff --git a/test/groupher_server/cms/post_meta_test.exs b/test/groupher_server/cms/post_meta_test.exs index 0a81a4617..65e6f5e97 100644 --- a/test/groupher_server/cms/post_meta_test.exs +++ b/test/groupher_server/cms/post_meta_test.exs @@ -20,20 +20,17 @@ defmodule GroupherServer.Test.CMS.PostMeta do describe "[cms post meta info]" do alias CMS.{Author, Community, Post} - @tag :wip2 + @tag :wip test "can get default meta info", ~m(user community post_attrs)a do assert {:error, _} = ORM.find_by(Author, user_id: user.id) {:ok, post} = CMS.create_content(community, :post, post_attrs, user) {:ok, post} = ORM.find_by(Post, id: post.id) - # IO.inspect(Utils.keys_to_atoms(post.meta), label: "get post") - # IO.inspect(@default_article_meta, label: "the fuck") - assert @default_article_meta == Utils.keys_to_atoms(post.meta) end - @tag :wip2 + @tag :wip test "isEdited flag should set to true after post updated", ~m(user community post_attrs)a do {:ok, post} = CMS.create_content(community, :post, post_attrs, user) {:ok, post} = ORM.find_by(Post, id: post.id) @@ -45,5 +42,11 @@ defmodule GroupherServer.Test.CMS.PostMeta do assert post.meta["isEdited"] == true end + + # test "post with image should have imageCount in meta" do + # end + + # test "post with video should have imageCount in meta" do + # end end end diff --git a/test/groupher_server_web/mutation/cms/post_test.exs b/test/groupher_server_web/mutation/cms/post_test.exs index 10d8040d4..0e1adc9f8 100644 --- a/test/groupher_server_web/mutation/cms/post_test.exs +++ b/test/groupher_server_web/mutation/cms/post_test.exs @@ -193,6 +193,9 @@ defmodule GroupherServer.Test.Mutation.Post do title body copyRight + meta { + isEdited + } } } """ @@ -265,6 +268,22 @@ defmodule GroupherServer.Test.Mutation.Post do assert updated_post["copyRight"] == variables.copyRight end + @tag :wip2 + test "update post with valid attrs should have isEdited meta info update", + ~m(owner_conn post)a do + unique_num = System.unique_integer([:positive, :monotonic]) + + variables = %{ + id: post.id, + title: "updated title #{unique_num}", + body: "updated body #{unique_num}" + } + + updated_post = owner_conn |> mutation_result(@query, variables, "updatePost") + + assert true == updated_post["meta"]["isEdited"] + end + test "login user with auth passport update a post", ~m(post)a do belongs_community_title = post.communities |> List.first() |> Map.get(:title) diff --git a/test/groupher_server_web/query/cms/post_test.exs b/test/groupher_server_web/query/cms/post_test.exs index 87013b7be..b65f2a820 100644 --- a/test/groupher_server_web/query/cms/post_test.exs +++ b/test/groupher_server_web/query/cms/post_test.exs @@ -1,13 +1,20 @@ defmodule GroupherServer.Test.Query.Post do use GroupherServer.TestTools + alias Helper.ORM + alias GroupherServer.CMS + setup do + {:ok, user} = db_insert(:user) {:ok, post} = db_insert(:post) + {:ok, community} = db_insert(:community) guest_conn = simu_conn(:guest) user_conn = simu_conn(:user) - {:ok, ~m(user_conn guest_conn post)a} + post_attrs = mock_attrs(:post, %{community_id: community.id}) + + {:ok, ~m(user_conn guest_conn post user community post_attrs)a} end @query """ @@ -16,17 +23,25 @@ defmodule GroupherServer.Test.Query.Post do id title body + meta { + isEdited + } } } """ - test "basic graphql query on post with logined user", ~m(user_conn post)a do + # @tag :wip2 + test "basic graphql query on post with logined user", + ~m(user_conn community user post_attrs)a do + {:ok, post} = CMS.create_content(community, :post, post_attrs, user) + variables = %{id: post.id} results = user_conn |> query_result(@query, variables, "post") assert results["id"] == to_string(post.id) assert is_valid_kv?(results, "title", :string) assert is_valid_kv?(results, "body", :string) - assert length(Map.keys(results)) == 3 + assert %{"isEdited" => false} == results["meta"] + assert length(Map.keys(results)) == 4 end test "basic graphql query on post with stranger(unloged user)", ~m(guest_conn post)a do From 065d5b9f5930ad3b6ce1ed63bd28f3c72e965315 Mon Sep 17 00:00:00 2001 From: mydearxym Date: Tue, 30 Mar 2021 14:17:17 +0800 Subject: [PATCH 4/5] refactor(post-meta): fix update info not sync && warnings --- lib/groupher_server/cms/delegates/article_curd.ex | 4 ++-- lib/groupher_server/cms/delegates/article_operation.ex | 2 +- test/groupher_server/cms/post_meta_test.exs | 2 +- test/groupher_server_web/mutation/cms/job_test.exs | 2 ++ test/groupher_server_web/query/cms/post_test.exs | 1 - 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/groupher_server/cms/delegates/article_curd.ex b/lib/groupher_server/cms/delegates/article_curd.ex index e9f2a6471..2eee5125a 100644 --- a/lib/groupher_server/cms/delegates/article_curd.ex +++ b/lib/groupher_server/cms/delegates/article_curd.ex @@ -130,8 +130,8 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do |> Multi.run(:update_content, fn _, _ -> ORM.update(content, args) end) - |> Multi.run(:update_meta, fn _, _ -> - ArticleOperation.update_meta(content, :is_edited) + |> Multi.run(:update_meta, fn _, %{update_content: update_content} -> + ArticleOperation.update_meta(update_content, :is_edited) end) |> Multi.run(:update_tag, fn _, _ -> # TODO: move it to ArticleOperation moudel diff --git a/lib/groupher_server/cms/delegates/article_operation.ex b/lib/groupher_server/cms/delegates/article_operation.ex index e45b81992..6baece8ee 100644 --- a/lib/groupher_server/cms/delegates/article_operation.ex +++ b/lib/groupher_server/cms/delegates/article_operation.ex @@ -309,7 +309,7 @@ defmodule GroupherServer.CMS.Delegate.ArticleOperation do ORM.update(content, %{meta: Map.merge(@default_article_meta, %{"isEdited" => true})}) end - def update_meta(_, _), do: {:ok, :pass} + def update_meta(content, _), do: {:ok, content} # make sure the reuest tag is in the current community thread # example: you can't set a other thread tag to this thread's article diff --git a/test/groupher_server/cms/post_meta_test.exs b/test/groupher_server/cms/post_meta_test.exs index 65e6f5e97..8fb77880a 100644 --- a/test/groupher_server/cms/post_meta_test.exs +++ b/test/groupher_server/cms/post_meta_test.exs @@ -18,7 +18,7 @@ defmodule GroupherServer.Test.CMS.PostMeta do end describe "[cms post meta info]" do - alias CMS.{Author, Community, Post} + alias CMS.{Author, Post} @tag :wip test "can get default meta info", ~m(user community post_attrs)a do diff --git a/test/groupher_server_web/mutation/cms/job_test.exs b/test/groupher_server_web/mutation/cms/job_test.exs index 054ef0621..908fc1b27 100644 --- a/test/groupher_server_web/mutation/cms/job_test.exs +++ b/test/groupher_server_web/mutation/cms/job_test.exs @@ -170,6 +170,7 @@ defmodule GroupherServer.Test.Mutation.Job do } } """ + @tag :wip2 test "update a job without login user fails", ~m(guest_conn job)a do unique_num = System.unique_integer([:positive, :monotonic]) @@ -218,6 +219,7 @@ defmodule GroupherServer.Test.Mutation.Job do assert updated["tags"] |> Enum.any?(&(&1["id"] == to_string(tag.id))) end + @tag :wip2 test "update job tags will replace old city-tags", ~m(owner_conn user job)a do unique_num = System.unique_integer([:positive, :monotonic]) diff --git a/test/groupher_server_web/query/cms/post_test.exs b/test/groupher_server_web/query/cms/post_test.exs index b65f2a820..c277073df 100644 --- a/test/groupher_server_web/query/cms/post_test.exs +++ b/test/groupher_server_web/query/cms/post_test.exs @@ -1,7 +1,6 @@ defmodule GroupherServer.Test.Query.Post do use GroupherServer.TestTools - alias Helper.ORM alias GroupherServer.CMS setup do From 759548857a81c079ad7af7552071e689b5315779 Mon Sep 17 00:00:00 2001 From: mydearxym Date: Tue, 30 Mar 2021 14:44:01 +0800 Subject: [PATCH 5/5] fix(post-meta): exsiting post has no meta --- lib/groupher_server_web/resolvers/cms_resolver.ex | 11 ++++++++--- test/groupher_server_web/mutation/cms/job_test.exs | 2 -- test/groupher_server_web/mutation/cms/post_test.exs | 1 - test/groupher_server_web/query/cms/post_test.exs | 1 + 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/lib/groupher_server_web/resolvers/cms_resolver.ex b/lib/groupher_server_web/resolvers/cms_resolver.ex index fd38a8812..efbe3d3f6 100644 --- a/lib/groupher_server_web/resolvers/cms_resolver.ex +++ b/lib/groupher_server_web/resolvers/cms_resolver.ex @@ -13,6 +13,8 @@ defmodule GroupherServerWeb.Resolvers.CMS do alias Helper.ORM alias Helper.Utils + @default_article_meta CMS.Delegate.ArticleOperation.default_article_meta() + # ####################### # community .. # ####################### @@ -449,11 +451,14 @@ defmodule GroupherServerWeb.Resolvers.CMS do %{"exampleKey" => false } -> %{example_key: false } """ def get_article_meta(root, _, _) do - meta_info = - root.meta + # if meta is nil , means exsit article or test env (like: db_insert) + meta = if is_nil(root.meta), do: @default_article_meta, else: root.meta + + fmt_meta = + meta |> Utils.snake_map_key() |> Utils.keys_to_atoms() - {:ok, meta_info} + {:ok, fmt_meta} end end diff --git a/test/groupher_server_web/mutation/cms/job_test.exs b/test/groupher_server_web/mutation/cms/job_test.exs index 908fc1b27..054ef0621 100644 --- a/test/groupher_server_web/mutation/cms/job_test.exs +++ b/test/groupher_server_web/mutation/cms/job_test.exs @@ -170,7 +170,6 @@ defmodule GroupherServer.Test.Mutation.Job do } } """ - @tag :wip2 test "update a job without login user fails", ~m(guest_conn job)a do unique_num = System.unique_integer([:positive, :monotonic]) @@ -219,7 +218,6 @@ defmodule GroupherServer.Test.Mutation.Job do assert updated["tags"] |> Enum.any?(&(&1["id"] == to_string(tag.id))) end - @tag :wip2 test "update job tags will replace old city-tags", ~m(owner_conn user job)a do unique_num = System.unique_integer([:positive, :monotonic]) diff --git a/test/groupher_server_web/mutation/cms/post_test.exs b/test/groupher_server_web/mutation/cms/post_test.exs index 0e1adc9f8..815185a16 100644 --- a/test/groupher_server_web/mutation/cms/post_test.exs +++ b/test/groupher_server_web/mutation/cms/post_test.exs @@ -268,7 +268,6 @@ defmodule GroupherServer.Test.Mutation.Post do assert updated_post["copyRight"] == variables.copyRight end - @tag :wip2 test "update post with valid attrs should have isEdited meta info update", ~m(owner_conn post)a do unique_num = System.unique_integer([:positive, :monotonic]) diff --git a/test/groupher_server_web/query/cms/post_test.exs b/test/groupher_server_web/query/cms/post_test.exs index c277073df..b6b82b899 100644 --- a/test/groupher_server_web/query/cms/post_test.exs +++ b/test/groupher_server_web/query/cms/post_test.exs @@ -43,6 +43,7 @@ defmodule GroupherServer.Test.Query.Post do assert length(Map.keys(results)) == 4 end + @tag :wip2 test "basic graphql query on post with stranger(unloged user)", ~m(guest_conn post)a do variables = %{id: post.id} results = guest_conn |> query_result(@query, variables, "post")