@@ -36,31 +36,33 @@ defmodule GroupherServer.CMS.Delegate.WorksCURD do
36
36
attrs = attrs |> atom_values_to_upcase
37
37
38
38
Multi . new ( )
39
- |> Multi . run ( :update_works_fields , fn _ , _ ->
40
- update_works_fields ( works , attrs )
41
- end )
42
- |> Multi . run ( :update_works , fn _ , % { update_works_fields: works } ->
39
+ |> Multi . run ( :update_works , fn _ , _ ->
43
40
update_article ( works , attrs )
44
41
end )
42
+ |> Multi . run ( :update_works_fields , fn _ , % { update_works: works } ->
43
+ update_works_fields ( works , attrs )
44
+ end )
45
45
|> Repo . transaction ( )
46
46
|> result ( )
47
47
end
48
48
49
49
# update works spec fields
50
50
defp update_works_fields ( % Works { } = works , attrs ) do
51
- techstacks = Map . get ( attrs , :techstacks , [ ] )
52
- cities = Map . get ( attrs , :cities , [ ] )
53
- social_info = Map . get ( attrs , :social_info , [ ] )
54
- app_store = Map . get ( attrs , :app_store , [ ] )
51
+ works = Repo . preload ( works , [ :techstacks , :cities ] )
52
+
53
+ desc = Map . get ( attrs , :desc , works . desc )
54
+ home_link = Map . get ( attrs , :home_link , works . home_link )
55
+ techstacks = Map . get ( attrs , :techstacks , works . techstacks )
56
+ cities = Map . get ( attrs , :cities , works . cities )
57
+ social_info = Map . get ( attrs , :social_info , works . social_info )
58
+ app_store = Map . get ( attrs , :app_store , works . app_store )
55
59
56
60
with { :ok , techstacks } <- get_or_create_techstacks ( techstacks ) ,
57
61
{ :ok , cities } <- get_or_create_cities ( cities ) do
58
- works = Repo . preload ( works , [ :techstacks , :cities ] )
59
-
60
62
works
61
- |> Ecto.Changeset . change ( )
62
- |> Ecto.Changeset . put_assoc ( :techstacks , works . techstacks ++ techstacks )
63
- |> Ecto.Changeset . put_assoc ( :cities , works . cities ++ cities )
63
+ |> Ecto.Changeset . change ( % { desc: desc , home_link: home_link } )
64
+ |> Ecto.Changeset . put_assoc ( :techstacks , uniq_by_raw ( techstacks ) )
65
+ |> Ecto.Changeset . put_assoc ( :cities , uniq_by_raw ( cities ) )
64
66
|> Ecto.Changeset . put_embed ( :social_info , social_info )
65
67
|> Ecto.Changeset . put_embed ( :app_store , app_store )
66
68
|> Repo . update ( )
@@ -71,6 +73,7 @@ defmodule GroupherServer.CMS.Delegate.WorksCURD do
71
73
72
74
defp get_or_create_cities ( cities ) do
73
75
cities
76
+ |> Enum . uniq ( )
74
77
|> Enum . map ( & String . downcase ( & 1 ) )
75
78
|> Enum . reduce ( [ ] , fn title , acc ->
76
79
with { :ok , city } <- get_city ( title ) do
@@ -95,7 +98,7 @@ defmodule GroupherServer.CMS.Delegate.WorksCURD do
95
98
title: community . title ,
96
99
logo: community . logo ,
97
100
desc: community . desc ,
98
- link: "/ #{ community . raw } "
101
+ raw: community . raw
99
102
}
100
103
101
104
{ :error , _ } ->
@@ -131,19 +134,25 @@ defmodule GroupherServer.CMS.Delegate.WorksCURD do
131
134
{ :ok , community } ->
132
135
% {
133
136
title: community . title ,
137
+ raw: community . raw ,
134
138
logo: community . logo ,
135
139
community_link: "/#{ community . raw } " ,
136
140
desc: community . desc
137
141
}
138
142
139
143
{ :error , _ } ->
140
- % { title: title }
144
+ % { title: title , raw: String . downcase ( title ) }
141
145
end
142
146
143
147
ORM . create ( Techstack , attrs )
144
148
end
145
149
146
- defp result ( { :ok , % { create_works: result } } ) , do: { :ok , result }
150
+ defp uniq_by_raw ( list ) do
151
+ Enum . uniq_by ( list , & & 1 . raw )
152
+ end
153
+
154
+ # defp result({:ok, %{create_works: result}}), do: {:ok, result}
155
+ defp result ( { :ok , % { update_works_fields: result } } ) , do: { :ok , result }
147
156
defp result ( { :ok , % { update_works: result } } ) , do: { :ok , result }
148
157
149
158
defp result ( { :error , :create_works , _result , _steps } ) do
0 commit comments