Skip to content

Commit c7d0527

Browse files
authored
Merge pull request #1015 from code-corps/949-set-github-user-avatar
Set GitHub user's avatar
2 parents 73ffa78 + 694fe81 commit c7d0527

7 files changed

Lines changed: 79 additions & 6 deletions

File tree

lib/code_corps/accounts/accounts.ex

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@ defmodule CodeCorps.Accounts do
55
All actions to accounts should go through here.
66
"""
77

8+
alias Task.Supervisor, as: TaskSupervisor
89
alias CodeCorps.{
910
Accounts.Changesets,
1011
Comment,
1112
GitHub.Adapters,
1213
GithubAppInstallation,
14+
Task,
1315
User,
14-
Repo,
15-
Task
16+
Repo
1617
}
1718
alias Ecto.{Changeset, Multi}
1819

@@ -23,6 +24,16 @@ defmodule CodeCorps.Accounts do
2324
"""
2425
@spec create_from_github(map) :: {:ok, User.t} | {:error, Changeset.t}
2526
def create_from_github(%{} = attrs) do
27+
with {:ok, user} <- do_create_from_github(attrs) do
28+
user |> upload_github_photo_async
29+
{:ok, user}
30+
else
31+
error -> error
32+
end
33+
end
34+
35+
@spec do_create_from_github(map) :: {:ok, User.t} | {:error, Changeset.t}
36+
defp do_create_from_github(%{} = attrs) do
2637
%User{}
2738
|> Changesets.create_from_github_changeset(attrs)
2839
|> Repo.insert
@@ -56,6 +67,20 @@ defmodule CodeCorps.Accounts do
5667
end
5768
end
5869

70+
defp upload_github_photo_async(%User{} = user) do
71+
TaskSupervisor.start_child(:background_processor, fn -> upload_github_photo(user) end)
72+
end
73+
74+
defp upload_github_photo(%User{github_avatar_url: github_avatar_url} = user) do
75+
[ok: %Cloudex.UploadedImage{public_id: cloudinary_public_id}] =
76+
github_avatar_url
77+
|> CodeCorps.Cloudex.Uploader.upload()
78+
79+
user
80+
|> Changeset.change(%{cloudinary_public_id: cloudinary_public_id})
81+
|> Repo.update!
82+
end
83+
5984
@spec associate_installations(User.t) :: {:ok, list(GithubAppInstallation.t)}
6085
defp associate_installations(%User{id: user_id, github_id: github_id}) do
6186
updates = [set: [user_id: user_id]]

lib/code_corps/cloudex/cloudex_test.ex

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,14 @@ defmodule CloudexTest do
1313
"https://placehold.it/500x500"
1414
end
1515
end
16+
17+
@spec upload(String.t) :: Cloudex.UploadedImage.t
18+
def upload(_url) do
19+
[ok: %Cloudex.UploadedImage{public_id: fake_cloudinary_id()}]
20+
end
21+
22+
defp fake_cloudinary_id do
23+
:crypto.strong_rand_bytes(5)
24+
|> Base.encode64
25+
end
1626
end

lib/code_corps/cloudex/uploader.ex

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
defmodule CodeCorps.Cloudex.Uploader do
2+
3+
@cloudex Application.get_env(:code_corps, :cloudex)
4+
5+
def upload(url) do
6+
@cloudex.upload(url)
7+
end
8+
end

lib/code_corps/github/event/issues/user_linker.ex

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ defmodule CodeCorps.GitHub.Event.Issues.UserLinker do
1717
}
1818

1919
@typep linking_result :: {:ok, User.t} |
20-
{:error, Ecto.Changeset.t}
20+
{:error, Ecto.Changeset.t} |
2121
{:error, :multiple_users}
2222

2323
@doc ~S"""
@@ -47,7 +47,8 @@ defmodule CodeCorps.GitHub.Event.Issues.UserLinker do
4747
defp match_users(
4848
%{
4949
"issue" => %{"number" => github_issue_number},
50-
"repository" =>%{"id" => github_repo_id}}) do
50+
"repository" =>%{"id" => github_repo_id}
51+
}) do
5152

5253
query = from u in User,
5354
distinct: u.id,

lib/code_corps/presenters/image_presenter.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ defmodule CodeCorps.Presenters.ImagePresenter do
22
alias CodeCorps.{Project, User}
33
alias CodeCorps.Cloudex.CloudinaryUrl
44

5-
@logo_options %{crop: "fill", height: 500, width: 500}
5+
@large_options %{crop: "fill", height: 500, width: 500}
66

77
def large(%Project{} = project), do: do_large(project, "project")
88
def large(%User{} = user), do: do_large(user, "user")
99

1010
defp do_large(%{cloudinary_public_id: cloudinary_id, default_color: color}, type),
11-
do: cloudinary_image(cloudinary_id, @logo_options, "large", color, type)
11+
do: cloudinary_image(cloudinary_id, @large_options, "large", color, type)
1212

1313
@thumb_options %{crop: "fill", height: 100, width: 100}
1414

test/lib/code_corps/accounts/accounts_test.exs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
defmodule CodeCorps.AccountsTest do
22
@moduledoc false
33

4+
use CodeCorps.BackgroundProcessingCase
45
use CodeCorps.DbAccessCase
56

67
alias CodeCorps.{Accounts, User, GitHub.TestHelpers}
@@ -13,6 +14,8 @@ defmodule CodeCorps.AccountsTest do
1314
|> TestHelpers.load_endpoint_fixture
1415
|> Accounts.create_from_github
1516

17+
wait_for_supervisor()
18+
1619
assert user.id
1720
assert user.default_color
1821
assert user.sign_up_context == "github"
@@ -29,8 +32,22 @@ defmodule CodeCorps.AccountsTest do
2932
payload
3033
|> Accounts.create_from_github
3134

35+
wait_for_supervisor()
36+
3237
assert changeset.errors[:email] == {"has already been taken", []}
3338
end
39+
40+
test "uploads photo from GitHub avatar" do
41+
{:ok, %User{} = user} =
42+
"user"
43+
|> TestHelpers.load_endpoint_fixture
44+
|> Accounts.create_from_github
45+
46+
wait_for_supervisor()
47+
48+
user = Repo.get(User, user.id)
49+
assert user.cloudinary_public_id
50+
end
3451
end
3552

3653
describe "update_from_github_oauth/3" do
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
defmodule CodeCorps.Cloudex.UploaderTest do
2+
alias CodeCorps.Cloudex.Uploader
3+
use ExUnit.Case, async: true
4+
5+
test "returns the public_id" do
6+
[ok: %Cloudex.UploadedImage{public_id: public_id}] =
7+
"https://placehold.it/500x500"
8+
|> Uploader.upload
9+
10+
assert public_id
11+
end
12+
end

0 commit comments

Comments
 (0)