@@ -111,79 +111,93 @@ defmodule Algora.Organizations do
111111 end )
112112 end
113113
114- def onboard_organization_from_domain ( domain , opts \\ % { } ) do
115- case Algora.Crawler . fetch_site_metadata ( domain ) do
116- { :ok , metadata } ->
117- org_name =
118- case get_in ( metadata , [ :display_name ] ) do
119- nil ->
120- domain
121- |> String . split ( "." )
122- |> List . first ( )
123- |> String . capitalize ( )
124-
125- name ->
126- name
127- end
114+ def parse_site_metadata ( domain , metadata , opts \\ % { } ) do
115+ org_name =
116+ case get_in ( metadata , [ :display_name ] ) do
117+ nil ->
118+ domain
119+ |> String . split ( "." )
120+ |> List . first ( )
121+ |> String . capitalize ( )
128122
129- org_handle =
130- case get_in ( metadata , [ :handle ] ) do
131- nil ->
132- domain
133- |> String . split ( "." )
134- |> List . first ( )
135- |> String . downcase ( )
136-
137- handle ->
138- handle
123+ name ->
124+ name
125+ end
126+
127+ org_handle =
128+ case get_in ( metadata , [ :handle ] ) do
129+ nil ->
130+ domain
131+ |> String . split ( "." )
132+ |> List . first ( )
133+ |> String . downcase ( )
134+
135+ handle ->
136+ handle
137+ end
138+
139+ Map . merge (
140+ % {
141+ display_name: org_name ,
142+ bio: get_in ( metadata , [ :bio ] ) || get_in ( metadata , [ :og_description ] ) || get_in ( metadata , [ :og_title ] ) ,
143+ avatar_url: get_in ( metadata , [ :avatar_url ] ) || get_in ( metadata , [ :favicon_url ] ) ,
144+ handle: org_handle ,
145+ domain: domain ,
146+ og_title: get_in ( metadata , [ :og_title ] ) ,
147+ og_image_url: get_in ( metadata , [ :og_image_url ] ) ,
148+ website_url: get_in ( metadata , [ :website_url ] ) ,
149+ twitter_url: get_in ( metadata , [ :socials , :twitter ] ) ,
150+ github_url: get_in ( metadata , [ :socials , :github ] ) ,
151+ youtube_url: get_in ( metadata , [ :socials , :youtube ] ) ,
152+ twitch_url: get_in ( metadata , [ :socials , :twitch ] ) ,
153+ discord_url: get_in ( metadata , [ :socials , :discord ] ) ,
154+ slack_url: get_in ( metadata , [ :socials , :slack ] ) ,
155+ linkedin_url: get_in ( metadata , [ :socials , :linkedin ] )
156+ } ,
157+ opts
158+ )
159+ end
160+
161+ def onboard_organization_from_domain ( domain , opts \\ % { } ) do
162+ # Use provided metadata or fetch it
163+ result =
164+ case Map . get ( opts , :metadata ) do
165+ nil ->
166+ case Algora.Crawler . fetch_site_metadata ( domain ) do
167+ { :ok , metadata } -> { :ok , parse_site_metadata ( domain , metadata , opts ) }
168+ { :error , reason } -> { :error , reason }
139169 end
140170
141- params =
142- Map . merge (
143- % {
144- display_name: org_name ,
145- bio: get_in ( metadata , [ :bio ] ) || get_in ( metadata , [ :og_description ] ) || get_in ( metadata , [ :og_title ] ) ,
146- avatar_url: get_in ( metadata , [ :avatar_url ] ) || get_in ( metadata , [ :favicon_url ] ) ,
147- handle: org_handle ,
148- domain: domain ,
149- og_title: get_in ( metadata , [ :og_title ] ) ,
150- og_image_url: get_in ( metadata , [ :og_image_url ] ) ,
151- website_url: get_in ( metadata , [ :website_url ] ) ,
152- twitter_url: get_in ( metadata , [ :socials , :twitter ] ) ,
153- github_url: get_in ( metadata , [ :socials , :github ] ) ,
154- youtube_url: get_in ( metadata , [ :socials , :youtube ] ) ,
155- twitch_url: get_in ( metadata , [ :socials , :twitch ] ) ,
156- discord_url: get_in ( metadata , [ :socials , :discord ] ) ,
157- slack_url: get_in ( metadata , [ :socials , :slack ] ) ,
158- linkedin_url: get_in ( metadata , [ :socials , :linkedin ] )
159- } ,
160- opts
161- )
171+ metadata ->
172+ { :ok , metadata }
173+ end
162174
175+ case result do
176+ { :ok , metadata } ->
163177 org = Repo . one ( from o in User , where: o . domain == ^ domain , limit: 1 )
164178
165179 org_handle =
166180 case org do
167- nil -> ensure_unique_org_handle ( params . handle )
181+ nil -> ensure_unique_org_handle ( metadata . handle )
168182 org -> org . handle
169183 end
170184
171185 case org do
172186 nil ->
173187 % User { type: :organization }
174- |> Org . changeset ( Map . put ( params , :handle , org_handle ) )
188+ |> Org . changeset ( Map . put ( metadata , :handle , org_handle ) )
175189 |> Repo . insert ( )
176190
177191 existing_org ->
178- params =
192+ metadata =
179193 if existing_org . handle do
180- Map . delete ( params , :handle )
194+ Map . delete ( metadata , :handle )
181195 else
182- params
196+ metadata
183197 end
184198
185199 existing_org
186- |> Org . changeset ( params )
200+ |> Org . changeset ( metadata )
187201 |> Repo . update ( )
188202 end
189203
0 commit comments