Skip to content
This repository was archived by the owner on Nov 8, 2022. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion lib/groupher_server/cms/cms.ex
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,8 @@ defmodule GroupherServer.CMS do
defdelegate delete_passport(user), to: PassportCURD

# search
defdelegate search_items(part, args), to: Search
defdelegate search_articles(thread, args), to: Search
defdelegate search_communities(args), to: Search

# seeds
defdelegate seed_communities(opt), to: Seeds
Expand Down
38 changes: 11 additions & 27 deletions lib/groupher_server/cms/delegates/search.ex
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ defmodule GroupherServer.CMS.Delegate.Search do

import Helper.Utils, only: [done: 1]
import Ecto.Query, warn: false
import GroupherServer.CMS.Helper.Matcher

alias Helper.ORM
alias GroupherServer.CMS.{Community, Post, Job, Repo}
Expand All @@ -14,40 +15,23 @@ defmodule GroupherServer.CMS.Delegate.Search do
@doc """
search community by title
"""
def search_items(:community, %{title: title} = _args) do
def search_communities(title) do
Community
|> where([c], ilike(c.title, ^"%#{title}%") or ilike(c.raw, ^"%#{title}%"))
|> ORM.paginater(page: 1, size: @search_items_count)
|> done()
end

@doc """
search post by title
search article by title
"""
def search_items(:post, %{title: title} = _args) do
Post
|> where([c], ilike(c.title, ^"%#{title}%") or ilike(c.digest, ^"%#{title}%"))
|> ORM.paginater(page: 1, size: @search_items_count)
|> done()
end

@doc """
search job by title or company name
"""
def search_items(:job, %{title: title} = _args) do
Job
|> where([c], ilike(c.title, ^"%#{title}%") or ilike(c.company, ^"%#{title}%"))
|> ORM.paginater(page: 1, size: @search_items_count)
|> done()
end

@doc """
search repo by title
"""
def search_items(:repo, %{title: title} = _args) do
Repo
|> where([c], ilike(c.title, ^"%#{title}%") or ilike(c.owner_name, ^"%#{title}%"))
|> ORM.paginater(page: 1, size: @search_items_count)
|> done()
def search_articles(thread, %{title: title}) do
with {:ok, info} <- match(thread) do
info.model
# |> where([c], ilike(c.title, ^"%#{title}%") or ilike(c.digest, ^"%#{title}%"))
|> where([c], ilike(c.title, ^"%#{title}%"))
|> ORM.paginater(page: 1, size: @search_items_count)
|> done()
end
end
end
8 changes: 6 additions & 2 deletions lib/groupher_server_web/resolvers/cms_resolver.ex
Original file line number Diff line number Diff line change
Expand Up @@ -374,8 +374,12 @@ defmodule GroupherServerWeb.Resolvers.CMS do
CMS.add_contributor(%CMS.CommunityCheatsheet{id: id}, contributor)
end

def search_items(_root, %{part: part, title: title}, _info) do
CMS.search_items(part, %{title: title})
def search_communities(_root, %{title: title}, _info) do
CMS.search_communities(title)
end

def search_articles(_root, %{thread: thread, title: title}, _info) do
CMS.search_articles(thread, %{title: title})
end

# ##############################################
Expand Down
19 changes: 19 additions & 0 deletions lib/groupher_server_web/schema/Helper/queries.ex
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,28 @@ defmodule GroupherServerWeb.Schema.Helper.Queries do
@moduledoc """
common fields
"""
import Helper.Utils, only: [get_config: 2]

alias GroupherServerWeb.Middleware, as: M
alias GroupherServerWeb.Resolvers, as: R

@article_threads get_config(:article, :article_threads)

defmacro article_search_queries() do
@article_threads
|> Enum.map(fn thread ->
quote do
@desc unquote("get #{thread} by id")
field unquote(:"search_#{thread}s"), unquote(:"paged_#{thread}s") do
arg(:title, non_null(:string))
arg(:thread, unquote(:"#{thread}_thread"), default_value: unquote(thread))

resolve(&R.CMS.search_articles/3)
end
end
end)
end

@doc """
query generator for threads, like:

Expand Down
39 changes: 8 additions & 31 deletions lib/groupher_server_web/schema/cms/cms_queries.ex
Original file line number Diff line number Diff line change
Expand Up @@ -148,44 +148,21 @@ defmodule GroupherServerWeb.Schema.CMS.Queries do
resolve(&R.CMS.paged_comments/3)
end

@desc "search communities by title"
field :search_communities, :paged_communities do
arg(:title, non_null(:string))
arg(:part, :community_type, default_value: :community)

resolve(&R.CMS.search_items/3)
end

@desc "search post by title"
field :search_posts, :paged_posts do
arg(:title, non_null(:string))
arg(:part, :post_thread, default_value: :post)

resolve(&R.CMS.search_items/3)
end

@desc "search job by title"
field :search_jobs, :paged_jobs do
arg(:title, non_null(:string))
arg(:part, :job_thread, default_value: :job)
@desc "paged reports list"
field :paged_abuse_reports, :paged_reports do
arg(:filter, non_null(:report_filter))

resolve(&R.CMS.search_items/3)
resolve(&R.CMS.paged_reports/3)
end

@desc "search repo by title"
field :search_repos, :paged_repos do
@desc "search communities by title"
field :search_communities, :paged_communities do
arg(:title, non_null(:string))
arg(:part, :repo_thread, default_value: :repo)

resolve(&R.CMS.search_items/3)
resolve(&R.CMS.search_communities/3)
end

@desc "paged reports list"
field :paged_abuse_reports, :paged_reports do
arg(:filter, non_null(:report_filter))

resolve(&R.CMS.paged_reports/3)
end
article_search_queries()

article_reacted_users_query(:upvot, &R.CMS.upvoted_users/3)
article_reacted_users_query(:collect, &R.CMS.collected_users/3)
Expand Down
1 change: 0 additions & 1 deletion test/groupher_server/cms/community/community_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,6 @@ defmodule GroupherServer.Test.CMS.Community do
assert user.id in community.meta.subscribed_user_ids
end

@tag :wip2
test "user unsubscribe a community will update the community's subscribted info",
~m(user community)a do
{:ok, _} = CMS.subscribe_community(community, user)
Expand Down
33 changes: 17 additions & 16 deletions test/groupher_server/cms/search_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -23,76 +23,77 @@ defmodule GroupherServer.Test.CMS.Search do

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

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

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

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

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

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

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

{:ok, searched} = CMS.search_items(:post, %{title: "java"})
{:ok, searched} = CMS.search_articles(:post, %{title: "java"})
assert searched.total_count == 2
assert searched.entries |> Enum.any?(&(&1.title == "java"))
assert searched.entries |> Enum.any?(&(&1.title == "javascript"))
end

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

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

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

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

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

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

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

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

{:ok, searched} = CMS.search_items(:community, %{title: "java"})
{:ok, searched} = CMS.search_communities("java")
assert searched.total_count == 2
assert searched.entries |> Enum.any?(&(&1.title == "java"))
assert searched.entries |> Enum.any?(&(&1.title == "javascript"))
end

test "search non exsit community should get empty pagi data" do
{:ok, searched} = CMS.search_items(:community, %{title: "non-exsit"})
{:ok, searched} = CMS.search_communities("non-exsit")
assert searched |> is_valid_pagination?(:raw, :empty)
end
end
Expand Down