Skip to content

Commit ea89d8e

Browse files
authored
Merge pull request #1173 from code-corps/1159-fix-github-oauth-user-connect
Fix Github user OAuth connection
2 parents 8f829ff + ef0395d commit ea89d8e

File tree

6 files changed

+45
-3
lines changed

6 files changed

+45
-3
lines changed

lib/code_corps/accounts/accounts.ex

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ defmodule CodeCorps.Accounts do
9494

9595
multi =
9696
Multi.new
97+
|> Multi.run(:existing_user, fn _ -> params |> update_existing_user_if_any() end)
9798
|> Multi.update(:user, changeset)
9899
|> Multi.run(:installations, fn %{user: %User{} = user} -> user |> associate_installations() end)
99100
|> Multi.run(:tasks, fn %{user: %User{} = user} -> user |> associate_tasks() end)
@@ -108,6 +109,20 @@ defmodule CodeCorps.Accounts do
108109
end
109110
end
110111

112+
defp update_existing_user_if_any(%{github_id: github_id}) do
113+
case Repo.get_by(User, github_id: github_id, sign_up_context: "github") do
114+
%User{} = existing_user -> existing_user |> do_update_existing_user()
115+
_ -> {:ok, nil}
116+
end
117+
end
118+
119+
defp do_update_existing_user(%User{github_id: github_id} = user) do
120+
params = %{github_id: nil, github_id_was: github_id}
121+
user
122+
|> Changesets.dissociate_github_user_changeset(params)
123+
|> Repo.update()
124+
end
125+
111126
defp upload_github_photo_async(%User{cloudinary_public_id: nil} = user) do
112127
TaskSupervisor.start_child(:background_processor, fn -> upload_github_photo(user) end)
113128
end

lib/code_corps/accounts/changesets.ex

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@ defmodule CodeCorps.Accounts.Changesets do
5050
|> unique_github_constraint()
5151
end
5252

53+
def dissociate_github_user_changeset(struct, %{} = params) do
54+
struct
55+
|> Changeset.cast(params, [:github_id, :github_id_was])
56+
|> unique_github_constraint()
57+
end
58+
5359
@spec ensure_email_without_overwriting(Changeset.t, map) :: Changeset.t
5460
defp ensure_email_without_overwriting(%Changeset{} = changeset, %{"email" => new_email} = _params) do
5561
case changeset |> Changeset.get_field(:email) do

lib/code_corps/model/user.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ defmodule CodeCorps.User do
2727
field :github_avatar_url, :string
2828
field :github_email, :string
2929
field :github_id, :integer
30+
field :github_id_was, :integer
3031
field :github_username, :string
3132
field :last_name, :string
3233
field :password, :string, virtual: true
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
defmodule CodeCorps.Repo.Migrations.AddGithubIdWas do
2+
use Ecto.Migration
3+
4+
def change do
5+
alter table(:users) do
6+
add :github_id_was, :integer
7+
end
8+
end
9+
end

priv/repo/structure.sql

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1745,7 +1745,8 @@ CREATE TABLE users (
17451745
github_username character varying(255),
17461746
github_id integer,
17471747
type character varying(255) DEFAULT 'user'::character varying,
1748-
github_user_id bigint
1748+
github_user_id bigint,
1749+
github_id_was integer
17491750
);
17501751

17511752

@@ -3867,5 +3868,5 @@ ALTER TABLE ONLY users
38673868
-- PostgreSQL database dump complete
38683869
--
38693870

3870-
INSERT INTO "schema_migrations" (version) VALUES (20160723215749), (20160804000000), (20160804001111), (20160805132301), (20160805203929), (20160808143454), (20160809214736), (20160810124357), (20160815125009), (20160815143002), (20160816020347), (20160816034021), (20160817220118), (20160818000944), (20160818132546), (20160820113856), (20160820164905), (20160822002438), (20160822004056), (20160822011624), (20160822020401), (20160822044612), (20160830081224), (20160830224802), (20160911233738), (20160912002705), (20160912145957), (20160918003206), (20160928232404), (20161003185918), (20161019090945), (20161019110737), (20161020144622), (20161021131026), (20161031001615), (20161121005339), (20161121014050), (20161121043941), (20161121045709), (20161122015942), (20161123081114), (20161123150943), (20161124085742), (20161125200620), (20161126045705), (20161127054559), (20161205024856), (20161207112519), (20161209192504), (20161212005641), (20161214005935), (20161215052051), (20161216051447), (20161218005913), (20161219160401), (20161219163909), (20161220141753), (20161221085759), (20161226213600), (20161231063614), (20170102130055), (20170102181053), (20170104113708), (20170104212623), (20170104235423), (20170106013143), (20170115035159), (20170115230549), (20170121014100), (20170131234029), (20170201014901), (20170201025454), (20170201035458), (20170201183258), (20170220032224), (20170224233516), (20170226050552), (20170228085250), (20170308214128), (20170308220713), (20170308222552), (20170313130611), (20170318032449), (20170318082740), (20170324194827), (20170424215355), (20170501225441), (20170505224222), (20170526095401), (20170602000208), (20170622205732), (20170626231059), (20170628092119), (20170628213609), (20170629183404), (20170630140136), (20170706132431), (20170707213648), (20170711122252), (20170717092127), (20170725060612), (20170727052644), (20170731130121), (20170814131722), (20170913114958), (20170921014405), (20170925214512), (20170925230419), (20170926134646), (20170927100300), (20170928234412), (20171003134956), (20171003225853), (20171006063358), (20171006161407), (20171012215106), (20171012221231), (20171016125229), (20171016125516), (20171016223356), (20171016235656), (20171017235433), (20171019191035), (20171025184225), (20171026010933), (20171027061833), (20171028011642), (20171028173508), (20171030182857), (20171031232023), (20171031234356), (20171101023309), (20171104013543), (20171106045740), (20171106050209), (20171106103153), (20171106200036);
3871+
INSERT INTO "schema_migrations" (version) VALUES (20160723215749), (20160804000000), (20160804001111), (20160805132301), (20160805203929), (20160808143454), (20160809214736), (20160810124357), (20160815125009), (20160815143002), (20160816020347), (20160816034021), (20160817220118), (20160818000944), (20160818132546), (20160820113856), (20160820164905), (20160822002438), (20160822004056), (20160822011624), (20160822020401), (20160822044612), (20160830081224), (20160830224802), (20160911233738), (20160912002705), (20160912145957), (20160918003206), (20160928232404), (20161003185918), (20161019090945), (20161019110737), (20161020144622), (20161021131026), (20161031001615), (20161121005339), (20161121014050), (20161121043941), (20161121045709), (20161122015942), (20161123081114), (20161123150943), (20161124085742), (20161125200620), (20161126045705), (20161127054559), (20161205024856), (20161207112519), (20161209192504), (20161212005641), (20161214005935), (20161215052051), (20161216051447), (20161218005913), (20161219160401), (20161219163909), (20161220141753), (20161221085759), (20161226213600), (20161231063614), (20170102130055), (20170102181053), (20170104113708), (20170104212623), (20170104235423), (20170106013143), (20170115035159), (20170115230549), (20170121014100), (20170131234029), (20170201014901), (20170201025454), (20170201035458), (20170201183258), (20170220032224), (20170224233516), (20170226050552), (20170228085250), (20170308214128), (20170308220713), (20170308222552), (20170313130611), (20170318032449), (20170318082740), (20170324194827), (20170424215355), (20170501225441), (20170505224222), (20170526095401), (20170602000208), (20170622205732), (20170626231059), (20170628092119), (20170628213609), (20170629183404), (20170630140136), (20170706132431), (20170707213648), (20170711122252), (20170717092127), (20170725060612), (20170727052644), (20170731130121), (20170814131722), (20170913114958), (20170921014405), (20170925214512), (20170925230419), (20170926134646), (20170927100300), (20170928234412), (20171003134956), (20171003225853), (20171006063358), (20171006161407), (20171012215106), (20171012221231), (20171016125229), (20171016125516), (20171016223356), (20171016235656), (20171017235433), (20171019191035), (20171025184225), (20171026010933), (20171027061833), (20171028011642), (20171028173508), (20171030182857), (20171031232023), (20171031234356), (20171101023309), (20171104013543), (20171106045740), (20171106050209), (20171106103153), (20171106200036), (20171109231538);
38713872

test/lib/code_corps/accounts/accounts_test.exs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,17 +68,27 @@ defmodule CodeCorps.AccountsTest do
6868
describe "update_from_github_oauth/3" do
6969
test "updates proper user from provided payload" do
7070
user = insert(:user)
71-
params = TestHelpers.load_endpoint_fixture("user")
71+
%{"id" => github_id} = params = TestHelpers.load_endpoint_fixture("user")
7272
token = "random_token"
7373

74+
{:ok, %User{} = user_for_github_user} =
75+
params
76+
|> Accounts.create_from_github()
77+
7478
{:ok, %User{} = user} =
7579
user
7680
|> Accounts.update_from_github_oauth(params, token)
7781

7882
wait_for_supervisor()
7983

84+
user_for_github_user = Repo.get(User, user_for_github_user.id)
85+
86+
assert user_for_github_user.sign_up_context == "github"
87+
assert user_for_github_user.github_id_was == github_id
88+
refute user_for_github_user.github_id
8089
assert user.id
8190
assert user.github_auth_token == token
91+
assert user.github_id == github_id
8292
assert user.sign_up_context == "default"
8393
assert user.type == "user"
8494
end

0 commit comments

Comments
 (0)