Skip to content

Commit 7a6c1d9

Browse files
committed
refactor: enhance user update process in Accounts module
- Updated the update_user function to include identity handling, improving the user update logic. - Consolidated the migration of old users to ensure data integrity during updates. - Streamlined the transaction process for better error handling and maintainability.
1 parent 7b1655b commit 7a6c1d9

File tree

1 file changed

+39
-26
lines changed

1 file changed

+39
-26
lines changed

lib/algora/accounts/accounts.ex

Lines changed: 39 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ defmodule Algora.Accounts do
270270

271271
case account do
272272
nil -> create_user(info, primary_email, emails, token)
273-
{user, _identity} -> update_user(user, info, primary_email, emails, token)
273+
{user, identity} -> update_user(user, identity, info, primary_email, emails, token)
274274
end
275275
end
276276

@@ -284,9 +284,45 @@ defmodule Algora.Accounts do
284284
|> Repo.insert()
285285
end
286286

287-
def migrate_user(old_user, new_user) do
288-
Repo.delete_all(from(i in Identity, where: i.user_id == ^old_user.id))
287+
def update_user(user, identity, info, primary_email, emails, token) do
288+
old_user = Repo.get_by(User, provider: "github", provider_id: to_string(info["id"]))
289+
290+
identity_changeset = Identity.github_registration_changeset(user, info, primary_email, emails, token)
291+
292+
user_changeset = User.github_registration_changeset(user, info, primary_email, emails, token)
293+
294+
Repo.transact(fn ->
295+
delete_result =
296+
if identity do
297+
Repo.delete(identity)
298+
else
299+
{:ok, nil}
300+
end
289301

302+
migrate_result =
303+
if old_user && old_user.id != user.id do
304+
{:ok, old_user} =
305+
old_user
306+
|> change(provider: nil, provider_id: nil, provider_login: nil, provider_meta: nil)
307+
|> Repo.update()
308+
309+
# TODO: enqueue job
310+
migrate_user(old_user, user)
311+
312+
{:ok, old_user}
313+
else
314+
{:ok, nil}
315+
end
316+
317+
with {:ok, _} <- delete_result,
318+
{:ok, _} <- migrate_result,
319+
{:ok, _} <- Repo.insert(identity_changeset) do
320+
Repo.update(user_changeset)
321+
end
322+
end)
323+
end
324+
325+
def migrate_user(old_user, new_user) do
290326
Repo.update_all(
291327
from(r in Repository, where: r.user_id == ^old_user.id),
292328
set: [user_id: new_user.id]
@@ -318,29 +354,6 @@ defmodule Algora.Accounts do
318354
)
319355
end
320356

321-
def update_user(user, info, primary_email, emails, token) do
322-
old_user = Repo.get_by(User, provider: "github", provider_id: to_string(info["id"]))
323-
324-
Repo.transact(fn ->
325-
if old_user && old_user.id != user.id do
326-
old_user
327-
|> change(provider: nil, provider_id: nil, provider_login: nil, provider_meta: nil)
328-
|> Repo.update()
329-
330-
migrate_user(old_user, user)
331-
end
332-
333-
with {:ok, _} <-
334-
user
335-
|> Identity.github_registration_changeset(info, primary_email, emails, token)
336-
|> Repo.insert() do
337-
user
338-
|> User.github_registration_changeset(info, primary_email, emails, token)
339-
|> Repo.update()
340-
end
341-
end)
342-
end
343-
344357
# def get_user_by_provider_email(provider, email) when provider in [:github] do
345358
# query =
346359
# from(u in User,

0 commit comments

Comments
 (0)