@@ -12,6 +12,8 @@ defmodule GroupherServer.CMS.Delegate.WorksCURD do
12
12
alias CMS.Model . { Community , Techstack , City , Works }
13
13
alias Accounts.Model.User
14
14
15
+ @ default_user_meta Accounts.Model.Embeds.UserMeta . default_meta ( )
16
+
15
17
alias Helper.ORM
16
18
alias Ecto.Multi
17
19
@@ -48,21 +50,24 @@ defmodule GroupherServer.CMS.Delegate.WorksCURD do
48
50
49
51
# update works spec fields
50
52
defp update_works_fields ( % Works { } = works , attrs ) do
51
- works = Repo . preload ( works , [ :techstacks , :cities ] )
53
+ works = Repo . preload ( works , [ :techstacks , :cities , :teammates ] )
52
54
53
55
cover = Map . get ( attrs , :cover , works . cover )
54
56
desc = Map . get ( attrs , :desc , works . desc )
55
57
home_link = Map . get ( attrs , :home_link , works . home_link )
56
58
techstacks = Map . get ( attrs , :techstacks , works . techstacks )
59
+ teammates = Map . get ( attrs , :teammates , works . teammates )
57
60
cities = Map . get ( attrs , :cities , works . cities )
58
61
social_info = Map . get ( attrs , :social_info , works . social_info )
59
62
app_store = Map . get ( attrs , :app_store , works . app_store )
60
63
61
64
with { :ok , techstacks } <- get_or_create_techstacks ( techstacks ) ,
62
- { :ok , cities } <- get_or_create_cities ( cities ) do
65
+ { :ok , cities } <- get_or_create_cities ( cities ) ,
66
+ { :ok , teammates } <- get_teammates ( teammates ) do
63
67
works
64
68
|> Ecto.Changeset . change ( % { cover: cover , desc: desc , home_link: home_link } )
65
69
|> Ecto.Changeset . put_assoc ( :techstacks , uniq_by_raw ( techstacks ) )
70
+ |> Ecto.Changeset . put_assoc ( :teammates , uniq_by_login ( teammates ) )
66
71
|> Ecto.Changeset . put_assoc ( :cities , uniq_by_raw ( cities ) )
67
72
|> Ecto.Changeset . put_embed ( :social_info , social_info )
68
73
|> Ecto.Changeset . put_embed ( :app_store , app_store )
@@ -109,6 +114,29 @@ defmodule GroupherServer.CMS.Delegate.WorksCURD do
109
114
ORM . create ( City , attrs )
110
115
end
111
116
117
+ defp get_teammates ( [ ] ) , do: { :ok , [ ] }
118
+
119
+ defp get_teammates ( teammates ) do
120
+ teammates
121
+ |> Enum . reduce ( [ ] , fn login , acc ->
122
+ with { :ok , teammate } <- ORM . find_by ( User , login: login ) ,
123
+ { :ok , _ } <- set_teammate_flag ( teammate ) do
124
+ acc ++ [ teammate ]
125
+ end
126
+ end )
127
+ |> done
128
+ end
129
+
130
+ defp set_teammate_flag ( % User { meta: nil } = teammate ) do
131
+ meta = Map . merge ( @ default_user_meta , % { is_maker: true } )
132
+ ORM . update_meta ( teammate , meta )
133
+ end
134
+
135
+ defp set_teammate_flag ( % User { } = teammate ) do
136
+ meta = Map . merge ( teammate . meta , % { is_maker: true } )
137
+ ORM . update_meta ( teammate , meta )
138
+ end
139
+
112
140
defp get_or_create_techstacks ( [ ] ) , do: { :ok , [ ] }
113
141
114
142
defp get_or_create_techstacks ( techstacks ) do
@@ -148,9 +176,10 @@ defmodule GroupherServer.CMS.Delegate.WorksCURD do
148
176
ORM . create ( Techstack , attrs )
149
177
end
150
178
151
- defp uniq_by_raw ( list ) do
152
- Enum . uniq_by ( list , & & 1 . raw )
153
- end
179
+ defp uniq_by_raw ( [ ] ) , do: [ ]
180
+ defp uniq_by_raw ( list ) , do: Enum . uniq_by ( list , & & 1 . raw )
181
+ defp uniq_by_login ( [ ] ) , do: [ ]
182
+ defp uniq_by_login ( list ) , do: Enum . uniq_by ( list , & & 1 . login )
154
183
155
184
# defp result({:ok, %{create_works: result}}), do: {:ok, result}
156
185
defp result ( { :ok , % { update_works_fields: result } } ) , do: { :ok , result }
0 commit comments