code-corps/code-corps-api

View on GitHub
lib/code_corps/services/project_service.ex

Summary

Maintainability
Test Coverage
defmodule CodeCorps.Services.ProjectService do
  @moduledoc """
  Handles special CRUD operations for `CodeCorps.Project`.
  """

  import Ecto.Query

  alias CodeCorps.{Project, Repo, StripeConnectPlan, StripeConnectSubscription}

  def update_project_totals(%Project{stripe_connect_plan: %StripeConnectPlan{id: plan_id}} = project) do
    total_monthly_donated =
      StripeConnectSubscription
      |> where([s], s.status == "active" and s.stripe_connect_plan_id == ^plan_id)
      |> Repo.aggregate(:sum, :quantity)
      |> default_to_zero

    project
    |> Project.update_total_changeset(%{total_monthly_donated: total_monthly_donated})
    |> Repo.update
  end

  defp default_to_zero(nil), do: 0
  defp default_to_zero(value), do: value
end