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
4 changes: 2 additions & 2 deletions lib/groupher_server/accounts/accounts.ex
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,8 @@ defmodule GroupherServer.Accounts do

# publish
defdelegate paged_published_articles(user, thread, filter), to: Publish
defdelegate paged_published_article_comments(user, thread, filter), to: Publish
defdelegate paged_published_article_comments(user, thread), to: Publish
defdelegate paged_published_comments(user, thread, filter), to: Publish
defdelegate paged_published_comments(user, thread), to: Publish
defdelegate update_published_states(user, thread), to: Publish

# fans
Expand Down
74 changes: 14 additions & 60 deletions lib/groupher_server/accounts/delegates/publish.ex
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,20 @@ defmodule GroupherServer.Accounts.Delegate.Publish do
user followers / following related
"""
import Ecto.Query, warn: false
import Helper.Utils, only: [done: 1, ensure: 2]
# import Helper.ErrorCode
import ShortMaps
import Helper.Utils, only: [ensure: 2]

import GroupherServer.CMS.Helper.Matcher
alias GroupherServer.{Accounts, CMS}
alias Accounts.Model.{Embeds, User}

alias GroupherServer.Accounts.Model.{Embeds, User}
alias GroupherServer.CMS.Model.Comment

alias Helper.{ORM, QueryBuilder}
alias Helper.ORM

@default_meta Embeds.UserMeta.default_meta()

@doc """
get paged published contets of a user
"""
def paged_published_articles(%User{id: user_id}, thread, filter) do
with {:ok, info} <- match(thread),
{:ok, user} <- ORM.find(User, user_id) do
do_paged_published_articles(info.model, user, filter)
end
CMS.paged_published_articles(thread, filter, user_id)
end

@doc """
Expand All @@ -32,60 +25,21 @@ defmodule GroupherServer.Accounts.Delegate.Publish do
def update_published_states(user_id, thread) do
filter = %{page: 1, size: 1}

with {:ok, info} <- match(thread),
{:ok, user} <- ORM.find(User, user_id),
{:ok, paged_published_articles} <- do_paged_published_articles(info.model, user, filter) do
articles_count = paged_published_articles.total_count

meta =
ensure(user.meta, @default_meta) |> Map.put(:"published_#{thread}s_count", articles_count)
with {:ok, user} <- ORM.find(User, user_id),
{:ok, paged_articles} <- CMS.paged_published_articles(thread, filter, user_id) do
#
user_meta = ensure(user.meta, @default_meta)
meta = Map.put(user_meta, :"published_#{thread}s_count", paged_articles.total_count)

ORM.update_meta(user, meta)
end
end

defp do_paged_published_articles(queryable, %User{} = user, %{page: page, size: size} = filter) do
queryable
|> join(:inner, [article], author in assoc(article, :author))
|> where([article, author], author.user_id == ^user.id)
|> select([article, author], article)
|> QueryBuilder.filter_pack(filter)
|> ORM.paginater(~m(page size)a)
|> done()
def paged_published_comments(user, filter) do
CMS.paged_published_comments(user, filter)
end

def paged_published_article_comments(%User{id: user_id}, %{page: page, size: size} = filter) do
with {:ok, user} <- ORM.find(User, user_id) do
Comment
|> join(:inner, [comment], author in assoc(comment, :author))
|> where([comment, author], author.id == ^user.id)
|> QueryBuilder.filter_pack(filter)
|> ORM.paginater(~m(page size)a)
|> ORM.extract_and_assign_article()
|> done()
end
end

def paged_published_article_comments(
%User{id: user_id},
thread,
%{page: page, size: size} = filter
) do
with {:ok, user} <- ORM.find(User, user_id) do
thread = thread |> to_string |> String.upcase()
thread_atom = thread |> String.downcase() |> String.to_atom()

article_preload = Keyword.new([{thread_atom, [author: :user]}])
query = from(comment in Comment, preload: ^article_preload)

query
|> join(:inner, [comment], author in assoc(comment, :author))
|> where([comment, author], author.id == ^user.id)
|> where([comment, author], comment.thread == ^thread)
|> QueryBuilder.filter_pack(filter)
|> ORM.paginater(~m(page size)a)
|> ORM.extract_and_assign_article()
|> done()
end
def paged_published_comments(user, thread, filter) do
CMS.paged_published_comments(user, thread, filter)
end
end
4 changes: 4 additions & 0 deletions lib/groupher_server/cms/cms.ex
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ defmodule GroupherServer.CMS do

defdelegate paged_articles(queryable, filter), to: ArticleCURD
defdelegate paged_articles(queryable, filter, user), to: ArticleCURD
defdelegate paged_published_articles(queryable, filter, user), to: ArticleCURD

defdelegate create_article(community, thread, attrs, user), to: ArticleCURD
defdelegate update_article(article, attrs), to: ArticleCURD
Expand Down Expand Up @@ -133,6 +134,9 @@ defmodule GroupherServer.CMS do
defdelegate paged_comments(thread, article_id, filters, mode), to: CommentCurd
defdelegate paged_comments(thread, article_id, filters, mode, user), to: CommentCurd

defdelegate paged_published_comments(user, thread, filters), to: CommentCurd
defdelegate paged_published_comments(user, filters), to: CommentCurd

defdelegate paged_folded_article_comments(thread, article_id, filters), to: CommentCurd
defdelegate paged_folded_article_comments(thread, article_id, filters, user), to: CommentCurd

Expand Down
23 changes: 19 additions & 4 deletions lib/groupher_server/cms/delegates/article_curd.ex
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,9 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do
end
end

@doc """
get paged articles
"""
def paged_articles(thread, filter) do
%{page: page, size: size} = filter

Expand All @@ -105,14 +108,26 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do
end

def paged_articles(thread, filter, %User{} = user) do
with {:ok, stateless_paged_articles} <- paged_articles(thread, filter) do
stateless_paged_articles
|> mark_viewer_emotion_states(user)
|> mark_viewer_has_states(user)
|> done()
end
end

@doc "paged published articles for accounts"
def paged_published_articles(thread, filter, user_id) do
%{page: page, size: size} = filter

with {:ok, info} <- match(thread) do
with {:ok, info} <- match(thread),
{:ok, user} <- ORM.find(User, user_id) do
info.model
|> QueryBuilder.domain_query(filter)
|> QueryBuilder.filter_pack(Map.merge(filter, %{mark_delete: false}))
|> join(:inner, [article], author in assoc(article, :author))
|> where([article, author], author.user_id == ^user.id)
|> select([article, author], article)
|> QueryBuilder.filter_pack(filter)
|> ORM.paginater(~m(page size)a)
|> add_pin_articles_ifneed(info.model, filter)
|> mark_viewer_emotion_states(user)
|> mark_viewer_has_states(user)
|> done()
Expand Down
31 changes: 31 additions & 0 deletions lib/groupher_server/cms/delegates/comment_curd.ex
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,37 @@ defmodule GroupherServer.CMS.Delegate.CommentCurd do
do_paged_comment(thread, article_id, filters, where_query, user)
end

def paged_published_comments(%User{id: user_id}, filter) do
%{page: page, size: size} = filter

Comment
|> join(:inner, [comment], author in assoc(comment, :author))
|> where([comment, author], author.id == ^user_id)
|> QueryBuilder.filter_pack(filter)
|> ORM.paginater(~m(page size)a)
|> ORM.extract_and_assign_article()
|> done()
end

def paged_published_comments(%User{id: user_id}, thread, filter) do
%{page: page, size: size} = filter

thread = thread |> to_string |> String.upcase()
thread_atom = thread |> String.downcase() |> String.to_atom()

article_preload = Keyword.new([{thread_atom, [author: :user]}])
query = from(comment in Comment, preload: ^article_preload)

query
|> join(:inner, [comment], author in assoc(comment, :author))
|> where([comment, author], comment.thread == ^thread)
|> where([comment, author], author.id == ^user_id)
|> QueryBuilder.filter_pack(filter)
|> ORM.paginater(~m(page size)a)
|> ORM.extract_and_assign_article()
|> done()
end

def paged_folded_article_comments(thread, article_id, filters) do
where_query = dynamic([c], c.is_folded and not c.is_pinned)
do_paged_comment(thread, article_id, filters, where_query, nil)
Expand Down
10 changes: 5 additions & 5 deletions lib/groupher_server/cms/delegates/helper.ex
Original file line number Diff line number Diff line change
Expand Up @@ -56,15 +56,15 @@ defmodule GroupherServer.CMS.Delegate.Helper do
defp get_supported_mentions(:comment), do: @supported_comment_emotions
defp get_supported_mentions(_), do: @supported_emotions

def mark_viewer_emotion_states(paged_contents, nil), do: paged_contents
def mark_viewer_emotion_states(%{entries: []} = paged_contents, _), do: paged_contents
def mark_viewer_emotion_states(paged_contents, nil, :comment), do: paged_contents
def mark_viewer_emotion_states(paged_artiments, nil), do: paged_artiments
def mark_viewer_emotion_states(%{entries: []} = paged_artiments, _), do: paged_artiments
def mark_viewer_emotion_states(paged_artiments, nil, :comment), do: paged_artiments

@doc """
mark viewer emotions status for article or comment
"""
def mark_viewer_emotion_states(
%{entries: entries} = paged_contents,
%{entries: entries} = paged_artiments,
%User{} = user,
type \\ :article
) do
Expand All @@ -84,7 +84,7 @@ defmodule GroupherServer.CMS.Delegate.Helper do
Map.put(article, :emotions, updated_emotions)
end)

%{paged_contents | entries: new_entries}
%{paged_artiments | entries: new_entries}
end

@doc """
Expand Down
8 changes: 4 additions & 4 deletions lib/groupher_server_web/resolvers/accounts_resolver.ex
Original file line number Diff line number Diff line change
Expand Up @@ -191,17 +191,17 @@ defmodule GroupherServerWeb.Resolvers.Accounts do
Accounts.paged_published_articles(cur_user, thread, filter)
end

def paged_published_article_comments(_root, ~m(login filter thread)a, _info) do
def paged_published_comments(_root, ~m(login filter thread)a, _info) do
with {:ok, user_id} <- Accounts.get_userid_and_cache(login) do
Accounts.paged_published_article_comments(%User{id: user_id}, thread, filter)
Accounts.paged_published_comments(%User{id: user_id}, thread, filter)
else
_ -> raise_error(:not_exsit, "#{login} not found")
end
end

def paged_published_article_comments(_root, ~m(login filter)a, _info) do
def paged_published_comments(_root, ~m(login filter)a, _info) do
with {:ok, user_id} <- Accounts.get_userid_and_cache(login) do
Accounts.paged_published_article_comments(%User{id: user_id}, filter)
Accounts.paged_published_comments(%User{id: user_id}, filter)
else
_ -> raise_error(:not_exsit, "#{login} not found")
end
Expand Down
4 changes: 2 additions & 2 deletions lib/groupher_server_web/schema/account/account_queries.ex
Original file line number Diff line number Diff line change
Expand Up @@ -121,13 +121,13 @@ defmodule GroupherServerWeb.Schema.Account.Queries do
end

@desc "get paged published article comments"
field :paged_published_article_comments, :paged_comments do
field :paged_published_comments, :paged_comments do
arg(:login, non_null(:string))
arg(:filter, non_null(:paged_filter))
arg(:thread, :thread, default_value: :post)

middleware(M.PageSizeProof)
resolve(&R.Accounts.paged_published_article_comments/3)
resolve(&R.Accounts.paged_published_comments/3)
end

published_article_queries()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ defmodule GroupherServer.Test.Accounts.Published.Blog do
end)

filter = %{page: 1, size: 20}
{:ok, articles} = Accounts.paged_published_article_comments(user, :blog, filter)
{:ok, articles} = Accounts.paged_published_comments(user, :blog, filter)

entries = articles.entries
article = entries |> List.first()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ defmodule GroupherServer.Test.Accounts.Published.Job do
end)

filter = %{page: 1, size: 20}
{:ok, articles} = Accounts.paged_published_article_comments(user, :job, filter)
{:ok, articles} = Accounts.paged_published_comments(user, :job, filter)

entries = articles.entries
article = entries |> List.first()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ defmodule GroupherServer.Test.Accounts.Published.Post do
end)

filter = %{page: 1, size: 20}
{:ok, articles} = Accounts.paged_published_article_comments(user, :post, filter)
{:ok, articles} = Accounts.paged_published_comments(user, :post, filter)

entries = articles.entries
article = entries |> List.first()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ defmodule GroupherServer.Test.Accounts.Published.Repo do
end)

filter = %{page: 1, size: 20}
{:ok, articles} = Accounts.paged_published_article_comments(user, :repo, filter)
{:ok, articles} = Accounts.paged_published_comments(user, :repo, filter)

entries = articles.entries
article = entries |> List.first()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ defmodule GroupherServer.Test.Query.Accounts.Published.Blogs do
describe "[account published comments on blog]" do
@query """
query($login: String!, $thread: Thread, $filter: PagedFilter!) {
pagedPublishedArticleComments(login: $login, thread: $thread, filter: $filter) {
pagedPublishedComments(login: $login, thread: $thread, filter: $filter) {
entries {
id
bodyHtml
Expand Down Expand Up @@ -86,7 +86,7 @@ defmodule GroupherServer.Test.Query.Accounts.Published.Blogs do

variables = %{login: user.login, thread: "BLOG", filter: %{page: 1, size: 20}}

results = guest_conn |> query_result(@query, variables, "pagedPublishedArticleComments")
results = guest_conn |> query_result(@query, variables, "pagedPublishedComments")

entries = results["entries"]
assert results |> is_valid_pagination?
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ defmodule GroupherServer.Test.Query.Accounts.Published.Jobs do
describe "[account published comments on job]" do
@query """
query($login: String!, $thread: Thread, $filter: PagedFilter!) {
pagedPublishedArticleComments(login: $login, thread: $thread, filter: $filter) {
pagedPublishedComments(login: $login, thread: $thread, filter: $filter) {
entries {
id
bodyHtml
Expand Down Expand Up @@ -87,7 +87,7 @@ defmodule GroupherServer.Test.Query.Accounts.Published.Jobs do

variables = %{login: user.login, thread: "JOB", filter: %{page: 1, size: 20}}

results = guest_conn |> query_result(@query, variables, "pagedPublishedArticleComments")
results = guest_conn |> query_result(@query, variables, "pagedPublishedComments")

entries = results["entries"]
assert results |> is_valid_pagination?
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ defmodule GroupherServer.Test.Query.Accounts.Published.Posts do
describe "[account published comments on post]" do
@query """
query($login: String!, $thread: Thread, $filter: PagedFilter!) {
pagedPublishedArticleComments(login: $login, thread: $thread, filter: $filter) {
pagedPublishedComments(login: $login, thread: $thread, filter: $filter) {
entries {
id
bodyHtml
Expand Down Expand Up @@ -87,7 +87,7 @@ defmodule GroupherServer.Test.Query.Accounts.Published.Posts do

variables = %{login: user.login, thread: "POST", filter: %{page: 1, size: 20}}

results = guest_conn |> query_result(@query, variables, "pagedPublishedArticleComments")
results = guest_conn |> query_result(@query, variables, "pagedPublishedComments")

entries = results["entries"]
assert results |> is_valid_pagination?
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ defmodule GroupherServer.Test.Query.Accounts.Published.Repos do
describe "[account published comments on repo]" do
@query """
query($login: String!, $thread: Thread, $filter: PagedFilter!) {
pagedPublishedArticleComments(login: $login, thread: $thread, filter: $filter) {
pagedPublishedComments(login: $login, thread: $thread, filter: $filter) {
entries {
id
bodyHtml
Expand Down Expand Up @@ -87,7 +87,7 @@ defmodule GroupherServer.Test.Query.Accounts.Published.Repos do

variables = %{login: user.login, thread: "REPO", filter: %{page: 1, size: 20}}

results = guest_conn |> query_result(@query, variables, "pagedPublishedArticleComments")
results = guest_conn |> query_result(@query, variables, "pagedPublishedComments")

entries = results["entries"]
assert results |> is_valid_pagination?
Expand Down