Skip to content

Commit

Permalink
Add StripeConnectAccount update endpoint for assigning an external ac…
Browse files Browse the repository at this point in the history
…count
  • Loading branch information
begedin committed Dec 19, 2016
1 parent e2aca28 commit 4959684
Show file tree
Hide file tree
Showing 10 changed files with 117 additions and 9 deletions.
13 changes: 10 additions & 3 deletions lib/code_corps/stripe_service/stripe_connect_account.ex
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
defmodule CodeCorps.StripeService.StripeConnectAccountService do
alias CodeCorps.{Repo, StripeConnectAccount}
alias CodeCorps.StripeService.Adapters.StripeConnectAccountAdapter

@api Application.get_env(:code_corps, :stripe)
Expand All @@ -9,9 +10,15 @@ defmodule CodeCorps.StripeService.StripeConnectAccountService do
with {:ok, %Stripe.Account{} = account} <- @api.Account.create(%{country: country_code, managed: true}),
{:ok, params} <- StripeConnectAccountAdapter.to_params(account, attributes)
do
%CodeCorps.StripeConnectAccount{}
|> CodeCorps.StripeConnectAccount.create_changeset(params)
|> CodeCorps.Repo.insert
%StripeConnectAccount{}
|> StripeConnectAccount.create_changeset(params)
|> Repo.insert
end
end

def add_external_account(%StripeConnectAccount{} = record, external_account) do
record
|> StripeConnectAccount.add_external_account_changeset(external_account)
|> Repo.update
end
end
2 changes: 1 addition & 1 deletion mix.lock
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@
"segment": {:git, "https://github.com/stueccles/analytics-elixir.git", "8fe520c16a8a9290d55c849bf4d67420396e1cdd", []},
"sentry": {:hex, :sentry, "2.0.2", "f08638758f7bf891e238466009f6cd702fc26d87286663af26927a78ed149346", [:mix], [{:hackney, "~> 1.6.1", [hex: :hackney, optional: false]}, {:plug, "~> 1.0", [hex: :plug, optional: true]}, {:poison, "~> 1.5 or ~> 2.0 or ~> 3.0", [hex: :poison, optional: false]}, {:uuid, "~> 1.0", [hex: :uuid, optional: false]}]},
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.1", "28a4d65b7f59893bc2c7de786dec1e1555bd742d336043fe644ae956c3497fbe", [:rebar, :make], []},
"stripity_stripe": {:git, "https://github.com/code-corps/stripity_stripe.git", "d26b09aff994a30a17bcd35eff6863cbaadf5ec8", [branch: "2.0"]},
"stripity_stripe": {:git, "https://github.com/code-corps/stripity_stripe.git", "df6c770882d74d76807e3aa91ba7ee2763a80e49", [branch: "2.0"]},
"timber": {:hex, :timber, "0.4.7", "df3fcd79bcb4eb4b53874d906ef5f3a212937b4bc7b7c5b244745202cc389443", [:mix], [{:ecto, "~> 2.0", [hex: :ecto, optional: true]}, {:phoenix, "~> 1.2", [hex: :phoenix, optional: true]}, {:plug, "~> 1.2", [hex: :plug, optional: true]}, {:poison, "~> 2.0 or ~> 3.0", [hex: :poison, optional: false]}]},
"timex": {:hex, :timex, "3.1.5", "413d6d8d6f0162a5d47080cb8ca520d790184ac43e097c95191c7563bf25b428", [:mix], [{:combine, "~> 0.7", [hex: :combine, optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, optional: false]}, {:tzdata, "~> 0.1.8 or ~> 0.5", [hex: :tzdata, optional: false]}]},
"timex_ecto": {:hex, :timex_ecto, "3.0.5", "3ec6c25e10d2c0020958e5df64d2b5e690e441faa2c2259da8bc6bd3d7f39256", [:mix], [{:ecto, "~> 2.0", [hex: :ecto, optional: false]}, {:timex, "~> 3.0", [hex: :timex, optional: false]}]},
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
defmodule CodeCorps.Repo.Migrations.AddExternalAccountToStripeConnectAccounts do
use Ecto.Migration

def change do
alter table(:stripe_connect_accounts) do
add :external_account, :string
end
end
end
33 changes: 32 additions & 1 deletion test/controllers/stripe_connect_account_controller_test.exs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
defmodule CodeCorps.StripeConnectAccountControllerTest do
use CodeCorps.ApiCase, resource_name: :stripe_connect_account

alias CodeCorps.StripeConnectAccount

describe "show" do
@tag :authenticated
test "shows chosen resource", %{conn: conn, current_user: current_user} do
Expand Down Expand Up @@ -29,7 +31,7 @@ defmodule CodeCorps.StripeConnectAccountControllerTest do

describe "create" do
@tag :authenticated
test "creates and renders resource user is authenticated and authorized", %{conn: conn, current_user: current_user} do
test "creates and renders resource when user is authenticated and authorized", %{conn: conn, current_user: current_user} do
organization = insert(:organization)
insert(:organization_membership, member: current_user, organization: organization, role: "owner")
attrs = %{
Expand All @@ -56,4 +58,33 @@ defmodule CodeCorps.StripeConnectAccountControllerTest do
assert conn |> request_create(attrs) |> json_response(403)
end
end

describe "update" do
@tag :authenticated
test "updates external account on resource when user is authenticated and authorized", %{conn: conn, current_user: current_user} do
organization = insert(:organization)

insert(:organization_membership, member: current_user, organization: organization, role: "owner")
stripe_connect_account = insert(:stripe_connect_account, organization: organization)

attrs = %{external_account: "ba_test123"}

assert conn |> request_update(stripe_connect_account, attrs, :skip_strategy) |> json_response(200)

updated_account = Repo.get(StripeConnectAccount, stripe_connect_account.id)
assert updated_account.external_account == "ba_test123"
end

test "does not update resource and renders 401 when unauthenticated", %{conn: conn} do
assert conn |> request_update |> json_response(401)
end

@tag :authenticated
test "does not update resource and renders 403 when not authorized", %{conn: conn} do
organization = insert(:organization)
stripe_connect_account = insert(:stripe_connect_account, organization: organization)

assert conn |> request_update(stripe_connect_account, %{}) |> json_response(403)
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ defmodule CodeCorps.StripeService.StripeConnectAccountServiceTest do

use CodeCorps.ModelCase

alias CodeCorps.StripeConnectAccount
alias CodeCorps.{StripeConnectAccount}
alias CodeCorps.StripeService.StripeConnectAccountService

describe "create" do
Expand All @@ -12,12 +12,22 @@ defmodule CodeCorps.StripeService.StripeConnectAccountServiceTest do

attributes = %{"country" => "US", "organization_id" => organization.id}

{:ok, %CodeCorps.StripeConnectAccount{} = connect_account} =
StripeConnectAccountService.create(attributes)
{:ok, %StripeConnectAccount{} = connect_account} =
StripeConnectAccountService.create(attributes)

assert connect_account.country == "US"
assert connect_account.organization_id == organization.id
assert connect_account.managed == true
end
end

describe "add_external_account/2" do
test "assigns the external_account property to the record" do
account = insert(:stripe_connect_account)

{:ok, %StripeConnectAccount{} = updated_account} =
StripeConnectAccountService.add_external_account(account, "ba_test123")
assert updated_account.external_account == "ba_test123"
end
end
end
17 changes: 17 additions & 0 deletions test/models/stripe_connect_account_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,21 @@ defmodule CodeCorps.StripeConnectAccountTest do
assert record.verification_fields_needed == list
end
end

describe "add_external_account_changeset/2" do
test "assigns external_account string as change" do
account = insert(:stripe_connect_account)

changeset = account |> StripeConnectAccount.add_external_account_changeset("ba_test123")
assert changeset |> Ecto.Changeset.get_change(:external_account) == "ba_test123"
assert changeset.valid?
end

test "requires external_account string not to be empty" do
account = insert(:stripe_connect_account)

changeset = account |> StripeConnectAccount.add_external_account_changeset("")
refute changeset.valid?
end
end
end
9 changes: 9 additions & 0 deletions test/support/api_case.ex
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,15 @@ defmodule CodeCorps.ApiCase do
conn |> put(path, payload)
end

# A temporary request_update that skips building a payload
# using our faulty json_payload strategy
# Only works with attributes, not relationships
def request_update(conn, resource_or_id, attrs, :skip_strategy) do
payload = %{data: %{attributes: attrs}, type: "#{factory_name}"}
path = conn |> path_for(:update, resource_or_id)
conn |> put(path, payload)
end

def request_delete(conn), do: request_delete(conn, default_record)
def request_delete(conn, :not_found), do: request_delete(conn, -1)
def request_delete(conn, resource_or_id) do
Expand Down
17 changes: 17 additions & 0 deletions web/controllers/stripe_connect_account_controller.ex
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,21 @@ defmodule CodeCorps.StripeConnectAccountController do
defp handle_create_result({:ok, %StripeConnectAccount{}} = result, conn) do
result |> CodeCorps.Analytics.Segment.track(:created, conn)
end

def handle_update(conn, record, %{"external_account" => external_account}) do
with {:ok, _} = result <- StripeConnectAccountService.add_external_account(record, external_account)
do
CodeCorps.Analytics.Segment.track(result, :created, conn)
else
{:error, %Ecto.Changeset{} = changeset} -> changeset
end
end

def handle_update(conn, _record, _attributes), do: conn |> unauthorized

defp unauthorized(conn) do
conn
|> Plug.Conn.assign(:authorized, false)
|> CodeCorps.AuthenticationHelpers.handle_unauthorized
end
end
8 changes: 8 additions & 0 deletions web/models/stripe_connect_account.ex
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ defmodule CodeCorps.StripeConnectAccount do
field :details_submitted, :boolean
field :display_name, :string
field :email, :string
field :external_account, :string
field :id_from_stripe, :string, null: false
field :managed, :boolean
field :support_email, :string
Expand Down Expand Up @@ -58,4 +59,11 @@ defmodule CodeCorps.StripeConnectAccount do
struct
|> cast(params, @webhook_update_params)
end

def add_external_account_changeset(struct, external_account) do
struct
|> cast(%{}, [])
|> put_change(:external_account, external_account)
|> validate_required([:external_account])
end
end
2 changes: 1 addition & 1 deletion web/router.ex
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ defmodule CodeCorps.Router do
resources "/roles", RoleController, only: [:create]
resources "/role-skills", RoleSkillController, only: [:create, :delete]
resources "/skills", SkillController, only: [:create]
resources "/stripe-connect-accounts", StripeConnectAccountController, only: [:show, :create]
resources "/stripe-connect-accounts", StripeConnectAccountController, only: [:show, :create, :update]
resources "/stripe-connect-plans", StripeConnectPlanController, only: [:show, :create]
resources "/stripe-connect-subscriptions", StripeConnectSubscriptionController, only: [:show, :create]
resources "/stripe-platform-cards", StripePlatformCardController, only: [:show, :create]
Expand Down

0 comments on commit 4959684

Please sign in to comment.