Fix upsert on discord id conflict

This commit is contained in:
Logan Hunt 2023-02-01 11:58:57 -07:00
parent 4edaae9343
commit 324d041d5c
No known key found for this signature in database
GPG Key ID: 8AC6A4B840C0EC49
2 changed files with 25 additions and 11 deletions

View File

@ -35,11 +35,19 @@ defmodule Chessh.Player do
|> cast(attrs, [:authentications])
end
def discord_changeset(player, attrs) do
player
|> cast(attrs, [:username, :discord_id])
|> validate_username()
|> validate_discord_id()
end
def registration_changeset(player, attrs, opts \\ []) do
player
|> cast(attrs, [:username, :password, :discord_id])
|> validate_username()
|> validate_password(opts)
|> validate_discord_id()
end
def password_changeset(player, attrs, opts \\ []) do
@ -67,13 +75,16 @@ defmodule Chessh.Player do
end
end
defp validate_discord_id(changeset) do
changeset
|> unique_constraint(:discord_id)
end
defp validate_username(changeset) do
changeset
|> validate_required([:username])
|> validate_length(:username, min: 2, max: 16)
|> validate_format(:username, ~r/^[a-zA-Z0-9_\-]*$/,
message: "only letters, numbers, underscores, and hyphens allowed"
)
|> validate_length(:username, min: 2, max: 40)
|> validate_format(:username, ~r/^.{3,32}#[0-9]{4}$/, message: "must match discord tag format")
|> unique_constraint(:username)
end

View File

@ -270,19 +270,22 @@ defmodule Chessh.Web.Endpoint do
%{"username" => username, "discriminator" => discriminator, "id" => discord_id} =
Jason.decode!(String.Chars.to_string(user_details))
%Player{id: id} =
Repo.insert!(
%Player{discord_id: discord_id, username: username <> "#" <> discriminator},
on_conflict: [set: [discord_id: discord_id]],
conflict_target: :discord_id
)
case Repo.get_by(Player, discord_id: discord_id) do
nil -> %Player{discord_id: discord_id}
player -> player
end
|> Player.discord_changeset(%{
username: username <> "#" <> discriminator,
discord_id: discord_id
})
|> Repo.insert_or_update()
{200,
%{
success: true,
jwt:
Token.generate_and_sign!(%{
"uid" => id
"uid" => Repo.get_by(Player, discord_id: discord_id).id
})
}}