Skip to content
This repository was archived by the owner on Nov 8, 2022. It is now read-only.

Commit 2fb73d6

Browse files
authored
refactor(search): extract search macros (#367)
* refactor(search): extract search macros * refactor(search): differ community and article search * refactor(search): fix communities search * refactor(search): adjust communities api
1 parent 7a97134 commit 2fb73d6

File tree

7 files changed

+63
-78
lines changed

7 files changed

+63
-78
lines changed

lib/groupher_server/cms/cms.ex

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,8 @@ defmodule GroupherServer.CMS do
181181
defdelegate delete_passport(user), to: PassportCURD
182182

183183
# search
184-
defdelegate search_items(part, args), to: Search
184+
defdelegate search_articles(thread, args), to: Search
185+
defdelegate search_communities(args), to: Search
185186

186187
# seeds
187188
defdelegate seed_communities(opt), to: Seeds

lib/groupher_server/cms/delegates/search.ex

Lines changed: 11 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ defmodule GroupherServer.CMS.Delegate.Search do
55

66
import Helper.Utils, only: [done: 1]
77
import Ecto.Query, warn: false
8+
import GroupherServer.CMS.Helper.Matcher
89

910
alias Helper.ORM
1011
alias GroupherServer.CMS.{Community, Post, Job, Repo}
@@ -14,40 +15,23 @@ defmodule GroupherServer.CMS.Delegate.Search do
1415
@doc """
1516
search community by title
1617
"""
17-
def search_items(:community, %{title: title} = _args) do
18+
def search_communities(title) do
1819
Community
1920
|> where([c], ilike(c.title, ^"%#{title}%") or ilike(c.raw, ^"%#{title}%"))
2021
|> ORM.paginater(page: 1, size: @search_items_count)
2122
|> done()
2223
end
2324

2425
@doc """
25-
search post by title
26+
search article by title
2627
"""
27-
def search_items(:post, %{title: title} = _args) do
28-
Post
29-
|> where([c], ilike(c.title, ^"%#{title}%") or ilike(c.digest, ^"%#{title}%"))
30-
|> ORM.paginater(page: 1, size: @search_items_count)
31-
|> done()
32-
end
33-
34-
@doc """
35-
search job by title or company name
36-
"""
37-
def search_items(:job, %{title: title} = _args) do
38-
Job
39-
|> where([c], ilike(c.title, ^"%#{title}%") or ilike(c.company, ^"%#{title}%"))
40-
|> ORM.paginater(page: 1, size: @search_items_count)
41-
|> done()
42-
end
43-
44-
@doc """
45-
search repo by title
46-
"""
47-
def search_items(:repo, %{title: title} = _args) do
48-
Repo
49-
|> where([c], ilike(c.title, ^"%#{title}%") or ilike(c.owner_name, ^"%#{title}%"))
50-
|> ORM.paginater(page: 1, size: @search_items_count)
51-
|> done()
28+
def search_articles(thread, %{title: title}) do
29+
with {:ok, info} <- match(thread) do
30+
info.model
31+
# |> where([c], ilike(c.title, ^"%#{title}%") or ilike(c.digest, ^"%#{title}%"))
32+
|> where([c], ilike(c.title, ^"%#{title}%"))
33+
|> ORM.paginater(page: 1, size: @search_items_count)
34+
|> done()
35+
end
5236
end
5337
end

lib/groupher_server_web/resolvers/cms_resolver.ex

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -374,8 +374,12 @@ defmodule GroupherServerWeb.Resolvers.CMS do
374374
CMS.add_contributor(%CMS.CommunityCheatsheet{id: id}, contributor)
375375
end
376376

377-
def search_items(_root, %{part: part, title: title}, _info) do
378-
CMS.search_items(part, %{title: title})
377+
def search_communities(_root, %{title: title}, _info) do
378+
CMS.search_communities(title)
379+
end
380+
381+
def search_articles(_root, %{thread: thread, title: title}, _info) do
382+
CMS.search_articles(thread, %{title: title})
379383
end
380384

381385
# ##############################################

lib/groupher_server_web/schema/Helper/queries.ex

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,28 @@ defmodule GroupherServerWeb.Schema.Helper.Queries do
22
@moduledoc """
33
common fields
44
"""
5+
import Helper.Utils, only: [get_config: 2]
6+
57
alias GroupherServerWeb.Middleware, as: M
68
alias GroupherServerWeb.Resolvers, as: R
79

10+
@article_threads get_config(:article, :article_threads)
11+
12+
defmacro article_search_queries() do
13+
@article_threads
14+
|> Enum.map(fn thread ->
15+
quote do
16+
@desc unquote("get #{thread} by id")
17+
field unquote(:"search_#{thread}s"), unquote(:"paged_#{thread}s") do
18+
arg(:title, non_null(:string))
19+
arg(:thread, unquote(:"#{thread}_thread"), default_value: unquote(thread))
20+
21+
resolve(&R.CMS.search_articles/3)
22+
end
23+
end
24+
end)
25+
end
26+
827
@doc """
928
query generator for threads, like:
1029

lib/groupher_server_web/schema/cms/cms_queries.ex

Lines changed: 8 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -148,44 +148,21 @@ defmodule GroupherServerWeb.Schema.CMS.Queries do
148148
resolve(&R.CMS.paged_comments/3)
149149
end
150150

151-
@desc "search communities by title"
152-
field :search_communities, :paged_communities do
153-
arg(:title, non_null(:string))
154-
arg(:part, :community_type, default_value: :community)
155-
156-
resolve(&R.CMS.search_items/3)
157-
end
158-
159-
@desc "search post by title"
160-
field :search_posts, :paged_posts do
161-
arg(:title, non_null(:string))
162-
arg(:part, :post_thread, default_value: :post)
163-
164-
resolve(&R.CMS.search_items/3)
165-
end
166-
167-
@desc "search job by title"
168-
field :search_jobs, :paged_jobs do
169-
arg(:title, non_null(:string))
170-
arg(:part, :job_thread, default_value: :job)
151+
@desc "paged reports list"
152+
field :paged_abuse_reports, :paged_reports do
153+
arg(:filter, non_null(:report_filter))
171154

172-
resolve(&R.CMS.search_items/3)
155+
resolve(&R.CMS.paged_reports/3)
173156
end
174157

175-
@desc "search repo by title"
176-
field :search_repos, :paged_repos do
158+
@desc "search communities by title"
159+
field :search_communities, :paged_communities do
177160
arg(:title, non_null(:string))
178-
arg(:part, :repo_thread, default_value: :repo)
179161

180-
resolve(&R.CMS.search_items/3)
162+
resolve(&R.CMS.search_communities/3)
181163
end
182164

183-
@desc "paged reports list"
184-
field :paged_abuse_reports, :paged_reports do
185-
arg(:filter, non_null(:report_filter))
186-
187-
resolve(&R.CMS.paged_reports/3)
188-
end
165+
article_search_queries()
189166

190167
article_reacted_users_query(:upvot, &R.CMS.upvoted_users/3)
191168
article_reacted_users_query(:collect, &R.CMS.collected_users/3)

test/groupher_server/cms/community/community_test.exs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@ defmodule GroupherServer.Test.CMS.Community do
9393
assert user.id in community.meta.subscribed_user_ids
9494
end
9595

96-
@tag :wip2
9796
test "user unsubscribe a community will update the community's subscribted info",
9897
~m(user community)a do
9998
{:ok, _} = CMS.subscribe_community(community, user)

test/groupher_server/cms/search_test.exs

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,76 +23,77 @@ defmodule GroupherServer.Test.CMS.Search do
2323

2424
describe "[cms search post]" do
2525
test "search post by full title should valid paged posts" do
26-
{:ok, searched} = CMS.search_items(:post, %{title: "react"})
26+
{:ok, searched} = CMS.search_articles(:post, %{title: "react"})
2727

2828
assert searched |> is_valid_pagination?(:raw)
2929
assert searched.total_count == 1
3030
assert searched.entries |> Enum.at(0) |> Map.get(:title) == "react"
3131
end
3232

3333
test "search post blur title should return valid communities" do
34-
{:ok, searched} = CMS.search_items(:post, %{title: "reac"})
34+
{:ok, searched} = CMS.search_articles(:post, %{title: "reac"})
3535
assert searched.entries |> Enum.at(0) |> Map.get(:title) == "react"
3636

37-
{:ok, searched} = CMS.search_items(:post, %{title: "rea"})
37+
{:ok, searched} = CMS.search_articles(:post, %{title: "rea"})
3838
assert searched.entries |> Enum.at(0) |> Map.get(:title) == "react"
3939

40-
{:ok, searched} = CMS.search_items(:post, %{title: "eac"})
40+
{:ok, searched} = CMS.search_articles(:post, %{title: "eac"})
4141
assert searched.entries |> Enum.at(0) |> Map.get(:title) == "react"
4242

43-
{:ok, searched} = CMS.search_items(:post, %{title: "每日"})
43+
{:ok, searched} = CMS.search_articles(:post, %{title: "每日"})
4444
assert searched.entries |> Enum.at(0) |> Map.get(:title) == "每日妹子"
4545

46-
{:ok, searched} = CMS.search_items(:post, %{title: "javasc"})
46+
{:ok, searched} = CMS.search_articles(:post, %{title: "javasc"})
4747
assert searched.total_count == 1
4848
assert searched.entries |> Enum.at(0) |> Map.get(:title) == "javascript"
4949

50-
{:ok, searched} = CMS.search_items(:post, %{title: "java"})
50+
{:ok, searched} = CMS.search_articles(:post, %{title: "java"})
5151
assert searched.total_count == 2
5252
assert searched.entries |> Enum.any?(&(&1.title == "java"))
5353
assert searched.entries |> Enum.any?(&(&1.title == "javascript"))
5454
end
5555

5656
test "search non exsit community should get empty pagi data" do
57-
{:ok, searched} = CMS.search_items(:community, %{title: "non-exsit"})
57+
{:ok, searched} = CMS.search_communities("non-exsit")
5858
assert searched |> is_valid_pagination?(:raw, :empty)
5959
end
6060
end
6161

6262
describe "[cms search community]" do
6363
test "search community by full title should valid paged communities" do
64-
{:ok, searched} = CMS.search_items(:community, %{title: "react"})
64+
{:ok, searched} = CMS.search_communities("react")
6565

6666
assert searched |> is_valid_pagination?(:raw)
6767
assert searched.total_count == 1
6868
assert searched.entries |> Enum.at(0) |> Map.get(:title) == "react"
6969
end
7070

71+
@tag :wip2
7172
test "search community blur title should return valid communities" do
72-
{:ok, searched} = CMS.search_items(:community, %{title: "reac"})
73+
{:ok, searched} = CMS.search_communities("reac")
7374
assert searched.entries |> Enum.at(0) |> Map.get(:title) == "react"
7475

75-
{:ok, searched} = CMS.search_items(:community, %{title: "rea"})
76+
{:ok, searched} = CMS.search_communities("rea")
7677
assert searched.entries |> Enum.at(0) |> Map.get(:title) == "react"
7778

78-
{:ok, searched} = CMS.search_items(:community, %{title: "eac"})
79+
{:ok, searched} = CMS.search_communities("eac")
7980
assert searched.entries |> Enum.at(0) |> Map.get(:title) == "react"
8081

81-
{:ok, searched} = CMS.search_items(:community, %{title: "每日"})
82+
{:ok, searched} = CMS.search_communities("每日")
8283
assert searched.entries |> Enum.at(0) |> Map.get(:title) == "每日妹子"
8384

84-
{:ok, searched} = CMS.search_items(:community, %{title: "javasc"})
85+
{:ok, searched} = CMS.search_communities("javasc")
8586
assert searched.total_count == 1
8687
assert searched.entries |> Enum.at(0) |> Map.get(:title) == "javascript"
8788

88-
{:ok, searched} = CMS.search_items(:community, %{title: "java"})
89+
{:ok, searched} = CMS.search_communities("java")
8990
assert searched.total_count == 2
9091
assert searched.entries |> Enum.any?(&(&1.title == "java"))
9192
assert searched.entries |> Enum.any?(&(&1.title == "javascript"))
9293
end
9394

9495
test "search non exsit community should get empty pagi data" do
95-
{:ok, searched} = CMS.search_items(:community, %{title: "non-exsit"})
96+
{:ok, searched} = CMS.search_communities("non-exsit")
9697
assert searched |> is_valid_pagination?(:raw, :empty)
9798
end
9899
end

0 commit comments

Comments
 (0)