diff --git a/lib/groupher_server/cms/delegates/article_curd.ex b/lib/groupher_server/cms/delegates/article_curd.ex index 589feaee1..71f791ddf 100644 --- a/lib/groupher_server/cms/delegates/article_curd.ex +++ b/lib/groupher_server/cms/delegates/article_curd.ex @@ -90,7 +90,7 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do with {:ok, info} <- match(thread) do info.model - |> domain_filter_query(filter) + |> QueryBuilder.domain_query(filter) |> QueryBuilder.filter_pack(Map.merge(filter, %{mark_delete: false})) |> ORM.paginater(~m(page size)a) |> add_pin_articles_ifneed(info.model, filter) @@ -103,7 +103,7 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do with {:ok, info} <- match(thread) do info.model - |> domain_filter_query(filter) + |> QueryBuilder.domain_query(filter) |> QueryBuilder.filter_pack(Map.merge(filter, %{mark_delete: false})) |> ORM.paginater(~m(page size)a) |> add_pin_articles_ifneed(info.model, filter) @@ -328,30 +328,6 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do ORM.find_by(Author, user_id: changeset.data.user_id) end - defp domain_filter_query(CMS.Repo = queryable, filter) do - Enum.reduce(filter, queryable, fn - {:sort, :most_github_star}, queryable -> - queryable |> order_by(desc: :star_count) - - {:sort, :most_github_fork}, queryable -> - queryable |> order_by(desc: :fork_count) - - {:sort, :most_github_watch}, queryable -> - queryable |> order_by(desc: :watch_count) - - {:sort, :most_github_pr}, queryable -> - queryable |> order_by(desc: :prs_count) - - {:sort, :most_github_issue}, queryable -> - queryable |> order_by(desc: :issues_count) - - {_, _}, queryable -> - queryable - end) - end - - defp domain_filter_query(queryable, _filter), do: queryable - defp add_pin_articles_ifneed(articles, querable, %{community: community} = filter) do thread = module_to_thread(querable) diff --git a/lib/groupher_server/cms/delegates/community_curd.ex b/lib/groupher_server/cms/delegates/community_curd.ex index 6351c25ce..4e1a77e35 100644 --- a/lib/groupher_server/cms/delegates/community_curd.ex +++ b/lib/groupher_server/cms/delegates/community_curd.ex @@ -277,7 +277,6 @@ defmodule GroupherServer.CMS.Delegate.CommunityCURD do |> join(:inner, [member], u in assoc(member, :user)) |> select([member, c, u], u) |> QueryBuilder.filter_pack(filters) - # |> QueryBuilder.load_inner_users(filters) |> ORM.paginater(~m(page size)a) |> done() end diff --git a/lib/groupher_server/cms/helper/loader.ex b/lib/groupher_server/cms/helper/loader.ex index d3c41074a..51f8a4348 100644 --- a/lib/groupher_server/cms/helper/loader.ex +++ b/lib/groupher_server/cms/helper/loader.ex @@ -8,8 +8,6 @@ defmodule GroupherServer.CMS.Helper.Loader do alias CMS.{ Author, - CommunityEditor, - CommunitySubscriber, CommunityThread, PostComment, PostCommentLike, @@ -33,14 +31,6 @@ defmodule GroupherServer.CMS.Helper.Loader do ) end - def query({"communities_subscribers", CommunitySubscriber}, args) do - CommunitySubscriber |> QueryBuilder.members_pack(args) - end - - def query({"communities_editors", CommunityEditor}, args) do - CommunityEditor |> QueryBuilder.members_pack(args) - end - # ------- post comments ------ @doc """ get unique participators join in comments @@ -85,7 +75,18 @@ defmodule GroupherServer.CMS.Helper.Loader do def query({"posts_comments_replies", PostCommentReply}, %{filter: filter}) do PostCommentReply - |> QueryBuilder.load_inner_replies(filter) + |> load_inner_replies(filter) + end + + @doc """ + load replies of the given comment + TODO: remove + """ + defp load_inner_replies(queryable, filter) do + queryable + |> QueryBuilder.filter_pack(filter) + |> join(:inner, [c], r in assoc(c, :reply)) + |> select([c, r], r) end def query({"posts_comments_replies", PostCommentReply}, %{reply_to: _}) do @@ -105,8 +106,12 @@ defmodule GroupherServer.CMS.Helper.Loader do end def query({"posts_comments_likes", PostCommentLike}, %{filter: _filter} = args) do - PostCommentLike - |> QueryBuilder.members_pack(args) + PostCommentLike |> members_pack(args) + end + + # TODO: remove it + def members_pack(queryable, %{filter: filter}) do + queryable |> QueryBuilder.load_inner_users(filter) end # def query({"articles_comments_upvotes", ArticleCommentUpvote}, %{ diff --git a/lib/helper/query_builder.ex b/lib/helper/query_builder.ex index 1ddf852e4..773edf22d 100644 --- a/lib/helper/query_builder.ex +++ b/lib/helper/query_builder.ex @@ -1,50 +1,14 @@ defmodule Helper.QueryBuilder do - # alias GroupherServer.Repo + @moduledoc """ + handle common query pices across the project + """ + import Ecto.Query, warn: false + alias GroupherServer.CMS @doc """ - handle [3] situation: - - 1. basic query with filter - 2. reaction_user's count - 3. is viewer reacted? - - bewteen [THREAD] and [REACT] - [THREAD]: cms thread, include: Post, Job, Repo ... - [REACT]; upvotes, stars, watchs ... + load inner user field """ - def members_pack(queryable, %{filter: filter}) do - queryable |> load_inner_users(filter) - end - - def members_pack(queryable, %{viewer_did: _, cur_user: cur_user}) do - queryable |> where([f], f.user_id == ^cur_user.id) - end - - def members_pack(queryable, %{count: _, type: :post}) do - queryable - |> group_by([f], f.post_id) - |> select([f], count(f.id)) - end - - def members_pack(queryable, %{count: _, type: :job}) do - queryable - |> group_by([f], f.job_id) - |> select([f], count(f.id)) - end - - def members_pack(queryable, %{count: _, type: :repo}) do - queryable - |> group_by([f], f.repo_id) - |> select([f], count(f.id)) - end - - def members_pack(queryable, %{count: _, type: :community}) do - queryable - |> group_by([f], f.community_id) - |> select([f], count(f.id)) - end - def load_inner_users(queryable, filter) do queryable |> join(:inner, [f], u in assoc(f, :user)) @@ -52,16 +16,6 @@ defmodule Helper.QueryBuilder do |> filter_pack(filter) end - @doc """ - load replies of the given comment - """ - def load_inner_replies(queryable, filter) do - queryable - |> filter_pack(filter) - |> join(:inner, [c], r in assoc(c, :reply)) - |> select([c, r], r) - end - @doc """ inserted in latest x mounth """ @@ -122,12 +76,9 @@ defmodule Helper.QueryBuilder do queryable |> order_by(asc: :index) {:sort, :most_views}, queryable -> - # this will cause error in Dialyzer - # queryable |> order_by(^sort_strategy(:most_views)) queryable |> order_by(desc: :views, desc: :inserted_at) {:sort, :least_views}, queryable -> - # queryable |> order_by(^sort_strategy(:least_views)) queryable |> order_by(asc: :views, desc: :inserted_at) {:sort, :most_stars}, queryable -> @@ -136,9 +87,6 @@ defmodule Helper.QueryBuilder do {:sort, :least_stars}, queryable -> queryable |> sort_by_count(:stars, :asc) - {:sort, :most_likes}, queryable -> - queryable |> sort_by_count(:likes, :desc) - {:length, :most_words}, queryable -> queryable |> order_by(desc: :length) @@ -217,20 +165,9 @@ defmodule Helper.QueryBuilder do where: t.raw == ^community_raw ) - {:one_community, community_raw}, queryable -> - from( - q in queryable, - join: t in assoc(q, :community), - where: t.raw == ^community_raw - ) - {:first, first}, queryable -> queryable |> limit(^first) - # {:pin, bool}, queryable -> - # queryable - # |> where([p], p.pin == ^bool) - {:mark_delete, bool}, queryable -> queryable |> where([p], p.mark_delete == ^bool) @@ -238,4 +175,31 @@ defmodule Helper.QueryBuilder do queryable end) end + + @doc """ + handle spec needs for CMS query filter + """ + def domain_query(CMS.Repo = queryable, filter) do + Enum.reduce(filter, queryable, fn + {:sort, :most_github_star}, queryable -> + queryable |> order_by(desc: :star_count) + + {:sort, :most_github_fork}, queryable -> + queryable |> order_by(desc: :fork_count) + + {:sort, :most_github_watch}, queryable -> + queryable |> order_by(desc: :watch_count) + + {:sort, :most_github_pr}, queryable -> + queryable |> order_by(desc: :prs_count) + + {:sort, :most_github_issue}, queryable -> + queryable |> order_by(desc: :issues_count) + + {_, _}, queryable -> + queryable + end) + end + + def domain_query(queryable, _filter), do: queryable end