Skip to content

Commit 5740509

Browse files
committed
refactor: enhance user update logic in Accounts module
- Introduced a check for existing GitHub users during the update process to prevent conflicts. - Simplified the user parameter handling by consolidating the logic for setting user attributes. - Added validations for email and handle uniqueness, improving data integrity and user management.
1 parent 3571eeb commit 5740509

File tree

2 files changed

+29
-30
lines changed

2 files changed

+29
-30
lines changed

lib/algora/accounts/accounts.ex

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,8 +319,10 @@ defmodule Algora.Accounts do
319319
end
320320

321321
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+
322324
Repo.transact(fn ->
323-
if old_user = Repo.get_by(User, provider: "github", provider_id: to_string(info["id"])) do
325+
if old_user && old_user.id != user.id do
324326
old_user
325327
|> change(provider: nil, provider_id: nil, provider_login: nil, provider_meta: nil)
326328
|> Repo.update()

lib/algora/accounts/schemas/user.ex

Lines changed: 26 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -177,38 +177,32 @@ defmodule Algora.Accounts.User do
177177

178178
if identity_changeset.valid? do
179179
params =
180-
case user.provider_id do
181-
nil ->
182-
%{
183-
"display_name" => info["name"],
184-
"bio" => info["bio"],
185-
"location" => info["location"],
186-
"avatar_url" => info["avatar_url"],
187-
"website_url" => info["blog"],
188-
"github_url" => info["html_url"],
189-
"provider" => "github",
190-
"provider_id" => to_string(info["id"]),
191-
"provider_login" => info["login"],
192-
"provider_meta" => info
193-
}
194-
195-
_ ->
196-
%{
197-
"display_name" => user.display_name || info["name"],
198-
"bio" => user.bio || info["bio"],
199-
"location" => user.location || info["location"],
200-
"avatar_url" => user.avatar_url || info["avatar_url"],
201-
"website_url" => user.website_url || info["blog"],
202-
"github_url" => user.github_url || info["html_url"],
203-
"provider" => "github",
204-
"provider_id" => to_string(info["id"]),
205-
"provider_login" => info["login"],
206-
"provider_meta" => info
207-
}
180+
%{
181+
"handle" => user.handle || Algora.Organizations.ensure_unique_handle(info["login"]),
182+
"email" => user.email || primary_email,
183+
"display_name" => user.display_name || info["name"],
184+
"bio" => user.bio || info["bio"],
185+
"location" => user.location || info["location"],
186+
"avatar_url" => user.avatar_url || info["avatar_url"],
187+
"website_url" => user.website_url || info["blog"],
188+
"github_url" => user.github_url || info["html_url"],
189+
"provider" => "github",
190+
"provider_id" => to_string(info["id"]),
191+
"provider_login" => info["login"],
192+
"provider_meta" => info
193+
}
194+
195+
params =
196+
if is_nil(user.provider_id) do
197+
Map.put(params, "display_name", info["name"])
198+
else
199+
params
208200
end
209201

210202
user
211203
|> cast(params, [
204+
:handle,
205+
:email,
212206
:display_name,
213207
:bio,
214208
:location,
@@ -221,8 +215,11 @@ defmodule Algora.Accounts.User do
221215
:provider_meta
222216
])
223217
|> generate_id()
224-
|> validate_required([:display_name])
218+
|> validate_required([:email, :display_name, :handle])
219+
|> validate_handle()
225220
|> validate_email()
221+
|> unique_constraint(:email)
222+
|> unique_constraint(:handle)
226223
else
227224
user
228225
|> change()

0 commit comments

Comments
 (0)