@@ -39,6 +39,8 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do
39
39
alias Ecto.Multi
40
40
41
41
@ active_period get_config ( :article , :active_period_days )
42
+ @ archive_threshold get_config ( :article , :archive_threshold )
43
+
42
44
@ default_emotions Embeds.ArticleEmotion . default_emotions ( )
43
45
@ default_article_meta Embeds.ArticleMeta . default_meta ( )
44
46
@ remove_article_hint "The content does not comply with the community norms"
@@ -68,26 +70,24 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do
68
70
read articles for logined user
69
71
"""
70
72
def read_article ( thread , id , % User { id: user_id } ) do
71
- with { :ok , info } <- match ( thread ) do
72
- Multi . new ( )
73
- |> Multi . run ( :normal_read , fn _ , _ -> read_article ( thread , id ) end )
74
- |> Multi . run ( :add_viewed_user , fn _ , % { normal_read: article } ->
75
- update_viewed_user_list ( article , user_id )
76
- end )
77
- |> Multi . run ( :set_viewer_has_states , fn _ , % { normal_read: article } ->
78
- article_meta = if is_nil ( article . meta ) , do: @ default_article_meta , else: article . meta
73
+ Multi . new ( )
74
+ |> Multi . run ( :normal_read , fn _ , _ -> read_article ( thread , id ) end )
75
+ |> Multi . run ( :add_viewed_user , fn _ , % { normal_read: article } ->
76
+ update_viewed_user_list ( article , user_id )
77
+ end )
78
+ |> Multi . run ( :set_viewer_has_states , fn _ , % { normal_read: article } ->
79
+ article_meta = if is_nil ( article . meta ) , do: @ default_article_meta , else: article . meta
79
80
80
- viewer_has_states = % {
81
- viewer_has_collected: user_id in article_meta . collected_user_ids ,
82
- viewer_has_upvoted: user_id in article_meta . upvoted_user_ids ,
83
- viewer_has_reported: user_id in article_meta . reported_user_ids
84
- }
81
+ viewer_has_states = % {
82
+ viewer_has_collected: user_id in article_meta . collected_user_ids ,
83
+ viewer_has_upvoted: user_id in article_meta . upvoted_user_ids ,
84
+ viewer_has_reported: user_id in article_meta . reported_user_ids
85
+ }
85
86
86
- article |> Map . merge ( viewer_has_states ) |> done
87
- end )
88
- |> Repo . transaction ( )
89
- |> result ( )
90
- end
87
+ article |> Map . merge ( viewer_has_states ) |> done
88
+ end )
89
+ |> Repo . transaction ( )
90
+ |> result ( )
91
91
end
92
92
93
93
@ doc """
@@ -134,6 +134,23 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do
134
134
end
135
135
end
136
136
137
+ @ doc """
138
+ archive articles based on thread
139
+ called every day by scheuler job
140
+ """
141
+ def archive_articles ( thread ) do
142
+ with { :ok , info } <- match ( thread ) do
143
+ now = Timex . now ( )
144
+ threshold = @ archive_threshold [ thread ] || @ archive_threshold [ :default ]
145
+ archive_threshold = Timex . shift ( now , threshold )
146
+
147
+ info . model
148
+ |> where ( [ article ] , article . inserted_at < ^ archive_threshold )
149
+ |> Repo . update_all ( set: [ is_archived: true , archived_at: now ] )
150
+ |> done ( )
151
+ end
152
+ end
153
+
137
154
defp mark_viewer_has_states ( % { entries: [ ] } = articles , _ ) , do: articles
138
155
139
156
defp mark_viewer_has_states ( % { entries: entries } = articles , user ) do
@@ -237,6 +254,9 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do
237
254
@ doc """
238
255
update a article(post/job ...)
239
256
"""
257
+ def update_article ( % { is_archived: true } , _attrs ) ,
258
+ do: raise_error ( :archived , "article is archived, can not be edit or delete" )
259
+
240
260
def update_article ( article , attrs ) do
241
261
Multi . new ( )
242
262
|> Multi . run ( :update_article , fn _ , _ ->
@@ -317,7 +337,8 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do
317
337
"""
318
338
def mark_delete_article ( thread , id ) do
319
339
with { :ok , info } <- match ( thread ) ,
320
- { :ok , article } <- ORM . find ( info . model , id , preload: :communities ) do
340
+ { :ok , article } <- ORM . find ( info . model , id , preload: :communities ) ,
341
+ false <- article . is_archived do
321
342
Multi . new ( )
322
343
|> Multi . run ( :update_article , fn _ , _ ->
323
344
ORM . update ( article , % { mark_delete: true } )
@@ -327,6 +348,8 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do
327
348
end )
328
349
|> Repo . transaction ( )
329
350
|> result ( )
351
+ else
352
+ true -> raise_error ( :archived , "article is archived, can not be edit or delete" )
330
353
end
331
354
end
332
355