Skip to content

Track project events #1364

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
Feb 14, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions lib/code_corps/analytics/segment_data_extractor.ex
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,14 @@ defmodule CodeCorps.Analytics.SegmentDataExtractor do
def get_action(%Plug.Conn{private: %{phoenix_action: action}}), do: action
def get_action(_), do: nil

@doc """
Tries to extract project id from given resource.
Returns `nil` if project id can't be extracted.
"""
@spec get_project_id(CodeCorps.ProjectUser.t) :: String.t | nil
def get_project_id(%CodeCorps.ProjectUser{project_id: id}), do: "project_#{id}"
def get_project_id(_), do: nil

@spec get_resource(Plug.Conn.t) :: struct
def get_resource(%Plug.Conn{assigns: %{data: data}}), do: data
# these are used for delete actions on records that support it
Expand Down
6 changes: 0 additions & 6 deletions lib/code_corps/analytics/segment_event_name_builder.ex
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,6 @@ defmodule CodeCorps.Analytics.SegmentEventNameBuilder do
defp get_event_name(:update, %CodeCorps.DonationGoal{}) do
"Updated Donation Goal"
end
defp get_event_name(:create, %CodeCorps.ProjectUser{}) do
"Requested Project Membership"
end
defp get_event_name(:update, %CodeCorps.ProjectUser{}) do
"Approved Project Membership"
end
defp get_event_name(:payment_succeeded, %CodeCorps.StripeInvoice{}) do
"Processed Subscription Payment"
end
Expand Down
2 changes: 0 additions & 2 deletions lib/code_corps/analytics/segment_tracking_support.ex
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@ defmodule CodeCorps.Analytics.SegmentTrackingSupport do
def includes?(:update, %CodeCorps.Comment{}), do: true
def includes?(:create, %CodeCorps.DonationGoal{}), do: true
def includes?(:update, %CodeCorps.DonationGoal{}), do: true
def includes?(:create, %CodeCorps.ProjectUser{}), do: true
def includes?(:update, %CodeCorps.ProjectUser{}), do: true
def includes?(:create, %CodeCorps.StripeConnectAccount{}), do: true
def includes?(:create, %CodeCorps.StripeConnectCharge{}), do: true
def includes?(:create, %CodeCorps.StripeConnectPlan{}), do: true
Expand Down
5 changes: 5 additions & 0 deletions lib/code_corps/analytics/segment_traits_builder.ex
Original file line number Diff line number Diff line change
Expand Up @@ -225,4 +225,9 @@ defmodule CodeCorps.Analytics.SegmentTraitsBuilder do
}
end
defp traits(%{token: _, user_id: _}), do: %{}
defp traits(%{acceptor: user, project_user: project_user}) do
project_user
|> traits()
|> Map.merge(%{acceptor_id: user.id, acceptor: user.username})
end
end
41 changes: 40 additions & 1 deletion lib/code_corps_web/controllers/project_user_controller.ex
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,15 @@ defmodule CodeCorpsWeb.ProjectUserController do
@moduledoc false
use CodeCorpsWeb, :controller

alias CodeCorps.{Emails, Helpers.Query, Mailer, ProjectUser, User}
alias CodeCorps.{
Analytics.SegmentTracker,
Analytics.SegmentDataExtractor,
Emails,
Helpers.Query,
Mailer,
ProjectUser,
User
}

action_fallback CodeCorpsWeb.FallbackController
plug CodeCorpsWeb.Plug.DataToAttributes
Expand Down Expand Up @@ -31,6 +39,7 @@ defmodule CodeCorpsWeb.ProjectUserController do
{:ok, %ProjectUser{} = project_user} <- %ProjectUser{} |> ProjectUser.create_changeset(params) |> Repo.insert,
_ <- maybe_send_create_email(project_user)
do
track_created(current_user, project_user)
conn |> put_status(:created) |> render("show.json-api", data: project_user)
end
end
Expand All @@ -43,6 +52,7 @@ defmodule CodeCorpsWeb.ProjectUserController do
{:ok, %ProjectUser{} = updated_project_user} <- project_user |> ProjectUser.update_changeset(params) |> Repo.update,
_ <- maybe_send_update_email(updated_project_user, project_user)
do
track_updated(current_user, project_user)
conn |> render("show.json-api", data: updated_project_user)
end
end
Expand Down Expand Up @@ -88,4 +98,33 @@ defmodule CodeCorpsWeb.ProjectUserController do
|> Emails.ProjectUserAcceptanceEmail.create()
|> Mailer.deliver_now()
end

@spec track_created(User.t, ProjectUser.t) :: any
def track_created(
%User{id: user_id},
%ProjectUser{} = project_user) do

SegmentTracker.track(user_id, "Requested Membership (User)", project_user)

project_user
|> SegmentDataExtractor.get_project_id()
|> SegmentTracker.track("Membership Requested (Project)", project_user)
end

@spec track_updated(User.t, ProjectUser.t) :: any
def track_updated(
%User{id: user_id} = user,
%ProjectUser{} = project_user) do

data = %{
acceptor: user,
project_user: project_user
}

SegmentTracker.track(user_id, "Membership Approved (User)", data)

project_user
|> SegmentDataExtractor.get_project_id()
|> SegmentTracker.track("Approved Membership (Project)", data)
end
end
23 changes: 23 additions & 0 deletions test/lib/code_corps/analytics/segment_data_extractor_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
defmodule CodeCorps.Analytics.SegmentDataExtractorTest do
@moduledoc false

use ExUnit.Case, async: true

import CodeCorps.Factories

alias CodeCorps.Analytics.SegmentDataExtractor

describe "get_project_id/1" do
test "should return correct id for project user" do
project_user = build(:project_user)
project_id = "project_#{project_user.project_id}"

assert SegmentDataExtractor.get_project_id(project_user) == project_id
end

test "should return nil for unknown resource" do
assert SegmentDataExtractor.get_project_id(%{}) == nil
end
end

end
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,6 @@ defmodule CodeCorps.Analytics.SegmentEventNameBuilderTest do
assert SegmentEventNameBuilder.build(:update, build(:comment)) == "Edited Comment"
end

test "with project_user" do
assert SegmentEventNameBuilder.build(:create, build(:project_user)) == "Requested Project Membership"
assert SegmentEventNameBuilder.build(:update, build(:project_user)) == "Approved Project Membership"
end

test "with task" do
assert SegmentEventNameBuilder.build(:create, build(:task)) == "Created Task"
assert SegmentEventNameBuilder.build(:update, build(:task)) == "Edited Task"
Expand Down
6 changes: 6 additions & 0 deletions test/lib/code_corps/analytics/segment_traits_builder_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@ defmodule CodeCorps.Analytics.SegmentTraitsBuilderTest do
assert :project_skill |> insert |> SegmentTraitsBuilder.build
assert :project_user |> insert |> SegmentTraitsBuilder.build

data = %{
acceptor: insert(:user),
project_user: insert(:project_user)
}
assert SegmentTraitsBuilder.build(data)

assert :stripe_connect_account |> insert |> SegmentTraitsBuilder.build
assert :stripe_connect_charge |> insert |> SegmentTraitsBuilder.build
assert :stripe_connect_plan |> insert |> SegmentTraitsBuilder.build
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ defmodule CodeCorpsWeb.ProjectUserControllerTest do
assert conn |> request_create(attrs) |> json_response(201)

user_id = user.id
project_id = "project_#{project.id}"

tracking_properties = %{
project: project.title,
Expand All @@ -57,7 +58,8 @@ defmodule CodeCorpsWeb.ProjectUserControllerTest do
member_id: user.id
}

assert_received {:track, ^user_id, "Requested Project Membership", ^tracking_properties}
assert_received {:track, ^user_id, "Requested Membership (User)", ^tracking_properties}
assert_received {:track, ^project_id, "Membership Requested (Project)", ^tracking_properties}

email =
CodeCorps.ProjectUser
Expand Down Expand Up @@ -106,15 +108,19 @@ defmodule CodeCorpsWeb.ProjectUserControllerTest do
assert json["data"]["attributes"]["role"] == "contributor"

user_id = current_user.id
project_id = "project_#{project.id}"

tracking_properties = %{
project: project.title,
project_id: project.id,
member: record.user.username,
member_id: record.user.id
member_id: record.user.id,
acceptor: current_user.username,
acceptor_id: current_user.id
}

assert_received {:track, ^user_id, "Approved Project Membership", ^tracking_properties}
assert_received {:track, ^user_id, "Membership Approved (User)", ^tracking_properties}
assert_received {:track, ^project_id, "Approved Membership (Project)", ^tracking_properties}

email =
CodeCorps.ProjectUser
Expand Down