@@ -7,10 +7,28 @@ defmodule MastaniServer.Accounts.Delegate.Customization do
7
7
8
8
alias Helper.ORM
9
9
alias MastaniServer.Accounts
10
- alias MastaniServer.Accounts . { User , Customization }
10
+
11
+ alias Accounts . { User , Customization }
12
+ alias Accounts.Delegate.Achievements
11
13
12
14
@ default_customization get_config ( :customization , :all ) |> Enum . into ( % { } )
13
15
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
+
14
32
@ doc """
15
33
get user's customization, if not have, return default customization
16
34
"""
@@ -30,80 +48,63 @@ defmodule MastaniServer.Accounts.Delegate.Customization do
30
48
"""
31
49
# for map_size
32
50
# see https://stackoverflow.com/questions/33248816/pattern-match-function-against-empty-map
51
+
33
52
def set_customization ( % User { } = _user , map ) when map_size ( map ) == 0 do
34
- { :error , "AccountCustomization: invalid option or notpurchased " }
53
+ { :error , "AccountCustomization: invalid option or notmember " }
35
54
end
36
55
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 )
39
59
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 ) )
44
64
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 )
49
69
50
- false ->
51
- { :error , "AccountCustomization: invalid option or not purchased" }
70
+ false ->
71
+ { :error , "AccountCustomization: invalid option or not member" }
72
+ end
52
73
end
53
74
end
54
75
55
76
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
59
86
end
60
87
end
61
88
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
67
95
end
68
96
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
107
108
108
109
defp filter_nil_value ( map ) do
109
110
for { k , v } <- map , ! is_nil ( v ) , into: % { } , do: { k , v }