@@ -5,33 +5,46 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do
55 import Ecto.Query , warn: false
66
77 import GroupherServer.CMS.Utils.Matcher2
8+ import GroupherServer.CMS.Utils.Matcher , only: [ match_action: 2 ]
89
9- import GroupherServer.CMS.Utils.Matcher , only: [ match_action: 2 , dynamic_where: 2 ]
1010 import Helper.Utils , only: [ done: 1 , pick_by: 2 , integerfy: 1 ]
1111 import Helper.ErrorCode
12- import ShortMaps
1312
13+ alias Helper . { Later , ORM }
1414 alias GroupherServer . { Accounts , CMS , Delivery , Email , Repo , Statistics }
1515
1616 alias Accounts.User
1717 alias CMS . { Author , Community , PinnedArticle , Embeds , Delegate , Tag }
1818
1919 alias Delegate.ArticleOperation
20- alias Helper . { Later , ORM , QueryBuilder }
2120
2221 alias Ecto.Multi
2322
2423 @ default_article_meta Embeds.ArticleMeta . default_meta ( )
2524
2625 @ doc """
27- login user read cms content by add views count and viewer record
26+ read articles for un-logined user
2827 """
29- def read_content ( thread , id , % User { id: user_id } ) do
30- condition = % { user_id: user_id } |> Map . merge ( content_id ( thread , id ) )
28+ def read_article ( thread , id ) do
29+ with { :ok , info } <- match ( thread ) do
30+ ORM . read ( info . model , id , inc: :views )
31+ end
32+ end
3133
32- with { :ok , action } <- match_action ( thread , :self ) ,
33- { :ok , _viewer } <- action . viewer |> ORM . findby_or_insert ( condition , condition ) do
34- action . target |> ORM . read ( id , inc: :views )
34+ @ doc """
35+ read articles for logined user
36+ """
37+ def read_article ( thread , id , % User { id: user_id } ) do
38+ with { :ok , info } <- match ( thread ) do
39+ Multi . new ( )
40+ |> Multi . run ( :inc_views , fn _ , _ ->
41+ ORM . read ( info . model , id , inc: :views )
42+ end )
43+ |> Multi . run ( :add_viewed_user , fn _ , % { inc_views: article } ->
44+ update_viewed_user_list ( article , user_id )
45+ end )
46+ |> Repo . transaction ( )
47+ |> read_result ( )
3548 end
3649 end
3750
@@ -417,4 +430,32 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do
417430 end
418431
419432 defp exec_update_tags ( _content , _ ) , do: { :ok , :pass }
433+
434+ defp update_viewed_user_list ( % { meta: nil } = article , user_id ) do
435+ new_ids = Enum . uniq ( [ user_id ] ++ @ default_article_meta . viewed_user_ids )
436+ updated_meta = @ default_article_meta |> Map . merge ( % { viewed_user_ids: new_ids } )
437+
438+ article
439+ |> Ecto.Changeset . change ( )
440+ |> Ecto.Changeset . put_embed ( :meta , updated_meta )
441+ |> Repo . update ( )
442+ end
443+
444+ defp update_viewed_user_list ( % { meta: meta } = article , user_id ) do
445+ new_ids = Enum . uniq ( [ user_id ] ++ meta . viewed_user_ids )
446+
447+ updated_meta =
448+ meta |> Map . merge ( % { viewed_user_ids: new_ids } ) |> Map . from_struct ( ) |> Map . delete ( :id )
449+
450+ article
451+ |> Ecto.Changeset . change ( )
452+ |> Ecto.Changeset . put_embed ( :meta , updated_meta )
453+ |> Repo . update ( )
454+ end
455+
456+ defp read_result ( { :ok , % { inc_views: result } } ) , do: result |> done ( )
457+
458+ defp read_result ( { :error , _ , result , _steps } ) do
459+ { :error , result }
460+ end
420461end
0 commit comments