@@ -3,15 +3,18 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do
33 CURD operation on post/job ...
44 """
55 import Ecto.Query , warn: false
6- import GroupherServer.CMS.Utils.Matcher
6+
7+ import GroupherServer.CMS.Utils.Matcher2
8+
9+ import GroupherServer.CMS.Utils.Matcher , only: [ match_action: 2 , dynamic_where: 2 ]
710 import Helper.Utils , only: [ done: 1 , pick_by: 2 , integerfy: 1 ]
811 import Helper.ErrorCode
912 import ShortMaps
1013
1114 alias GroupherServer . { Accounts , CMS , Delivery , Email , Repo , Statistics }
1215
1316 alias Accounts.User
14- alias CMS . { Author , Community , Embeds , Delegate , Tag }
17+ alias CMS . { Author , Community , PinnedArticle , Embeds , Delegate , Tag }
1518
1619 alias Delegate.ArticleOperation
1720 alias Helper . { Later , ORM , QueryBuilder }
@@ -271,28 +274,22 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do
271274 end
272275
273276 defp read_state_query ( queryable , % { read: false } = _filter , _user ) do
274- # queryable
275- # |> join(:left, [content, f, c], viewers in assoc(content, :viewers))
276- # |> where([content, f, c, viewers], viewers.user_id != ^user.id)
277- # |> where([content, f, c, viewers], content.id != viewers.post_id)
278- # |> IO.inspect(label: "query")
279277 queryable
280278 end
281279
282280 defp read_state_query ( queryable , _ , _ ) , do: queryable
283281
284- # only first page need pin contents
285- # TODO: use seperate pined table, which is much more smaller
286- defp add_pin_contents_ifneed ( contents , CMS.Post , % { community: community } = filter ) do
282+ defp add_pin_contents_ifneed ( contents , querable , % { community: _community } = filter ) do
287283 with { :ok , _ } <- should_add_pin? ( filter ) ,
284+ { :ok , info } <- match ( querable ) ,
288285 { :ok , normal_contents } <- contents ,
289286 true <- Map . has_key? ( filter , :community ) ,
290287 true <- 1 == Map . get ( normal_contents , :page_number ) do
291288 { :ok , pined_content } =
292- CMS.PinedPost
289+ PinnedArticle
293290 |> join ( :inner , [ p ] , c in assoc ( p , :community ) )
294- |> join ( :inner , [ p ] , content in assoc ( p , :post ) )
295- |> where ( [ p , c , content ] , c . raw == ^ community )
291+ |> join ( :inner , [ p ] , content in assoc ( p , ^ info . thread ) )
292+ |> where ( [ p , c , content ] , c . raw == ^ filter . community )
296293 |> select ( [ p , c , content ] , content )
297294 # 10 pined contents per community/thread, at most
298295 |> ORM . paginater ( % { page: 1 , size: 10 } )
@@ -305,38 +302,8 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do
305302 end
306303 end
307304
308- defp add_pin_contents_ifneed ( contents , CMS.Job , % { community: _community } = filter ) do
309- merge_pin_contents ( contents , :job , CMS.PinedJob , filter )
310- end
311-
312- defp add_pin_contents_ifneed ( contents , CMS.Repo , % { community: _community } = filter ) do
313- merge_pin_contents ( contents , :repo , CMS.PinedRepo , filter )
314- end
315-
316305 defp add_pin_contents_ifneed ( contents , _querable , _filter ) , do: contents
317306
318- defp merge_pin_contents ( contents , thread , pin_schema , % { community: _community } = filter ) do
319- with { :ok , _ } <- should_add_pin? ( filter ) ,
320- { :ok , normal_contents } <- contents ,
321- true <- Map . has_key? ( filter , :community ) ,
322- true <- 1 == Map . get ( normal_contents , :page_number ) do
323- { :ok , pined_content } =
324- pin_schema
325- |> join ( :inner , [ p ] , c in assoc ( p , :community ) )
326- |> join ( :inner , [ p ] , content in assoc ( p , ^ thread ) )
327- |> where ( [ p , c , content ] , c . raw == ^ filter . community )
328- |> select ( [ p , c , content ] , content )
329- # 10 pined contents per community/thread, at most
330- |> ORM . paginater ( % { page: 1 , size: 10 } )
331- |> done ( )
332-
333- concat_contents ( pined_content , normal_contents )
334- else
335- _error ->
336- contents
337- end
338- end
339-
340307 # if filter contains like: tags, sort.., then don't add pin content
341308 defp should_add_pin? ( % { page: 1 , tag: :all , sort: :desc_inserted , read: :all } = filter ) do
342309 filter
0 commit comments