@@ -7,10 +7,28 @@ defmodule MastaniServer.Accounts.Delegate.Customization do
77
88 alias Helper.ORM
99 alias MastaniServer.Accounts
10- alias MastaniServer.Accounts . { User , Customization }
10+
11+ alias Accounts . { User , Customization }
12+ alias Accounts.Delegate.Achievements
1113
1214 @ default_customization get_config ( :customization , :all ) |> Enum . into ( % { } )
1315
16+ def upgrade_by_plan ( % User { } = user , :donate ) do
17+ Achievements . set_member ( user , :donate )
18+ end
19+
20+ def upgrade_by_plan ( % User { } = user , :seninor ) do
21+ Achievements . set_member ( user , :seninor )
22+ end
23+
24+ def upgrade_by_plan ( % User { } = user , :sponsor ) do
25+ Achievements . set_member ( user , :sponsor )
26+ end
27+
28+ def upgrade_by_plan ( % User { } = _user , plan ) do
29+ { :error , "no such plan" }
30+ end
31+
1432 @ doc """
1533 get user's customization, if not have, return default customization
1634 """
@@ -30,80 +48,63 @@ defmodule MastaniServer.Accounts.Delegate.Customization do
3048 """
3149 # for map_size
3250 # see https://stackoverflow.com/questions/33248816/pattern-match-function-against-empty-map
51+
3352 def set_customization ( % User { } = _user , map ) when map_size ( map ) == 0 do
34- { :error , "AccountCustomization: invalid option or not purchased " }
53+ { :error , "AccountCustomization: invalid option or not member " }
3554 end
3655
37- def set_customization ( % User { } = user , map ) when is_map ( map ) do
38- map = map |> map_atom_value ( :string )
56+ def set_customization ( % User { id: user_id } = user , map ) when is_map ( map ) do
57+ with { :ok , % { achievement: achievement } } <- ORM . find ( User , user_id , preload: :achievement ) do
58+ map = map |> map_atom_value ( :string )
3959
40- valid? =
41- map
42- |> Map . keys ( )
43- |> Enum . all? ( & can_set? ( user , & 1 , :boolean ) )
60+ valid? =
61+ map
62+ |> Map . keys ( )
63+ |> Enum . all? ( & c11n_item_require? ( & 1 , achievement ) )
4464
45- case valid? do
46- true ->
47- attrs = Map . merge ( % { user_id: user . id } , map )
48- Customization |> ORM . upsert_by ( [ user_id: user . id ] , attrs )
65+ case valid? do
66+ true ->
67+ attrs = Map . merge ( % { user_id: user . id } , map )
68+ Customization |> ORM . upsert_by ( [ user_id: user . id ] , attrs )
4969
50- false ->
51- { :error , "AccountCustomization: invalid option or not purchased" }
70+ false ->
71+ { :error , "AccountCustomization: invalid option or not member" }
72+ end
5273 end
5374 end
5475
5576 def set_customization ( % User { } = user , key , value \\ true ) do
56- with { :ok , key } <- can_set? ( user , key ) do
57- attrs = Map . put ( % { user_id: user . id } , key , value )
58- Customization |> ORM . upsert_by ( [ user_id: user . id ] , attrs )
77+ with { :ok , % { achievement: achievement } } <- ORM . find ( User , user . id , preload: :achievement ) do
78+ case c11n_item_require? ( key , achievement ) do
79+ true ->
80+ attrs = Map . put ( % { user_id: user . id } , key , value )
81+ Customization |> ORM . upsert_by ( [ user_id: user . id ] , attrs )
82+
83+ false ->
84+ { :error , "AccountCustomization: invalid option or not member" }
85+ end
5986 end
6087 end
6188
62- defp can_set? ( % User { } = user , key , :boolean ) do
63- case can_set? ( % User { } = user , key ) do
64- { :ok , _ } -> true
65- { :error , _ } -> false
66- end
89+ defp c11n_item_require? ( :theme , % {
90+ donate_member: donate_member ,
91+ seninor_member: seninor_member ,
92+ sponsor_member: sponsor_member
93+ } ) do
94+ donate_member or seninor_member or sponsor_member
6795 end
6896
69- def can_set? ( % User { } = user , key ) do
70- cond do
71- key in valid_custom_items ( :free ) ->
72- { :ok , key }
73-
74- key in valid_custom_items ( :advance ) ->
75- Accounts . has_purchased? ( user , key )
76-
77- true ->
78- { :error , "AccountCustomization: invalid option" }
79- end
80- end
81-
82- @ doc """
83- # theme -- user can set a default theme
84- # sidebar_layout -- user can arrange subscribed community index
85- """
86- def valid_custom_items ( :free ) do
87- [
88- :sidebar_layout ,
89- :sidebar_communities_index ,
90- :banner_layout ,
91- :contents_layout ,
92- :content_divider ,
93- :mark_viewed ,
94- :display_density
95- ]
96- end
97-
98- @ doc """
99- # :brainwash_free -- ads free
100- # ::community_chart -- user can access comunity charts
101- """
102- def valid_custom_items ( :advance ) do
103- # NOTE: :brainwash_free aka. "ads_free"
104- # use brainwash to avoid brower-block-plugins
105- [ :theme , :brainwash_free , :community_chart ]
106- end
97+ defp c11n_item_require? ( :banner_layout , _ ) , do: true
98+ defp c11n_item_require? ( :contents_layout , _ ) , do: true
99+ defp c11n_item_require? ( :content_divider , _ ) , do: true
100+ defp c11n_item_require? ( :mark_viewed , _ ) , do: true
101+ defp c11n_item_require? ( :display_density , _ ) , do: true
102+ defp c11n_item_require? ( :sidebar_layout , _ ) , do: true
103+ defp c11n_item_require? ( :sidebar_communities_index , _ ) , do: true
104+ # defp c11n_item_require?(:brainwash_free, _), do: true
105+ # defp c11n_item_require?(:community_chart, _), do: true
106+
107+ defp c11n_item_require? ( _ , _ ) , do: false
107108
108109 defp filter_nil_value ( map ) do
109110 for { k , v } <- map , ! is_nil ( v ) , into: % { } , do: { k , v }
0 commit comments