Skip to content

Commit 6b8e48d

Browse files
authored
Merge pull request #1054 from code-corps/add-intercom-user-hash
Add Intercom user hash
2 parents 4126b07 + 88242cc commit 6b8e48d

File tree

4 files changed

+32
-11
lines changed

4 files changed

+32
-11
lines changed

.env.example

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export CLOUDFRONT_DOMAIN=
77
export GITHUB_APP_CLIENT_ID=
88
export GITHUB_APP_CLIENT_SECRET=
99
export GITHUB_APP_PEM=
10+
export INTERCOM_IDENTITY_SECRET_KEY=
1011
export POSTMARK_API_KEY=
1112
export S3_BUCKET=
1213
export SEGMENT_WRITE_KEY=

config/config.exs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ config :ex_aws, :code_corps,
5050
config :code_corps,
5151
asset_host: System.get_env("CLOUDFRONT_DOMAIN")
5252

53+
config :code_corps,
54+
intercom_identity_secret_key: System.get_env("INTERCOM_IDENTITY_SECRET_KEY")
55+
5356
config :segment,
5457
write_key: System.get_env("SEGMENT_WRITE_KEY")
5558

lib/code_corps_web/views/user_view.ex

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ defmodule CodeCorpsWeb.UserView do
1313

1414
attributes [
1515
:biography, :cloudinary_public_id, :email, :first_name,
16-
:github_avatar_url, :github_id, :github_username, :inserted_at,
17-
:last_name, :name, :photo_large_url, :photo_thumb_url,
16+
:github_avatar_url, :github_id, :github_username, :intercom_user_hash,
17+
:inserted_at, :last_name, :name, :photo_large_url, :photo_thumb_url,
1818
:sign_up_context, :state, :state_transition, :twitter, :username,
1919
:website, :updated_at
2020
]
@@ -45,6 +45,19 @@ defmodule CodeCorpsWeb.UserView do
4545
end
4646
def email(_user, _conn), do: ""
4747

48+
@intercom_secret_key Application.get_env(:code_corps, :intercom_identity_secret_key) || "RANDOM_KEY"
49+
50+
def intercom_user_hash(%{id: id}, _conn) when is_number(id) do
51+
id |> Integer.to_string |> do_intercom_user_hash
52+
end
53+
# def intercom_user_hash(_user, _conn), do: nil
54+
55+
defp do_intercom_user_hash(id_string) do
56+
:crypto.hmac(:sha256, @intercom_secret_key, id_string)
57+
|> Base.encode16
58+
|> String.downcase
59+
end
60+
4861
@doc """
4962
Returns the user's full name when both first and last name are present.
5063
Returns the only user's first name or last name when the other is missing,
@@ -53,6 +66,7 @@ defmodule CodeCorpsWeb.UserView do
5366
def name(%{first_name: first_name, last_name: last_name}, _conn) do
5467
"#{first_name} #{last_name}" |> String.trim |> normalize_name
5568
end
69+
5670
defp normalize_name(name) when name in ["", nil], do: nil
5771
defp normalize_name(name), do: name
5872
end

test/lib/code_corps_web/views/user_view_test.exs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
defmodule CodeCorpsWeb.UserViewTest do
22
use CodeCorpsWeb.ViewCase
33

4+
alias CodeCorpsWeb.UserView
45
alias Phoenix.ConnTest
56
alias Plug.Conn
67

@@ -17,8 +18,9 @@ defmodule CodeCorpsWeb.UserViewTest do
1718
project_user = insert(:project_user, user: user)
1819

1920
host = Application.get_env(:code_corps, :asset_host)
21+
intercom_user_hash = UserView.intercom_user_hash(user, %Plug.Conn{})
2022

21-
rendered_json = render(CodeCorpsWeb.UserView, "show.json-api", data: user)
23+
rendered_json = render(UserView, "show.json-api", data: user)
2224

2325
expected_json = %{
2426
"data" => %{
@@ -33,6 +35,7 @@ defmodule CodeCorpsWeb.UserViewTest do
3335
"github-id" => 123,
3436
"github-username" => "githubuser",
3537
"inserted-at" => user.inserted_at,
38+
"intercom-user-hash" => intercom_user_hash,
3639
"last-name" => "Last",
3740
"name" => "First Last",
3841
"photo-large-url" => "#{host}/icons/user_default_large_blue.png",
@@ -102,7 +105,7 @@ defmodule CodeCorpsWeb.UserViewTest do
102105
ConnTest.build_conn()
103106
|> Conn.assign(:current_user, user)
104107

105-
rendered_json = render(CodeCorpsWeb.UserView, "show.json-api", data: user, conn: conn)
108+
rendered_json = render(UserView, "show.json-api", data: user, conn: conn)
106109
assert rendered_json["data"]["attributes"]["email"] == user.email
107110
end
108111

@@ -114,7 +117,7 @@ defmodule CodeCorpsWeb.UserViewTest do
114117
ConnTest.build_conn()
115118
|> Conn.assign(:current_user, auth_user)
116119

117-
rendered_json = render(CodeCorpsWeb.UserView, "show.json-api", data: users, conn: conn)
120+
rendered_json = render(UserView, "show.json-api", data: users, conn: conn)
118121

119122
emails =
120123
rendered_json["data"]
@@ -126,29 +129,29 @@ defmodule CodeCorpsWeb.UserViewTest do
126129
end
127130

128131
test "renders first and last name as name" do
129-
user = build(:user, first_name: "First", last_name: "Last")
132+
user = build(:user, id: 1, first_name: "First", last_name: "Last")
130133

131134
assert render_user_json(user)["data"]["attributes"]["name"] == "First Last"
132135
end
133136

134137
test "renders first name only as name" do
135-
user = build(:user, first_name: "", last_name: "Last")
138+
user = build(:user, id: 1, first_name: "", last_name: "Last")
136139

137140
assert render_user_json(user)["data"]["attributes"]["name"] == "Last"
138141
end
139142

140143
test "renders last name only as name" do
141-
user = build(:user, first_name: "First", last_name: "")
144+
user = build(:user, id: 1, first_name: "First", last_name: "")
142145

143146
assert render_user_json(user)["data"]["attributes"]["name"] == "First"
144147
end
145148

146149
test "renders nil name if first or last name blank" do
147-
user = build(:user, first_name: "", last_name: "")
150+
user = build(:user, id: 1, first_name: "", last_name: "")
148151

149152
assert render_user_json(user)["data"]["attributes"]["name"] == nil
150153

151-
user = build(:user, first_name: nil, last_name: nil)
154+
user = build(:user, id: 1, first_name: nil, last_name: nil)
152155

153156
assert render_user_json(user)["data"]["attributes"]["name"] == nil
154157
end
@@ -158,6 +161,6 @@ defmodule CodeCorpsWeb.UserViewTest do
158161
ConnTest.build_conn()
159162
|> Conn.assign(:current_user, user)
160163

161-
render(CodeCorpsWeb.UserView, "show.json-api", data: user, conn: conn)
164+
render(UserView, "show.json-api", data: user, conn: conn)
162165
end
163166
end

0 commit comments

Comments
 (0)