@@ -21,39 +21,70 @@ defmodule MastaniServer.CMS.Delegate.ArticleCURD do
2121 get paged post / job ...
2222 """
2323 def paged_contents ( queryable , filter ) do
24- normal_content_fr = filter |> Map . merge ( QueryBuilder . default_article_filters ( ) )
25-
2624 queryable
27- |> ORM . find_all ( normal_content_fr )
25+ |> flag_query ( filter )
26+ |> ORM . find_all ( filter )
2827 |> add_pin_contents_ifneed ( queryable , filter )
2928 end
3029
30+ defp flag_query ( queryable , filter , flag \\ % { } ) do
31+ flag = % { pin: false , trash: false } |> Map . merge ( flag )
32+
33+ # TODO: remove case judge ?
34+ case filter |> Map . has_key? ( :community ) do
35+ true ->
36+ queryable
37+ |> join ( :inner , [ q ] , f in assoc ( q , :community_flags ) )
38+ |> where ( [ q , f ] , f . pin == ^ flag . pin and f . trash == ^ flag . trash )
39+ |> join ( :inner , [ q , f ] , c in assoc ( f , :community ) )
40+ |> where ( [ q , f , c ] , c . raw == ^ filter . community )
41+
42+ false ->
43+ # for runing tests usage, no flag when db_insert
44+ queryable
45+ end
46+ end
47+
3148 # only first page need pin contents
3249 defp add_pin_contents_ifneed ( contents , queryable , filter ) do
3350 with { :ok , normal_contents } <- contents ,
51+ true <- Map . has_key? ( filter , :community ) ,
3452 true <- 1 == Map . get ( normal_contents , :page_number ) do
35- pin_content_fr = filter |> Map . merge ( % { pin: true } )
36- { :ok , pined_content } = queryable |> ORM . find_all ( pin_content_fr )
53+ { :ok , pined_content } =
54+ queryable
55+ |> flag_query ( filter , % { pin: true } )
56+ |> ORM . find_all ( filter )
57+
58+ # TODO: add hot post pin/trash state ?
59+ # don't by flag_changeset, dataloader make things complex
60+ concat_contents ( pined_content , normal_contents )
61+ else
62+ _error ->
63+ contents
64+ end
65+ end
3766
38- case pined_content |> Map . get ( :total_count ) do
39- 0 ->
40- contents
67+ defp concat_contents ( pined_content , normal_contents ) do
68+ case pined_content |> Map . get ( :total_count ) do
69+ 0 ->
70+ { :ok , normal_contents }
4171
42- _ ->
43- pind_entries = pined_content |> Map . get ( :entries )
44- normal_entries = normal_contents |> Map . get ( :entries )
72+ _ ->
73+ # NOTE: this is tricy, should use dataloader refactor
74+ pind_entries =
75+ pined_content
76+ |> Map . get ( :entries )
77+ |> Enum . map ( & struct ( & 1 , % { pin: true } ) )
4578
46- normal_count = normal_contents |> Map . get ( :total_count )
47- pind_count = pined_content |> Map . get ( :total_count )
79+ normal_entries = normal_contents |> Map . get ( :entries )
4880
49- normal_contents
50- |> Map . put ( :entries , pind_entries ++ normal_entries )
51- |> Map . put ( :total_count , pind_count + normal_count )
52- |> done
53- end
54- else
55- _error ->
56- contents
81+ normal_count = normal_contents |> Map . get ( :total_count )
82+ pind_count = pined_content |> Map . get ( :total_count )
83+
84+ normal_contents
85+ |> Map . put ( :entries , pind_entries ++ normal_entries )
86+ |> Map . put ( :total_count , pind_count + normal_count )
87+ |> done
5788 end
5889 end
5990
@@ -84,6 +115,21 @@ defmodule MastaniServer.CMS.Delegate.ArticleCURD do
84115 |> Multi . run ( :set_community , fn % { add_content_author: content } ->
85116 ArticleOperation . set_community ( community , thread , content . id )
86117 end )
118+ |> Multi . run ( :set_community_flag , fn % { add_content_author: content } ->
119+ # TODO: remove this judge, as content should have a flag
120+ case action |> Map . has_key? ( :flag ) do
121+ true ->
122+ ArticleOperation . set_community_flags ( content , community . id , % {
123+ pin: false ,
124+ trash: false
125+ } )
126+
127+ false ->
128+ { :ok , "pass" }
129+ end
130+
131+ # Repo.insert(%CMS.PostCommunityFlags{post_id: content.id, community_id: community.id, })
132+ end )
87133 |> Multi . run ( :set_tag , fn % { add_content_author: content } ->
88134 case attrs |> Map . has_key? ( :tags ) do
89135 true -> set_tags ( community , thread , content . id , attrs . tags )
@@ -108,6 +154,10 @@ defmodule MastaniServer.CMS.Delegate.ArticleCURD do
108154 { :error , [ message: "set community" , code: ecode ( :create_fails ) ] }
109155 end
110156
157+ defp create_content_result ( { :error , :set_community_flag , _result , _steps } ) do
158+ { :error , [ message: "set community flag" , code: ecode ( :create_fails ) ] }
159+ end
160+
111161 defp create_content_result ( { :error , :set_tag , result , _steps } ) do
112162 { :error , result }
113163 end
0 commit comments