Skip to content

Commit 17ff2bc

Browse files
irefbegedin
authored andcommitted
Track project events (#1364)
Track project membership request and acceptance from the perspective of project and user
1 parent 5233619 commit 17ff2bc

File tree

9 files changed

+91
-17
lines changed

9 files changed

+91
-17
lines changed

lib/code_corps/analytics/segment_data_extractor.ex

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,14 @@ defmodule CodeCorps.Analytics.SegmentDataExtractor do
77
def get_action(%Plug.Conn{private: %{phoenix_action: action}}), do: action
88
def get_action(_), do: nil
99

10+
@doc """
11+
Tries to extract project id from given resource.
12+
Returns `nil` if project id can't be extracted.
13+
"""
14+
@spec get_project_id(CodeCorps.ProjectUser.t) :: String.t | nil
15+
def get_project_id(%CodeCorps.ProjectUser{project_id: id}), do: "project_#{id}"
16+
def get_project_id(_), do: nil
17+
1018
@spec get_resource(Plug.Conn.t) :: struct
1119
def get_resource(%Plug.Conn{assigns: %{data: data}}), do: data
1220
# these are used for delete actions on records that support it

lib/code_corps/analytics/segment_event_name_builder.ex

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,6 @@ defmodule CodeCorps.Analytics.SegmentEventNameBuilder do
1414
defp get_event_name(:update, %CodeCorps.DonationGoal{}) do
1515
"Updated Donation Goal"
1616
end
17-
defp get_event_name(:create, %CodeCorps.ProjectUser{}) do
18-
"Requested Project Membership"
19-
end
20-
defp get_event_name(:update, %CodeCorps.ProjectUser{}) do
21-
"Approved Project Membership"
22-
end
2317
defp get_event_name(:payment_succeeded, %CodeCorps.StripeInvoice{}) do
2418
"Processed Subscription Payment"
2519
end

lib/code_corps/analytics/segment_tracking_support.ex

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ defmodule CodeCorps.Analytics.SegmentTrackingSupport do
1111
def includes?(:update, %CodeCorps.Comment{}), do: true
1212
def includes?(:create, %CodeCorps.DonationGoal{}), do: true
1313
def includes?(:update, %CodeCorps.DonationGoal{}), do: true
14-
def includes?(:create, %CodeCorps.ProjectUser{}), do: true
15-
def includes?(:update, %CodeCorps.ProjectUser{}), do: true
1614
def includes?(:create, %CodeCorps.StripeConnectAccount{}), do: true
1715
def includes?(:create, %CodeCorps.StripeConnectCharge{}), do: true
1816
def includes?(:create, %CodeCorps.StripeConnectPlan{}), do: true

lib/code_corps/analytics/segment_traits_builder.ex

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,4 +225,9 @@ defmodule CodeCorps.Analytics.SegmentTraitsBuilder do
225225
}
226226
end
227227
defp traits(%{token: _, user_id: _}), do: %{}
228+
defp traits(%{acceptor: user, project_user: project_user}) do
229+
project_user
230+
|> traits()
231+
|> Map.merge(%{acceptor_id: user.id, acceptor: user.username})
232+
end
228233
end

lib/code_corps_web/controllers/project_user_controller.ex

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,15 @@ defmodule CodeCorpsWeb.ProjectUserController do
22
@moduledoc false
33
use CodeCorpsWeb, :controller
44

5-
alias CodeCorps.{Emails, Helpers.Query, Mailer, ProjectUser, User}
5+
alias CodeCorps.{
6+
Analytics.SegmentTracker,
7+
Analytics.SegmentDataExtractor,
8+
Emails,
9+
Helpers.Query,
10+
Mailer,
11+
ProjectUser,
12+
User
13+
}
614

715
action_fallback CodeCorpsWeb.FallbackController
816
plug CodeCorpsWeb.Plug.DataToAttributes
@@ -31,6 +39,7 @@ defmodule CodeCorpsWeb.ProjectUserController do
3139
{:ok, %ProjectUser{} = project_user} <- %ProjectUser{} |> ProjectUser.create_changeset(params) |> Repo.insert,
3240
_ <- maybe_send_create_email(project_user)
3341
do
42+
track_created(current_user, project_user)
3443
conn |> put_status(:created) |> render("show.json-api", data: project_user)
3544
end
3645
end
@@ -43,6 +52,7 @@ defmodule CodeCorpsWeb.ProjectUserController do
4352
{:ok, %ProjectUser{} = updated_project_user} <- project_user |> ProjectUser.update_changeset(params) |> Repo.update,
4453
_ <- maybe_send_update_email(updated_project_user, project_user)
4554
do
55+
track_updated(current_user, project_user)
4656
conn |> render("show.json-api", data: updated_project_user)
4757
end
4858
end
@@ -88,4 +98,33 @@ defmodule CodeCorpsWeb.ProjectUserController do
8898
|> Emails.ProjectUserAcceptanceEmail.create()
8999
|> Mailer.deliver_now()
90100
end
101+
102+
@spec track_created(User.t, ProjectUser.t) :: any
103+
def track_created(
104+
%User{id: user_id},
105+
%ProjectUser{} = project_user) do
106+
107+
SegmentTracker.track(user_id, "Requested Membership (User)", project_user)
108+
109+
project_user
110+
|> SegmentDataExtractor.get_project_id()
111+
|> SegmentTracker.track("Membership Requested (Project)", project_user)
112+
end
113+
114+
@spec track_updated(User.t, ProjectUser.t) :: any
115+
def track_updated(
116+
%User{id: user_id} = user,
117+
%ProjectUser{} = project_user) do
118+
119+
data = %{
120+
acceptor: user,
121+
project_user: project_user
122+
}
123+
124+
SegmentTracker.track(user_id, "Membership Approved (User)", data)
125+
126+
project_user
127+
|> SegmentDataExtractor.get_project_id()
128+
|> SegmentTracker.track("Approved Membership (Project)", data)
129+
end
91130
end
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
defmodule CodeCorps.Analytics.SegmentDataExtractorTest do
2+
@moduledoc false
3+
4+
use ExUnit.Case, async: true
5+
6+
import CodeCorps.Factories
7+
8+
alias CodeCorps.Analytics.SegmentDataExtractor
9+
10+
describe "get_project_id/1" do
11+
test "should return correct id for project user" do
12+
project_user = build(:project_user)
13+
project_id = "project_#{project_user.project_id}"
14+
15+
assert SegmentDataExtractor.get_project_id(project_user) == project_id
16+
end
17+
18+
test "should return nil for unknown resource" do
19+
assert SegmentDataExtractor.get_project_id(%{}) == nil
20+
end
21+
end
22+
23+
end

test/lib/code_corps/analytics/segment_event_name_builder_test.exs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,6 @@ defmodule CodeCorps.Analytics.SegmentEventNameBuilderTest do
1313
assert SegmentEventNameBuilder.build(:update, build(:comment)) == "Edited Comment"
1414
end
1515

16-
test "with project_user" do
17-
assert SegmentEventNameBuilder.build(:create, build(:project_user)) == "Requested Project Membership"
18-
assert SegmentEventNameBuilder.build(:update, build(:project_user)) == "Approved Project Membership"
19-
end
20-
2116
test "with task" do
2217
assert SegmentEventNameBuilder.build(:create, build(:task)) == "Created Task"
2318
assert SegmentEventNameBuilder.build(:update, build(:task)) == "Edited Task"

test/lib/code_corps/analytics/segment_traits_builder_test.exs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@ defmodule CodeCorps.Analytics.SegmentTraitsBuilderTest do
2323
assert :project_skill |> insert |> SegmentTraitsBuilder.build
2424
assert :project_user |> insert |> SegmentTraitsBuilder.build
2525

26+
data = %{
27+
acceptor: insert(:user),
28+
project_user: insert(:project_user)
29+
}
30+
assert SegmentTraitsBuilder.build(data)
31+
2632
assert :stripe_connect_account |> insert |> SegmentTraitsBuilder.build
2733
assert :stripe_connect_charge |> insert |> SegmentTraitsBuilder.build
2834
assert :stripe_connect_plan |> insert |> SegmentTraitsBuilder.build

test/lib/code_corps_web/controllers/project_user_controller_test.exs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ defmodule CodeCorpsWeb.ProjectUserControllerTest do
4949
assert conn |> request_create(attrs) |> json_response(201)
5050

5151
user_id = user.id
52+
project_id = "project_#{project.id}"
5253

5354
tracking_properties = %{
5455
project: project.title,
@@ -57,7 +58,8 @@ defmodule CodeCorpsWeb.ProjectUserControllerTest do
5758
member_id: user.id
5859
}
5960

60-
assert_received {:track, ^user_id, "Requested Project Membership", ^tracking_properties}
61+
assert_received {:track, ^user_id, "Requested Membership (User)", ^tracking_properties}
62+
assert_received {:track, ^project_id, "Membership Requested (Project)", ^tracking_properties}
6163

6264
email =
6365
CodeCorps.ProjectUser
@@ -106,15 +108,19 @@ defmodule CodeCorpsWeb.ProjectUserControllerTest do
106108
assert json["data"]["attributes"]["role"] == "contributor"
107109

108110
user_id = current_user.id
111+
project_id = "project_#{project.id}"
109112

110113
tracking_properties = %{
111114
project: project.title,
112115
project_id: project.id,
113116
member: record.user.username,
114-
member_id: record.user.id
117+
member_id: record.user.id,
118+
acceptor: current_user.username,
119+
acceptor_id: current_user.id
115120
}
116121

117-
assert_received {:track, ^user_id, "Approved Project Membership", ^tracking_properties}
122+
assert_received {:track, ^user_id, "Membership Approved (User)", ^tracking_properties}
123+
assert_received {:track, ^project_id, "Approved Membership (Project)", ^tracking_properties}
118124

119125
email =
120126
CodeCorps.ProjectUser

0 commit comments

Comments
 (0)