@@ -12,6 +12,8 @@ defmodule GroupherServer.CMS.Delegate.WorksCURD do
1212 alias CMS.Model . { Community , Techstack , City , Works }
1313 alias Accounts.Model.User
1414
15+ @ default_user_meta Accounts.Model.Embeds.UserMeta . default_meta ( )
16+
1517 alias Helper.ORM
1618 alias Ecto.Multi
1719
@@ -48,21 +50,24 @@ defmodule GroupherServer.CMS.Delegate.WorksCURD do
4850
4951 # update works spec fields
5052 defp update_works_fields ( % Works { } = works , attrs ) do
51- works = Repo . preload ( works , [ :techstacks , :cities ] )
53+ works = Repo . preload ( works , [ :techstacks , :cities , :teammates ] )
5254
5355 cover = Map . get ( attrs , :cover , works . cover )
5456 desc = Map . get ( attrs , :desc , works . desc )
5557 home_link = Map . get ( attrs , :home_link , works . home_link )
5658 techstacks = Map . get ( attrs , :techstacks , works . techstacks )
59+ teammates = Map . get ( attrs , :teammates , works . teammates )
5760 cities = Map . get ( attrs , :cities , works . cities )
5861 social_info = Map . get ( attrs , :social_info , works . social_info )
5962 app_store = Map . get ( attrs , :app_store , works . app_store )
6063
6164 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
6367 works
6468 |> Ecto.Changeset . change ( % { cover: cover , desc: desc , home_link: home_link } )
6569 |> Ecto.Changeset . put_assoc ( :techstacks , uniq_by_raw ( techstacks ) )
70+ |> Ecto.Changeset . put_assoc ( :teammates , uniq_by_login ( teammates ) )
6671 |> Ecto.Changeset . put_assoc ( :cities , uniq_by_raw ( cities ) )
6772 |> Ecto.Changeset . put_embed ( :social_info , social_info )
6873 |> Ecto.Changeset . put_embed ( :app_store , app_store )
@@ -109,6 +114,29 @@ defmodule GroupherServer.CMS.Delegate.WorksCURD do
109114 ORM . create ( City , attrs )
110115 end
111116
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+
112140 defp get_or_create_techstacks ( [ ] ) , do: { :ok , [ ] }
113141
114142 defp get_or_create_techstacks ( techstacks ) do
@@ -148,9 +176,10 @@ defmodule GroupherServer.CMS.Delegate.WorksCURD do
148176 ORM . create ( Techstack , attrs )
149177 end
150178
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 )
154183
155184 # defp result({:ok, %{create_works: result}}), do: {:ok, result}
156185 defp result ( { :ok , % { update_works_fields: result } } ) , do: { :ok , result }
0 commit comments