From bd93e86585086d19b919ccb4d51ef83e9d3f23ca Mon Sep 17 00:00:00 2001 From: Josh Smith Date: Wed, 25 Oct 2017 18:30:00 -0700 Subject: [PATCH] Add various performance fixes for API endpoints - Remove preloads from views and write explicitly in controllers - Reduce id filter repetition - Ensure id query filters are run on every controller that has an index action - Add missing indexes --- lib/code_corps/helpers/query.ex | 10 --- lib/code_corps/task/query.ex | 39 +++++---- .../controllers/category_controller.ex | 21 +++-- .../controllers/donation_goal_controller.ex | 28 +++++-- .../github_app_installation_controller.ex | 23 ++++-- .../controllers/organization_controller.ex | 31 ++++++-- .../controllers/project_controller.ex | 28 +++++-- .../controllers/role_controller.ex | 17 ++-- .../controllers/skill_controller.ex | 14 +++- .../stripe_connect_account_controller.ex | 17 +++- .../stripe_connect_subscription_controller.ex | 14 +++- .../controllers/task_controller.ex | 23 ++++-- .../controllers/task_list_controller.ex | 26 +++--- .../controllers/user_controller.ex | 32 ++++++-- lib/code_corps_web/views/category_view.ex | 1 - .../views/donation_goal_view.ex | 1 - .../views/github_app_installation_view.ex | 1 - lib/code_corps_web/views/organization_view.ex | 1 - lib/code_corps_web/views/preload_helpers.ex | 11 --- lib/code_corps_web/views/project_view.ex | 8 +- lib/code_corps_web/views/role_view.ex | 1 - lib/code_corps_web/views/skill_view.ex | 1 - .../views/stripe_connect_account_view.ex | 1 - .../views/stripe_connect_subscription_view.ex | 1 - lib/code_corps_web/views/task_list_view.ex | 1 - lib/code_corps_web/views/task_view.ex | 2 - lib/code_corps_web/views/user_view.ex | 7 -- ...0171026010933_add_more_missing_indexes.exs | 8 ++ .../20171027061833_add_more_indexes_again.exs | 15 ++++ priv/repo/structure.sql | 79 ++++++++++++++++++- .../views/category_view_test.exs | 1 + .../views/donation_goal_view_test.exs | 1 + .../github_app_installation_view_test.exs | 8 +- .../views/organization_view_test.exs | 1 + .../views/project_view_test.exs | 7 +- .../code_corps_web/views/role_view_test.exs | 1 + .../code_corps_web/views/skill_view_test.exs | 3 +- .../stripe_connect_account_view_test.exs | 27 +++++++ .../stripe_connect_subscription_view_test.exs | 1 + .../views/task_list_view_test.exs | 1 + .../code_corps_web/views/task_view_test.exs | 3 +- .../code_corps_web/views/user_view_test.exs | 5 ++ 42 files changed, 384 insertions(+), 137 deletions(-) delete mode 100644 lib/code_corps_web/views/preload_helpers.ex create mode 100644 priv/repo/migrations/20171026010933_add_more_missing_indexes.exs create mode 100644 priv/repo/migrations/20171027061833_add_more_indexes_again.exs diff --git a/lib/code_corps/helpers/query.ex b/lib/code_corps/helpers/query.ex index 542314c8d..44a56d326 100644 --- a/lib/code_corps/helpers/query.ex +++ b/lib/code_corps/helpers/query.ex @@ -36,14 +36,6 @@ defmodule CodeCorps.Helpers.Query do # end task queries - # def comment queries - - def task_filter(query, task_id) do - query |> where([object], object.task_id == ^task_id) - end - - # end comment queries - # user queries def user_filter(query, %{"query" => query_string}) do @@ -61,8 +53,6 @@ defmodule CodeCorps.Helpers.Query do # sorting - def sort_by_newest_first(query), do: query |> order_by([desc: :inserted_at]) - def sort_by_order(query), do: query |> order_by([asc: :order]) # end sorting diff --git a/lib/code_corps/task/query.ex b/lib/code_corps/task/query.ex index 685523d22..2aa510107 100644 --- a/lib/code_corps/task/query.ex +++ b/lib/code_corps/task/query.ex @@ -19,44 +19,49 @@ defmodule CodeCorps.Task.Query do @spec list(map) :: list(Project.t) def list(%{} = params) do Task + |> Helpers.Query.id_filter(params) |> apply_archived_status(params) + |> apply_status(params) |> apply_optional_filters(params) |> order_by([asc: :order]) - |> Repo.all + |> Repo.all() end @spec apply_optional_filters(Queryable.t, map) :: Queryable.t - defp apply_optional_filters(queryable, %{"filter" => %{} = params}) do - queryable |> apply_optional_filters(params) + defp apply_optional_filters(query, %{"filter" => %{} = params}) do + query |> apply_optional_filters(params) end - defp apply_optional_filters(queryable, %{"project_id" => project_id} = params) do - queryable + defp apply_optional_filters(query, %{"project_id" => project_id} = params) do + query |> where(project_id: ^project_id) |> apply_optional_filters(params |> Map.delete("project_id")) end - defp apply_optional_filters(queryable, %{"task_list_ids" => task_list_ids} = params) do + defp apply_optional_filters(query, %{"task_list_ids" => task_list_ids} = params) do task_list_ids = task_list_ids |> Helpers.String.coalesce_id_string - queryable + query |> where([r], r.task_list_id in ^task_list_ids) |> apply_optional_filters(params |> Map.delete("task_list_ids")) end - defp apply_optional_filters(queryable, %{"status" => status} = params) do - queryable - |> where(status: ^status) - |> apply_optional_filters(params |> Map.delete("status")) - end - defp apply_optional_filters(queryable, %{}), do: queryable + defp apply_optional_filters(query, %{}), do: query @spec apply_archived_status(Queryable.t, map) :: Queryable.t - defp apply_archived_status(queryable, %{"archived" => archived}) do - queryable + defp apply_archived_status(query, %{"archived" => archived}) do + query |> where(archived: ^archived) end - defp apply_archived_status(queryable, %{}) do - queryable + defp apply_archived_status(query, %{}) do + query |> where(archived: false) end + + @spec apply_status(Queryable.t, map) :: Queryable.t + defp apply_status(query, %{"status" => status}) do + query + |> where(status: ^status) + end + defp apply_status(query, %{}), do: query + @doc ~S""" Returns a `Task` record retrived using a set of parameters. diff --git a/lib/code_corps_web/controllers/category_controller.ex b/lib/code_corps_web/controllers/category_controller.ex index 2b942196c..48841d3b6 100644 --- a/lib/code_corps_web/controllers/category_controller.ex +++ b/lib/code_corps_web/controllers/category_controller.ex @@ -2,21 +2,20 @@ defmodule CodeCorpsWeb.CategoryController do @moduledoc false use CodeCorpsWeb, :controller - alias CodeCorps.{Category, User, Helpers.Query} + alias CodeCorps.{Category, Repo, User, Helpers.Query} action_fallback CodeCorpsWeb.FallbackController plug CodeCorpsWeb.Plug.DataToAttributes @spec index(Conn.t, map) :: Conn.t def index(%Conn{} = conn, %{} = params) do - with categories <- Category |> Query.id_filter(params) |> Repo.all do - conn |> render("index.json-api", data: categories) - end + categories = Category |> Query.id_filter(params) |> Repo.all |> preload() + conn |> render("index.json-api", data: categories) end @spec show(Conn.t, map) :: Conn.t def show(%Conn{} = conn, %{"id" => id}) do - with %Category{} = category <- Category |> Repo.get(id) do + with %Category{} = category <- Category |> Repo.get(id) |> preload() do conn |> render("show.json-api", data: category) end end @@ -25,7 +24,8 @@ defmodule CodeCorpsWeb.CategoryController do def create(%Conn{} = conn, %{} = params) do with %User{} = current_user <- conn |> Guardian.Plug.current_resource, {:ok, :authorized} <- current_user |> Policy.authorize(:create, %Category{}, params), - {:ok, %Category{} = category} <- %Category{} |> Category.create_changeset(params) |> Repo.insert + {:ok, %Category{} = category} <- %Category{} |> Category.create_changeset(params) |> Repo.insert, + category <- preload(category) do conn |> put_status(:created) |> render("show.json-api", data: category) end @@ -36,9 +36,16 @@ defmodule CodeCorpsWeb.CategoryController do with %Category{} = category <- Category |> Repo.get(id), %User{} = current_user <- conn |> Guardian.Plug.current_resource, {:ok, :authorized} <- current_user |> Policy.authorize(:update, category), - {:ok, %Category{} = category} <- category |> Category.changeset(params) |> Repo.update + {:ok, %Category{} = category} <- category |> Category.changeset(params) |> Repo.update, + category <- preload(category) do conn |> render("show.json-api", data: category) end end + + @preloads [:project_categories] + + def preload(data) do + Repo.preload(data, @preloads) + end end diff --git a/lib/code_corps_web/controllers/donation_goal_controller.ex b/lib/code_corps_web/controllers/donation_goal_controller.ex index 90a9cd6fa..7b2f2e2ba 100644 --- a/lib/code_corps_web/controllers/donation_goal_controller.ex +++ b/lib/code_corps_web/controllers/donation_goal_controller.ex @@ -11,14 +11,18 @@ defmodule CodeCorpsWeb.DonationGoalController do @spec index(Conn.t, map) :: Conn.t def index(%Conn{} = conn, %{} = params) do - with donation_goals <- DonationGoal |> Query.id_filter(params) |> Repo.all do - conn |> render("index.json-api", data: donation_goals) - end + donation_goals = + DonationGoal + |> Query.id_filter(params) + |> Repo.all + |> preload() + + conn |> render("index.json-api", data: donation_goals) end @spec show(Conn.t, map) :: Conn.t def show(%Conn{} = conn, %{"id" => id}) do - with %DonationGoal{} = donation_goal <- DonationGoal |> Repo.get(id) do + with %DonationGoal{} = donation_goal <- DonationGoal |> Repo.get(id) |> preload() do conn |> render("show.json-api", data: donation_goal) end end @@ -27,7 +31,9 @@ defmodule CodeCorpsWeb.DonationGoalController do def create(%Conn{} = conn, %{} = params) do with %User{} = current_user <- conn |> Guardian.Plug.current_resource, {:ok, :authorized} <- current_user |> Policy.authorize(:create, %DonationGoal{}, params), - {:ok, %DonationGoal{} = donation_goal} <- DonationGoalsService.create(params) do + {:ok, %DonationGoal{} = donation_goal} <- DonationGoalsService.create(params), + donation_goal <- preload(donation_goal) + do conn |> put_status(:created) |> render("show.json-api", data: donation_goal) end end @@ -48,8 +54,16 @@ defmodule CodeCorpsWeb.DonationGoalController do with %DonationGoal{} = donation_goal <- DonationGoal |> Repo.get(id), %User{} = current_user <- conn |> Guardian.Plug.current_resource, {:ok, :authorized} <- current_user |> Policy.authorize(:update, donation_goal), - {:ok, %DonationGoal{} = updated_donation_goal} <- donation_goal |> DonationGoalsService.update(params) do - conn |> render("show.json-api", data: updated_donation_goal) + {:ok, %DonationGoal{} = updated_donation_goal} <- donation_goal |> DonationGoalsService.update(params), + updated_donation_goal <- preload(updated_donation_goal) + do + conn |> render("show.json-api", data: updated_donation_goal) end end + + @preloads [:project] + + def preload(data) do + Repo.preload(data, @preloads) + end end diff --git a/lib/code_corps_web/controllers/github_app_installation_controller.ex b/lib/code_corps_web/controllers/github_app_installation_controller.ex index 0388bd0c0..820a3c22c 100644 --- a/lib/code_corps_web/controllers/github_app_installation_controller.ex +++ b/lib/code_corps_web/controllers/github_app_installation_controller.ex @@ -12,14 +12,18 @@ defmodule CodeCorpsWeb.GithubAppInstallationController do @spec index(Conn.t, map) :: Conn.t def index(%Conn{} = conn, %{} = params) do - with installations <- GithubAppInstallation |> id_filter(params) |> Repo.all do - conn |> render("index.json-api", data: installations) - end + installations = + GithubAppInstallation + |> id_filter(params) + |> Repo.all() + |> preload() + + conn |> render("index.json-api", data: installations) end @spec show(Conn.t, map) :: Conn.t def show(%Conn{} = conn, %{"id" => id}) do - with %GithubAppInstallation{} = installation <- GithubAppInstallation |> Repo.get(id) do + with %GithubAppInstallation{} = installation <- GithubAppInstallation |> Repo.get(id) |> preload() do conn |> render("show.json-api", data: installation) end end @@ -28,13 +32,20 @@ defmodule CodeCorpsWeb.GithubAppInstallationController do def create(%Conn{} = conn, %{} = params) do with %User{} = current_user <- conn |> Guardian.Plug.current_resource, {:ok, :authorized} <- current_user |> Policy.authorize(:create, %GithubAppInstallation{}, params), - {:ok, %GithubAppInstallation{} = installation} <- %GithubAppInstallation{} |> GithubAppInstallation.create_changeset(params) |> Repo.insert do - + {:ok, %GithubAppInstallation{} = installation} <- %GithubAppInstallation{} |> GithubAppInstallation.create_changeset(params) |> Repo.insert, + installation <- preload(installation) + do current_user |> track_created(installation) conn |> put_status(:created) |> render("show.json-api", data: installation) end end + @preloads [:github_repos, :organization_github_app_installations] + + def preload(data) do + Repo.preload(data, @preloads) + end + @spec track_created(User.t, GithubAppInstallation.t) :: any defp track_created(%User{id: user_id}, %GithubAppInstallation{} = installation) do user_id |> SegmentTracker.track("Created GitHub App Installation", installation) diff --git a/lib/code_corps_web/controllers/organization_controller.ex b/lib/code_corps_web/controllers/organization_controller.ex index fa735701b..0f65b3df6 100644 --- a/lib/code_corps_web/controllers/organization_controller.ex +++ b/lib/code_corps_web/controllers/organization_controller.ex @@ -4,19 +4,24 @@ defmodule CodeCorpsWeb.OrganizationController do alias CodeCorps.{Helpers.Query, Organization, User} - action_fallback CodeCorpsWeb.FallbackController - plug CodeCorpsWeb.Plug.DataToAttributes + action_fallback CodeCorpsWeb.FallbackController + plug CodeCorpsWeb.Plug.DataToAttributes @spec index(Conn.t, map) :: Conn.t def index(%Conn{} = conn, %{} = params) do - with organizations <- Organization |> Query.id_filter(params) |> Repo.all do - conn |> render("index.json-api", data: organizations) - end + organizations = + Organization + |> Query.id_filter(params) + |> Repo.all + |> preload() + + conn |> render("index.json-api", data: organizations) end @spec show(Conn.t, map) :: Conn.t def show(%Conn{} = conn, %{"id" => id}) do - with %Organization{} = organization <- Organization |> Repo.get(id) do + with %Organization{} = organization <- Organization |> Repo.get(id) |> preload() + do conn |> render("show.json-api", data: organization) end end @@ -25,7 +30,9 @@ defmodule CodeCorpsWeb.OrganizationController do def create(%Conn{} = conn, %{} = params) do with %User{} = current_user <- conn |> Guardian.Plug.current_resource, {:ok, :authorized} <- current_user |> Policy.authorize(:create, %Organization{}, params), - {:ok, %Organization{} = organization} <- %Organization{} |> Organization.create_changeset(params) |> Repo.insert do + {:ok, %Organization{} = organization} <- %Organization{} |> Organization.create_changeset(params) |> Repo.insert, + organization <- preload(organization) + do conn |> put_status(:created) |> render("show.json-api", data: organization) end end @@ -35,8 +42,16 @@ defmodule CodeCorpsWeb.OrganizationController do with %Organization{} = organization <- Organization |> Repo.get(id), %User{} = current_user <- conn |> Guardian.Plug.current_resource, {:ok, :authorized} <- current_user |> Policy.authorize(:update, organization), - {:ok, %Organization{} = organization} <- organization |> Organization.changeset(params) |> Repo.update do + {:ok, %Organization{} = organization} <- organization |> Organization.changeset(params) |> Repo.update, + organization <- preload(organization) + do conn |> render("show.json-api", data: organization) end end + + @preloads [:organization_github_app_installations, :projects, :slugged_route, :stripe_connect_account] + + def preload(data) do + Repo.preload(data, @preloads) + end end diff --git a/lib/code_corps_web/controllers/project_controller.ex b/lib/code_corps_web/controllers/project_controller.ex index e52f2b8f8..a506effe9 100644 --- a/lib/code_corps_web/controllers/project_controller.ex +++ b/lib/code_corps_web/controllers/project_controller.ex @@ -9,14 +9,14 @@ defmodule CodeCorpsWeb.ProjectController do @spec index(Conn.t, map) :: Conn.t def index(%Conn{} = conn, %{} = params) do - with projects <- Project.Query.list(params) do + with projects <- Project.Query.list(params) |> preload do conn |> render("index.json-api", data: projects) end end @spec show(Conn.t, map) :: Conn.t def show(%Conn{} = conn, %{} = params) do - with %Project{} = project <- Project.Query.find(params) do + with %Project{} = project <- Project.Query.find(params) |> preload do conn |> render("show.json-api", data: project) end end @@ -25,7 +25,9 @@ defmodule CodeCorpsWeb.ProjectController do def create(%Conn{} = conn, %{} = params) do with %User{} = current_user <- conn |> Guardian.Plug.current_resource, {:ok, :authorized} <- current_user |> Policy.authorize(:create, %Project{}, params), - {:ok, %Project{} = project} <- %Project{} |> Project.create_changeset(params) |> Repo.insert do + {:ok, %Project{} = project} <- %Project{} |> Project.create_changeset(params) |> Repo.insert, + project <- preload(project) + do conn |> put_status(:created) |> render("show.json-api", data: project) end end @@ -33,10 +35,22 @@ defmodule CodeCorpsWeb.ProjectController do @spec update(Conn.t, map) :: Conn.t def update(%Conn{} = conn, %{} = params) do with %Project{} = project <- Project.Query.find(params), - %User{} = current_user <- conn |> Guardian.Plug.current_resource, - {:ok, :authorized} <- current_user |> Policy.authorize(:update, project), - {:ok, %Project{} = project} <- project |> Project.changeset(params) |> Repo.update do - conn |> render("show.json-api", data: project) + %User{} = current_user <- conn |> Guardian.Plug.current_resource, + {:ok, :authorized} <- current_user |> Policy.authorize(:update, project), + {:ok, %Project{} = project} <- project |> Project.changeset(params) |> Repo.update, + project <- preload(project) + do + conn |> render("show.json-api", data: project) end end + + @preloads [ + :donation_goals, [organization: :stripe_connect_account], + :project_categories, :project_github_repos, :project_skills, + :project_users, :stripe_connect_plan, :task_lists, :tasks + ] + + def preload(data) do + Repo.preload(data, @preloads) + end end diff --git a/lib/code_corps_web/controllers/role_controller.ex b/lib/code_corps_web/controllers/role_controller.ex index b6a5040cc..c4d5bc79d 100644 --- a/lib/code_corps_web/controllers/role_controller.ex +++ b/lib/code_corps_web/controllers/role_controller.ex @@ -10,14 +10,13 @@ defmodule CodeCorpsWeb.RoleController do @spec index(Conn.t, map) :: Conn.t def index(%Conn{} = conn, %{} = params) do - with roles <- Role |> Query.id_filter(params) |> Repo.all do - conn |> render("index.json-api", data: roles) - end + roles = Role |> Query.id_filter(params) |> Repo.all |> preload() + conn |> render("index.json-api", data: roles) end @spec show(Conn.t, map) :: Conn.t def show(%Conn{} = conn, %{"id" => id}) do - with %Role{} = role <- Role |> Repo.get(id) do + with %Role{} = role <- Role |> Repo.get(id) |> preload() do conn |> render("show.json-api", data: role) end end @@ -26,8 +25,16 @@ defmodule CodeCorpsWeb.RoleController do def create(%Conn{} = conn, %{} = params) do with %User{} = current_user <- conn |> Guardian.Plug.current_resource, {:ok, :authorized} <- current_user |> Policy.authorize(:create, %Role{}, params), - {:ok, %Role{} = role} <- %Role{} |> Role.changeset(params) |> Repo.insert do + {:ok, %Role{} = role} <- %Role{} |> Role.changeset(params) |> Repo.insert, + role = preload(role) + do conn |> put_status(:created) |> render("show.json-api", data: role) end end + + @preloads [:role_skills] + + def preload(data) do + Repo.preload(data, @preloads) + end end diff --git a/lib/code_corps_web/controllers/skill_controller.ex b/lib/code_corps_web/controllers/skill_controller.ex index a2279885f..446a7ce9c 100644 --- a/lib/code_corps_web/controllers/skill_controller.ex +++ b/lib/code_corps_web/controllers/skill_controller.ex @@ -10,14 +10,14 @@ defmodule CodeCorpsWeb.SkillController do @spec index(Conn.t, map) :: Conn.t def index(%Conn{} = conn, %{} = params) do - with skills <- params |> load_skills() do + with skills <- params |> load_skills() |> preload do conn |> render("index.json-api", data: skills) end end @spec show(Conn.t, map) :: Conn.t def show(%Conn{} = conn, %{"id" => id}) do - with %Skill{} = skill <- Skill |> Repo.get(id) do + with %Skill{} = skill <- Skill |> Repo.get(id) |> preload do conn |> render("show.json-api", data: skill) end end @@ -26,7 +26,9 @@ defmodule CodeCorpsWeb.SkillController do def create(%Conn{} = conn, %{} = params) do with %User{} = current_user <- conn |> Guardian.Plug.current_resource, {:ok, :authorized} <- current_user |> Policy.authorize(:create, %Skill{}, params), - {:ok, %Skill{} = skill} <- %Skill{} |> Skill.changeset(params) |> Repo.insert do + {:ok, %Skill{} = skill} <- %Skill{} |> Skill.changeset(params) |> Repo.insert, + skill <- preload(skill) + do conn |> put_status(:created) |> render("show.json-api", data: skill) end end @@ -39,4 +41,10 @@ defmodule CodeCorpsWeb.SkillController do |> Query.limit_filter(params) |> Repo.all end + + @preloads [:role_skills] + + def preload(data) do + Repo.preload(data, @preloads) + end end diff --git a/lib/code_corps_web/controllers/stripe_connect_account_controller.ex b/lib/code_corps_web/controllers/stripe_connect_account_controller.ex index 5a3ca998e..071f4bf50 100644 --- a/lib/code_corps_web/controllers/stripe_connect_account_controller.ex +++ b/lib/code_corps_web/controllers/stripe_connect_account_controller.ex @@ -16,7 +16,8 @@ defmodule CodeCorpsWeb.StripeConnectAccountController do with %User{} = current_user <- conn |> Guardian.Plug.current_resource, %StripeConnectAccount{} = account <- StripeConnectAccount |> Repo.get(id), {:ok, :authorized} <- current_user |> Policy.authorize(:show, account, params) - do + do + account = preload(account) conn |> render("show.json-api", data: account) end end @@ -30,7 +31,9 @@ defmodule CodeCorpsWeb.StripeConnectAccountController do |> Map.put("tos_acceptance_user_agent", conn |> ConnUtils.extract_user_agent) with %User{} = current_user <- conn |> Guardian.Plug.current_resource, {:ok, :authorized} <- current_user |> Policy.authorize(:create, %StripeConnectAccount{}, params), - {:ok, %StripeConnectAccount{} = account} <- StripeConnectAccountService.create(params) do + {:ok, %StripeConnectAccount{} = account} <- StripeConnectAccountService.create(params), + account <- preload(account) + do conn |> put_status(:created) |> render("show.json-api", data: account) end end @@ -40,8 +43,16 @@ defmodule CodeCorpsWeb.StripeConnectAccountController do with %StripeConnectAccount{} = account <- StripeConnectAccount |> Repo.get(id), %User{} = current_user <- conn |> Guardian.Plug.current_resource, {:ok, :authorized} <- current_user |> Policy.authorize(:update, account, params), - {:ok, %StripeConnectAccount{} = updated_account} <- account |> StripeConnectAccountService.update(params) do + {:ok, %StripeConnectAccount{} = updated_account} <- account |> StripeConnectAccountService.update(params), + updated_account <- preload(updated_account) + do conn |> render("show.json-api", data: updated_account) end end + + @preloads [:stripe_external_account] + + def preload(data) do + Repo.preload(data, @preloads) + end end diff --git a/lib/code_corps_web/controllers/stripe_connect_subscription_controller.ex b/lib/code_corps_web/controllers/stripe_connect_subscription_controller.ex index 9048c3b98..a79da9238 100644 --- a/lib/code_corps_web/controllers/stripe_connect_subscription_controller.ex +++ b/lib/code_corps_web/controllers/stripe_connect_subscription_controller.ex @@ -13,7 +13,9 @@ defmodule CodeCorpsWeb.StripeConnectSubscriptionController do def show(%Conn{} = conn, %{"id" => id} = params) do with %User{} = current_user <- conn |> Guardian.Plug.current_resource, %StripeConnectSubscription{} = subscription <- StripeConnectSubscription |> Repo.get(id), - {:ok, :authorized} <- current_user |> Policy.authorize(:show, subscription, params) do + {:ok, :authorized} <- current_user |> Policy.authorize(:show, subscription, params) + do + subscription = preload(subscription) conn |> render("show.json-api", data: subscription) end end @@ -22,8 +24,16 @@ defmodule CodeCorpsWeb.StripeConnectSubscriptionController do def create(%Conn{} = conn, %{} = params) do with %User{} = current_user <- conn |> Guardian.Plug.current_resource, {:ok, :authorized} <- current_user |> Policy.authorize(:create, %StripeConnectSubscription{}, params), - {:ok, %StripeConnectSubscription{} = subscription} <- StripeConnectSubscriptionService.find_or_create(params) do + {:ok, %StripeConnectSubscription{} = subscription} <- StripeConnectSubscriptionService.find_or_create(params), + subscription <- preload(subscription) + do conn |> put_status(:created) |> render("show.json-api", data: subscription) end end + + @preloads [:project] + + def preload(data) do + Repo.preload(data, @preloads) + end end diff --git a/lib/code_corps_web/controllers/task_controller.ex b/lib/code_corps_web/controllers/task_controller.ex index 94d248bdb..4415daf42 100644 --- a/lib/code_corps_web/controllers/task_controller.ex +++ b/lib/code_corps_web/controllers/task_controller.ex @@ -10,14 +10,18 @@ defmodule CodeCorpsWeb.TaskController do @spec index(Conn.t, map) :: Conn.t def index(%Conn{} = conn, %{} = params) do - with tasks <- Task.Query.list(params) do + with tasks <- Task.Query.list(params), + tasks <- preload(tasks) + do conn |> render("index.json-api", data: tasks) end end @spec show(Conn.t, map) :: Conn.t def show(%Conn{} = conn, %{} = params) do - with %Task{} = task <- Task.Query.find(params) do + with %Task{} = task <- Task.Query.find(params), + task <- preload(task) + do conn |> render("show.json-api", data: task) end end @@ -26,8 +30,9 @@ defmodule CodeCorpsWeb.TaskController do def create(%Conn{} = conn, %{} = params) do with %User{} = current_user <- conn |> Guardian.Plug.current_resource, {:ok, :authorized} <- current_user |> Policy.authorize(:create, %Task{}, params), - {:ok, %Task{} = task} <- params |> Task.Service.create do - + {:ok, %Task{} = task} <- params |> Task.Service.create, + task <- preload(task) + do current_user |> track_created(task) current_user |> maybe_track_connected(task) @@ -40,7 +45,9 @@ defmodule CodeCorpsWeb.TaskController do with %Task{} = task <- Task.Query.find(params), %User{} = current_user <- conn |> Guardian.Plug.current_resource, {:ok, :authorized} <- current_user |> Policy.authorize(:update, task), - {:ok, %Task{} = updated_task} <- task |> Task.Service.update(params) do + {:ok, %Task{} = updated_task} <- task |> Task.Service.update(params), + updated_task <- preload(updated_task) + do current_user |> track_updated(updated_task) current_user |> maybe_track_connected(updated_task, task) @@ -53,6 +60,12 @@ defmodule CodeCorpsWeb.TaskController do end end + @preloads [:comments, :github_pull_request, :task_skills, :user_task] + + def preload(data) do + Repo.preload(data, @preloads) + end + # tracking @spec track_created(User.t, Task.t) :: any diff --git a/lib/code_corps_web/controllers/task_list_controller.ex b/lib/code_corps_web/controllers/task_list_controller.ex index a7056b6da..6fa9682b9 100644 --- a/lib/code_corps_web/controllers/task_list_controller.ex +++ b/lib/code_corps_web/controllers/task_list_controller.ex @@ -2,11 +2,7 @@ defmodule CodeCorpsWeb.TaskListController do @moduledoc false use CodeCorpsWeb, :controller - import CodeCorps.Helpers.Query, only: [ - project_filter: 2, sort_by_order: 1, - ] - - alias CodeCorps.TaskList + alias CodeCorps.{Helpers.Query, TaskList} action_fallback CodeCorpsWeb.FallbackController plug CodeCorpsWeb.Plug.DataToAttributes @@ -14,15 +10,27 @@ defmodule CodeCorpsWeb.TaskListController do @spec index(Conn.t, map) :: Conn.t def index(%Conn{} = conn, %{} = params) do - with task_lists <- TaskList |> project_filter(params) |> sort_by_order() |> Repo.all do - conn |> render("index.json-api", data: task_lists) - end + task_lists = + TaskList + |> Query.id_filter(params) + |> Query.project_filter(params) + |> Query.sort_by_order() + |> Repo.all() + |> preload() + + conn |> render("index.json-api", data: task_lists) end @spec show(Conn.t, map) :: Conn.t def show(%Conn{} = conn, %{"id" => id}) do - with %TaskList{} = task_list <- TaskList |> Repo.get(id) do + with %TaskList{} = task_list <- TaskList |> Repo.get(id) |> preload() do conn |> render("show.json-api", data: task_list) end end + + @preloads [:tasks] + + def preload(data) do + Repo.preload(data, @preloads) + end end diff --git a/lib/code_corps_web/controllers/user_controller.ex b/lib/code_corps_web/controllers/user_controller.ex index 6480130b6..503b22dac 100644 --- a/lib/code_corps_web/controllers/user_controller.ex +++ b/lib/code_corps_web/controllers/user_controller.ex @@ -15,21 +15,28 @@ defmodule CodeCorpsWeb.UserController do @spec index(Conn.t, map) :: Conn.t def index(%Conn{} = conn, %{} = params) do - with users <- User |> Query.id_filter(params) |> Query.limit_filter(params) |> Query.user_filter(params) |> Repo.all do - conn |> render("index.json-api", data: users) - end + users = + User + |> Query.id_filter(params) + |> Query.limit_filter(params) + |> Query.user_filter(params) + |> Repo.all() + |> preload() + + conn |> render("index.json-api", data: users) end @spec show(Conn.t, map) :: Conn.t def show(%Conn{} = conn, %{"id" => id}) do - with %User{} = user <- User |> Repo.get(id) do + with %User{} = user <- User |> Repo.get(id) |> preload() do conn |> render("show.json-api", data: user) end end @spec create(Conn.t, map) :: Conn.t def create(%Conn{} = conn, %{} = params) do - with {:ok, %User{} = user} <- %User{} |> User.registration_changeset(params) |> Repo.insert + with {:ok, %User{} = user} <- %User{} |> User.registration_changeset(params) |> Repo.insert(), + user <- preload(user) do conn |> put_status(:created) |> render("show.json-api", data: user) end @@ -40,7 +47,8 @@ defmodule CodeCorpsWeb.UserController do with %User{} = user <- User |> Repo.get(id), %User{} = current_user <- conn |> Guardian.Plug.current_resource, {:ok, :authorized} <- current_user |> Policy.authorize(:update, user), - {:ok, user, _, _} <- user |> UserService.update(params) + {:ok, user, _, _} <- user |> UserService.update(params), + user <- preload(user) do conn |> render("show.json-api", data: user) end @@ -52,7 +60,8 @@ defmodule CodeCorpsWeb.UserController do @spec github_oauth(Conn.t, map) :: Conn.t def github_oauth(%Conn{} = conn, %{"code" => code, "state" => state}) do current_user = Guardian.Plug.current_resource(conn) - with {:ok, user} <- GitHub.API.User.connect(current_user, code, state) + with {:ok, user} <- GitHub.API.User.connect(current_user, code, state), + user <- preload(user) do Analytics.SegmentTracker.track(user.id, "Connected to GitHub", user) conn |> render("show.json-api", data: user) @@ -71,4 +80,13 @@ defmodule CodeCorpsWeb.UserController do conn |> json(hash) end + @preloads [ + :github_app_installations, :project_users, :slugged_route, + :stripe_connect_subscriptions, :stripe_platform_card, + :stripe_platform_customer, :user_categories, :user_roles, :user_skills + ] + + def preload(data) do + Repo.preload(data, @preloads) + end end diff --git a/lib/code_corps_web/views/category_view.ex b/lib/code_corps_web/views/category_view.ex index 4d1739672..8ea78394c 100644 --- a/lib/code_corps_web/views/category_view.ex +++ b/lib/code_corps_web/views/category_view.ex @@ -1,6 +1,5 @@ defmodule CodeCorpsWeb.CategoryView do @moduledoc false - use CodeCorpsWeb.PreloadHelpers, default_preloads: [:project_categories] use CodeCorpsWeb, :view use JaSerializer.PhoenixView diff --git a/lib/code_corps_web/views/donation_goal_view.ex b/lib/code_corps_web/views/donation_goal_view.ex index 4f13d9434..e05aec5b9 100644 --- a/lib/code_corps_web/views/donation_goal_view.ex +++ b/lib/code_corps_web/views/donation_goal_view.ex @@ -1,6 +1,5 @@ defmodule CodeCorpsWeb.DonationGoalView do @moduledoc false - use CodeCorpsWeb.PreloadHelpers, default_preloads: ~w(project)a use CodeCorpsWeb, :view use JaSerializer.PhoenixView diff --git a/lib/code_corps_web/views/github_app_installation_view.ex b/lib/code_corps_web/views/github_app_installation_view.ex index 2a0ee4237..e3c035d8e 100644 --- a/lib/code_corps_web/views/github_app_installation_view.ex +++ b/lib/code_corps_web/views/github_app_installation_view.ex @@ -1,6 +1,5 @@ defmodule CodeCorpsWeb.GithubAppInstallationView do @moduledoc false - use CodeCorpsWeb.PreloadHelpers, default_preloads: ~w(github_repos organization_github_app_installations)a use CodeCorpsWeb, :view use JaSerializer.PhoenixView diff --git a/lib/code_corps_web/views/organization_view.ex b/lib/code_corps_web/views/organization_view.ex index df8d284b2..df3541c25 100644 --- a/lib/code_corps_web/views/organization_view.ex +++ b/lib/code_corps_web/views/organization_view.ex @@ -1,7 +1,6 @@ defmodule CodeCorpsWeb.OrganizationView do @moduledoc false alias CodeCorps.Cloudex.CloudinaryUrl - use CodeCorpsWeb.PreloadHelpers, default_preloads: [:organization_github_app_installations, :projects, :slugged_route, :stripe_connect_account] use CodeCorpsWeb, :view use JaSerializer.PhoenixView diff --git a/lib/code_corps_web/views/preload_helpers.ex b/lib/code_corps_web/views/preload_helpers.ex deleted file mode 100644 index f1e695b52..000000000 --- a/lib/code_corps_web/views/preload_helpers.ex +++ /dev/null @@ -1,11 +0,0 @@ -defmodule CodeCorpsWeb.PreloadHelpers do - @moduledoc false - - defmacro __using__(default_preloads: preloads) do - quote do - def preload(query, _conn, []) do - query |> CodeCorps.Repo.preload(unquote(preloads)) - end - end - end -end diff --git a/lib/code_corps_web/views/project_view.ex b/lib/code_corps_web/views/project_view.ex index 79a366644..6ce94d29b 100644 --- a/lib/code_corps_web/views/project_view.ex +++ b/lib/code_corps_web/views/project_view.ex @@ -3,12 +3,6 @@ defmodule CodeCorpsWeb.ProjectView do alias CodeCorps.StripeService.Validators.ProjectCanEnableDonations alias CodeCorps.Presenters.ImagePresenter - use CodeCorpsWeb.PreloadHelpers, - default_preloads: [ - :donation_goals, [organization: :stripe_connect_account], - :project_categories, :project_github_repos, :project_skills, - :project_users, :stripe_connect_plan, :task_lists, :tasks - ] use CodeCorpsWeb, :view use JaSerializer.PhoenixView @@ -28,8 +22,8 @@ defmodule CodeCorpsWeb.ProjectView do has_many :project_github_repos, serializer: CodeCorpsWeb.ProjectGithubRepoView, identifiers: :always has_many :project_skills, serializer: CodeCorpsWeb.ProjectSkillView, identifiers: :always has_many :project_users, serializer: CodeCorpsWeb.ProjectUserView, identifiers: :always - has_many :task_lists, serializer: CodeCorpsWeb.TaskListView, identifiers: :always has_many :tasks, serializer: CodeCorpsWeb.TaskView, identifiers: :always + has_many :task_lists, serializer: CodeCorpsWeb.TaskListView, identifiers: :always def can_activate_donations(project, _conn) do case ProjectCanEnableDonations.validate(project) do diff --git a/lib/code_corps_web/views/role_view.ex b/lib/code_corps_web/views/role_view.ex index 2f5d379e6..cb566880a 100644 --- a/lib/code_corps_web/views/role_view.ex +++ b/lib/code_corps_web/views/role_view.ex @@ -1,6 +1,5 @@ defmodule CodeCorpsWeb.RoleView do @moduledoc false - use CodeCorpsWeb.PreloadHelpers, default_preloads: [:role_skills] use CodeCorpsWeb, :view use JaSerializer.PhoenixView diff --git a/lib/code_corps_web/views/skill_view.ex b/lib/code_corps_web/views/skill_view.ex index cbdbe83a3..2ce0ebb2c 100644 --- a/lib/code_corps_web/views/skill_view.ex +++ b/lib/code_corps_web/views/skill_view.ex @@ -1,6 +1,5 @@ defmodule CodeCorpsWeb.SkillView do @moduledoc false - use CodeCorpsWeb.PreloadHelpers, default_preloads: [:role_skills] use CodeCorpsWeb, :view use JaSerializer.PhoenixView diff --git a/lib/code_corps_web/views/stripe_connect_account_view.ex b/lib/code_corps_web/views/stripe_connect_account_view.ex index bf79e04e5..ce3583f2f 100644 --- a/lib/code_corps_web/views/stripe_connect_account_view.ex +++ b/lib/code_corps_web/views/stripe_connect_account_view.ex @@ -1,6 +1,5 @@ defmodule CodeCorpsWeb.StripeConnectAccountView do @moduledoc false - use CodeCorpsWeb.PreloadHelpers, default_preloads: [:stripe_external_account] use CodeCorpsWeb, :view use JaSerializer.PhoenixView diff --git a/lib/code_corps_web/views/stripe_connect_subscription_view.ex b/lib/code_corps_web/views/stripe_connect_subscription_view.ex index fb542cdbc..0d62a6daa 100644 --- a/lib/code_corps_web/views/stripe_connect_subscription_view.ex +++ b/lib/code_corps_web/views/stripe_connect_subscription_view.ex @@ -1,6 +1,5 @@ defmodule CodeCorpsWeb.StripeConnectSubscriptionView do @moduledoc false - use CodeCorpsWeb.PreloadHelpers, default_preloads: [:project] use CodeCorpsWeb, :view use JaSerializer.PhoenixView diff --git a/lib/code_corps_web/views/task_list_view.ex b/lib/code_corps_web/views/task_list_view.ex index d159a62d2..63bb18cb6 100644 --- a/lib/code_corps_web/views/task_list_view.ex +++ b/lib/code_corps_web/views/task_list_view.ex @@ -1,6 +1,5 @@ defmodule CodeCorpsWeb.TaskListView do @moduledoc false - use CodeCorpsWeb.PreloadHelpers, default_preloads: [:tasks] use CodeCorpsWeb, :view use JaSerializer.PhoenixView diff --git a/lib/code_corps_web/views/task_view.ex b/lib/code_corps_web/views/task_view.ex index 12b8e8afa..9a2a9f517 100644 --- a/lib/code_corps_web/views/task_view.ex +++ b/lib/code_corps_web/views/task_view.ex @@ -1,7 +1,5 @@ defmodule CodeCorpsWeb.TaskView do @moduledoc false - use CodeCorpsWeb.PreloadHelpers, - default_preloads: [:comments, :github_pull_request, :task_skills, :user_task] use CodeCorpsWeb, :view use JaSerializer.PhoenixView diff --git a/lib/code_corps_web/views/user_view.ex b/lib/code_corps_web/views/user_view.ex index f9ad5e34a..b2cf92a7d 100644 --- a/lib/code_corps_web/views/user_view.ex +++ b/lib/code_corps_web/views/user_view.ex @@ -2,13 +2,6 @@ defmodule CodeCorpsWeb.UserView do @moduledoc false alias CodeCorps.Presenters.ImagePresenter - use CodeCorpsWeb.PreloadHelpers, - default_preloads: [ - :github_app_installations, :project_users, :slugged_route, - :stripe_connect_subscriptions, :stripe_platform_card, - :stripe_platform_customer, :user_categories, :user_roles, - :user_skills - ] use CodeCorpsWeb, :view use JaSerializer.PhoenixView diff --git a/priv/repo/migrations/20171026010933_add_more_missing_indexes.exs b/priv/repo/migrations/20171026010933_add_more_missing_indexes.exs new file mode 100644 index 000000000..4141421bd --- /dev/null +++ b/priv/repo/migrations/20171026010933_add_more_missing_indexes.exs @@ -0,0 +1,8 @@ +defmodule CodeCorps.Repo.Migrations.AddMoreMissingIndexes do + use Ecto.Migration + + def change do + create index(:tasks, [:archived]) + create index(:tasks, [:status]) + end +end diff --git a/priv/repo/migrations/20171027061833_add_more_indexes_again.exs b/priv/repo/migrations/20171027061833_add_more_indexes_again.exs new file mode 100644 index 000000000..4ed38ef8b --- /dev/null +++ b/priv/repo/migrations/20171027061833_add_more_indexes_again.exs @@ -0,0 +1,15 @@ +defmodule CodeCorps.Repo.Migrations.AddMoreIndexesAgain do + use Ecto.Migration + + def change do + create index(:auth_token, [:value]) + create index(:github_events, [:github_delivery_id], unique: true) + create index(:github_events, [:status]) + create index(:stripe_external_accounts, [:id_from_stripe], unique: true) + create index(:stripe_file_upload, [:id_from_stripe], unique: true) + create index(:tasks, [:number]) + create index(:tasks, [:order]) + create index(:task_lists, [:inbox]) + create index(:task_lists, [:order]) + end +end diff --git a/priv/repo/structure.sql b/priv/repo/structure.sql index ab39908ac..551f8fb5f 100644 --- a/priv/repo/structure.sql +++ b/priv/repo/structure.sql @@ -2333,6 +2333,13 @@ ALTER TABLE ONLY users CREATE INDEX auth_token_user_id_index ON auth_token USING btree (user_id); +-- +-- Name: auth_token_value_index; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX auth_token_value_index ON auth_token USING btree (value); + + -- -- Name: comments_github_comment_id_index; Type: INDEX; Schema: public; Owner: - -- @@ -2403,6 +2410,20 @@ CREATE UNIQUE INDEX github_comments_github_id_index ON github_comments USING btr CREATE INDEX github_comments_github_issue_id_index ON github_comments USING btree (github_issue_id); +-- +-- Name: github_events_github_delivery_id_index; Type: INDEX; Schema: public; Owner: - +-- + +CREATE UNIQUE INDEX github_events_github_delivery_id_index ON github_events USING btree (github_delivery_id); + + +-- +-- Name: github_events_status_index; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX github_events_status_index ON github_events USING btree (status); + + -- -- Name: github_issues_github_id_index; Type: INDEX; Schema: public; Owner: - -- @@ -2837,6 +2858,13 @@ CREATE INDEX stripe_connect_subscriptions_user_id_index ON stripe_connect_subscr CREATE UNIQUE INDEX stripe_events_id_from_stripe_index ON stripe_events USING btree (id_from_stripe); +-- +-- Name: stripe_external_accounts_id_from_stripe_index; Type: INDEX; Schema: public; Owner: - +-- + +CREATE UNIQUE INDEX stripe_external_accounts_id_from_stripe_index ON stripe_external_accounts USING btree (id_from_stripe); + + -- -- Name: stripe_external_accounts_stripe_connect_account_id_index; Type: INDEX; Schema: public; Owner: - -- @@ -2844,6 +2872,13 @@ CREATE UNIQUE INDEX stripe_events_id_from_stripe_index ON stripe_events USING bt CREATE INDEX stripe_external_accounts_stripe_connect_account_id_index ON stripe_external_accounts USING btree (stripe_connect_account_id); +-- +-- Name: stripe_file_upload_id_from_stripe_index; Type: INDEX; Schema: public; Owner: - +-- + +CREATE UNIQUE INDEX stripe_file_upload_id_from_stripe_index ON stripe_file_upload USING btree (id_from_stripe); + + -- -- Name: stripe_file_upload_stripe_connect_account_id_index; Type: INDEX; Schema: public; Owner: - -- @@ -2914,6 +2949,20 @@ CREATE UNIQUE INDEX stripe_platform_customers_pkey ON stripe_platform_customers CREATE UNIQUE INDEX stripe_platform_customers_user_id_index ON stripe_platform_customers USING btree (user_id); +-- +-- Name: task_lists_inbox_index; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX task_lists_inbox_index ON task_lists USING btree (inbox); + + +-- +-- Name: task_lists_order_index; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX task_lists_order_index ON task_lists USING btree ("order"); + + -- -- Name: task_lists_project_id_index; Type: INDEX; Schema: public; Owner: - -- @@ -2942,6 +2991,13 @@ CREATE INDEX task_skills_task_id_index ON task_skills USING btree (task_id); CREATE UNIQUE INDEX task_skills_task_id_skill_id_index ON task_skills USING btree (task_id, skill_id); +-- +-- Name: tasks_archived_index; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX tasks_archived_index ON tasks USING btree (archived); + + -- -- Name: tasks_github_issue_id_index; Type: INDEX; Schema: public; Owner: - -- @@ -2956,6 +3012,13 @@ CREATE INDEX tasks_github_issue_id_index ON tasks USING btree (github_issue_id); CREATE INDEX tasks_github_repo_id_index ON tasks USING btree (github_repo_id); +-- +-- Name: tasks_number_index; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX tasks_number_index ON tasks USING btree (number); + + -- -- Name: tasks_number_project_id_index; Type: INDEX; Schema: public; Owner: - -- @@ -2963,6 +3026,13 @@ CREATE INDEX tasks_github_repo_id_index ON tasks USING btree (github_repo_id); CREATE UNIQUE INDEX tasks_number_project_id_index ON tasks USING btree (number, project_id); +-- +-- Name: tasks_order_index; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX tasks_order_index ON tasks USING btree ("order"); + + -- -- Name: tasks_pkey; Type: INDEX; Schema: public; Owner: - -- @@ -2977,6 +3047,13 @@ CREATE UNIQUE INDEX tasks_pkey ON tasks USING btree (id); CREATE INDEX tasks_project_id_index ON tasks USING btree (project_id); +-- +-- Name: tasks_status_index; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX tasks_status_index ON tasks USING btree (status); + + -- -- Name: tasks_task_list_id_index; Type: INDEX; Schema: public; Owner: - -- @@ -3604,5 +3681,5 @@ ALTER TABLE ONLY user_tasks -- PostgreSQL database dump complete -- -INSERT INTO "schema_migrations" (version) VALUES (20160723215749), (20160804000000), (20160804001111), (20160805132301), (20160805203929), (20160808143454), (20160809214736), (20160810124357), (20160815125009), (20160815143002), (20160816020347), (20160816034021), (20160817220118), (20160818000944), (20160818132546), (20160820113856), (20160820164905), (20160822002438), (20160822004056), (20160822011624), (20160822020401), (20160822044612), (20160830081224), (20160830224802), (20160911233738), (20160912002705), (20160912145957), (20160918003206), (20160928232404), (20161003185918), (20161019090945), (20161019110737), (20161020144622), (20161021131026), (20161031001615), (20161121005339), (20161121014050), (20161121043941), (20161121045709), (20161122015942), (20161123081114), (20161123150943), (20161124085742), (20161125200620), (20161126045705), (20161127054559), (20161205024856), (20161207112519), (20161209192504), (20161212005641), (20161214005935), (20161215052051), (20161216051447), (20161218005913), (20161219160401), (20161219163909), (20161220141753), (20161221085759), (20161226213600), (20161231063614), (20170102130055), (20170102181053), (20170104113708), (20170104212623), (20170104235423), (20170106013143), (20170115035159), (20170115230549), (20170121014100), (20170131234029), (20170201014901), (20170201025454), (20170201035458), (20170201183258), (20170220032224), (20170224233516), (20170226050552), (20170228085250), (20170308214128), (20170308220713), (20170308222552), (20170313130611), (20170318032449), (20170318082740), (20170324194827), (20170424215355), (20170501225441), (20170505224222), (20170526095401), (20170602000208), (20170622205732), (20170626231059), (20170628092119), (20170628213609), (20170629183404), (20170630140136), (20170706132431), (20170707213648), (20170711122252), (20170717092127), (20170725060612), (20170727052644), (20170731130121), (20170814131722), (20170913114958), (20170921014405), (20170925214512), (20170925230419), (20170926134646), (20170927100300), (20170928234412), (20171003134956), (20171003225853), (20171006063358), (20171006161407), (20171012215106), (20171012221231), (20171016125229), (20171016125516), (20171016223356), (20171016235656), (20171017235433), (20171019191035), (20171025184225); +INSERT INTO "schema_migrations" (version) VALUES (20160723215749), (20160804000000), (20160804001111), (20160805132301), (20160805203929), (20160808143454), (20160809214736), (20160810124357), (20160815125009), (20160815143002), (20160816020347), (20160816034021), (20160817220118), (20160818000944), (20160818132546), (20160820113856), (20160820164905), (20160822002438), (20160822004056), (20160822011624), (20160822020401), (20160822044612), (20160830081224), (20160830224802), (20160911233738), (20160912002705), (20160912145957), (20160918003206), (20160928232404), (20161003185918), (20161019090945), (20161019110737), (20161020144622), (20161021131026), (20161031001615), (20161121005339), (20161121014050), (20161121043941), (20161121045709), (20161122015942), (20161123081114), (20161123150943), (20161124085742), (20161125200620), (20161126045705), (20161127054559), (20161205024856), (20161207112519), (20161209192504), (20161212005641), (20161214005935), (20161215052051), (20161216051447), (20161218005913), (20161219160401), (20161219163909), (20161220141753), (20161221085759), (20161226213600), (20161231063614), (20170102130055), (20170102181053), (20170104113708), (20170104212623), (20170104235423), (20170106013143), (20170115035159), (20170115230549), (20170121014100), (20170131234029), (20170201014901), (20170201025454), (20170201035458), (20170201183258), (20170220032224), (20170224233516), (20170226050552), (20170228085250), (20170308214128), (20170308220713), (20170308222552), (20170313130611), (20170318032449), (20170318082740), (20170324194827), (20170424215355), (20170501225441), (20170505224222), (20170526095401), (20170602000208), (20170622205732), (20170626231059), (20170628092119), (20170628213609), (20170629183404), (20170630140136), (20170706132431), (20170707213648), (20170711122252), (20170717092127), (20170725060612), (20170727052644), (20170731130121), (20170814131722), (20170913114958), (20170921014405), (20170925214512), (20170925230419), (20170926134646), (20170927100300), (20170928234412), (20171003134956), (20171003225853), (20171006063358), (20171006161407), (20171012215106), (20171012221231), (20171016125229), (20171016125516), (20171016223356), (20171016235656), (20171017235433), (20171019191035), (20171025184225), (20171026010933), (20171027061833); diff --git a/test/lib/code_corps_web/views/category_view_test.exs b/test/lib/code_corps_web/views/category_view_test.exs index 2bd4e38f0..cc3e4c5b9 100644 --- a/test/lib/code_corps_web/views/category_view_test.exs +++ b/test/lib/code_corps_web/views/category_view_test.exs @@ -5,6 +5,7 @@ defmodule CodeCorpsWeb.CategoryViewTest do category = insert(:category) project_category = insert(:project_category, category: category) + category = CodeCorpsWeb.CategoryController.preload(category) rendered_json = render(CodeCorpsWeb.CategoryView, "show.json-api", data: category) expected_json = %{ diff --git a/test/lib/code_corps_web/views/donation_goal_view_test.exs b/test/lib/code_corps_web/views/donation_goal_view_test.exs index 2b50f1ac2..ce41d07e4 100644 --- a/test/lib/code_corps_web/views/donation_goal_view_test.exs +++ b/test/lib/code_corps_web/views/donation_goal_view_test.exs @@ -8,6 +8,7 @@ defmodule CodeCorpsWeb.DonationGoalViewTest do donation_goal = insert(:donation_goal, project: project, amount: 500) CodeCorps.Services.DonationGoalsService.update_related_goals(donation_goal) + donation_goal = CodeCorpsWeb.DonationGoalController.preload(donation_goal) rendered_json = render(CodeCorpsWeb.DonationGoalView, "show.json-api", data: donation_goal) expected_json = %{ diff --git a/test/lib/code_corps_web/views/github_app_installation_view_test.exs b/test/lib/code_corps_web/views/github_app_installation_view_test.exs index dd7823238..7ef5b085f 100644 --- a/test/lib/code_corps_web/views/github_app_installation_view_test.exs +++ b/test/lib/code_corps_web/views/github_app_installation_view_test.exs @@ -9,7 +9,13 @@ defmodule CodeCorpsWeb.GithubAppInstallationViewTest do organization_github_app_installation = insert(:organization_github_app_installation, github_app_installation: github_app_installation, organization: organization) github_repo = insert(:github_repo, github_app_installation: github_app_installation) - rendered_json = render(CodeCorpsWeb.GithubAppInstallationView, "show.json-api", data: github_app_installation) + github_app_installation = + github_app_installation + |> CodeCorpsWeb.GithubAppInstallationController.preload() + + rendered_json = + CodeCorpsWeb.GithubAppInstallationView + |> render("show.json-api", data: github_app_installation) expected_json = %{ "data" => %{ diff --git a/test/lib/code_corps_web/views/organization_view_test.exs b/test/lib/code_corps_web/views/organization_view_test.exs index 29e3cc457..7a3204d83 100644 --- a/test/lib/code_corps_web/views/organization_view_test.exs +++ b/test/lib/code_corps_web/views/organization_view_test.exs @@ -12,6 +12,7 @@ defmodule CodeCorpsWeb.OrganizationViewTest do host = Application.get_env(:code_corps, :asset_host) + organization = CodeCorpsWeb.OrganizationController.preload(organization) rendered_json = render(CodeCorpsWeb.OrganizationView, "show.json-api", data: organization) expected_json = %{ diff --git a/test/lib/code_corps_web/views/project_view_test.exs b/test/lib/code_corps_web/views/project_view_test.exs index b2bd242d3..b0c4a5e3b 100644 --- a/test/lib/code_corps_web/views/project_view_test.exs +++ b/test/lib/code_corps_web/views/project_view_test.exs @@ -12,10 +12,11 @@ defmodule CodeCorpsWeb.ProjectViewTest do project_user = insert(:project_user, project: project) stripe_connect_plan = insert(:stripe_connect_plan, project: project) task_list = insert(:task_list, project: project) - task = insert(:task, project: project, task_list: task_list) + task = insert(:task, task_list: task_list, project: project) host = Application.get_env(:code_corps, :asset_host) + project = CodeCorpsWeb.ProjectController.preload(project) rendered_json = render(CodeCorpsWeb.ProjectView, "show.json-api", data: project) expected_json = %{ @@ -121,6 +122,7 @@ defmodule CodeCorpsWeb.ProjectViewTest do insert(:stripe_connect_account, organization: organization, charges_enabled: true, transfers_enabled: true) conn = Phoenix.ConnTest.build_conn() + project = CodeCorpsWeb.ProjectController.preload(project) rendered_json = render(CodeCorpsWeb.ProjectView, "show.json-api", data: project, conn: conn) assert rendered_json["data"]["attributes"]["can-activate-donations"] == true end @@ -131,6 +133,7 @@ defmodule CodeCorpsWeb.ProjectViewTest do insert(:stripe_connect_plan, project: project) conn = Phoenix.ConnTest.build_conn() + project = CodeCorpsWeb.ProjectController.preload(project) rendered_json = render(CodeCorpsWeb.ProjectView, "show.json-api", data: project, conn: conn) assert rendered_json["data"]["attributes"]["donations-active"] == true end @@ -140,6 +143,7 @@ defmodule CodeCorpsWeb.ProjectViewTest do insert(:donation_goal, project: project) conn = Phoenix.ConnTest.build_conn() + project = CodeCorpsWeb.ProjectController.preload(project) rendered_json = render(CodeCorpsWeb.ProjectView, "show.json-api", data: project, conn: conn) assert rendered_json["data"]["attributes"]["donations-active"] == false end @@ -148,6 +152,7 @@ defmodule CodeCorpsWeb.ProjectViewTest do project = insert(:project) conn = Phoenix.ConnTest.build_conn() + project = CodeCorpsWeb.ProjectController.preload(project) rendered_json = render(CodeCorpsWeb.ProjectView, "show.json-api", data: project, conn: conn) assert rendered_json["data"]["attributes"]["donations-active"] == false end diff --git a/test/lib/code_corps_web/views/role_view_test.exs b/test/lib/code_corps_web/views/role_view_test.exs index 3949b9bb6..537489db9 100644 --- a/test/lib/code_corps_web/views/role_view_test.exs +++ b/test/lib/code_corps_web/views/role_view_test.exs @@ -5,6 +5,7 @@ defmodule CodeCorpsWeb.RoleViewTest do role = insert(:role) role_skill = insert(:role_skill, role: role) + role = CodeCorpsWeb.RoleController.preload(role) rendered_json = render(CodeCorpsWeb.RoleView, "show.json-api", data: role) expected_json = %{ diff --git a/test/lib/code_corps_web/views/skill_view_test.exs b/test/lib/code_corps_web/views/skill_view_test.exs index 7fd204372..246c55517 100644 --- a/test/lib/code_corps_web/views/skill_view_test.exs +++ b/test/lib/code_corps_web/views/skill_view_test.exs @@ -5,7 +5,8 @@ defmodule CodeCorpsWeb.SkillViewTest do skill = insert(:skill) role_skill = insert(:role_skill, skill: skill) - rendered_json = render(CodeCorpsWeb.SkillView, "show.json-api", data: skill) + skill = CodeCorpsWeb.SkillController.preload(skill) + rendered_json = render(CodeCorpsWeb.SkillView, "show.json-api", data: skill) expected_json = %{ "data" => %{ diff --git a/test/lib/code_corps_web/views/stripe_connect_account_view_test.exs b/test/lib/code_corps_web/views/stripe_connect_account_view_test.exs index f1dd4da55..93d1fad05 100644 --- a/test/lib/code_corps_web/views/stripe_connect_account_view_test.exs +++ b/test/lib/code_corps_web/views/stripe_connect_account_view_test.exs @@ -15,6 +15,7 @@ defmodule CodeCorpsWeb.StripeConnectAccountViewTest do routing_number: "123456789" ) + account = CodeCorpsWeb.StripeConnectAccountController.preload(account) rendered_json = render(CodeCorpsWeb.StripeConnectAccountView, "show.json-api", data: account) expected_json = %{ @@ -104,6 +105,7 @@ defmodule CodeCorpsWeb.StripeConnectAccountViewTest do organization = insert(:organization) account = insert(:stripe_connect_account, organization: organization, charges_enabled: true) + account = CodeCorpsWeb.StripeConnectAccountController.preload(account) rendered_json = render(CodeCorpsWeb.StripeConnectAccountView, "show.json-api", data: account) assert rendered_json["data"]["attributes"]["can-accept-donations"] == true assert rendered_json["data"]["attributes"]["charges-enabled"] == true @@ -117,6 +119,7 @@ defmodule CodeCorpsWeb.StripeConnectAccountViewTest do organization = insert(:organization) account = insert(:stripe_connect_account, organization: organization, charges_enabled: false) + account = CodeCorpsWeb.StripeConnectAccountController.preload(account) rendered_json = render(CodeCorpsWeb.StripeConnectAccountView, "show.json-api", data: account) assert rendered_json["data"]["attributes"]["can-accept-donations"] == false assert rendered_json["data"]["attributes"]["charges-enabled"] == false @@ -128,6 +131,7 @@ defmodule CodeCorpsWeb.StripeConnectAccountViewTest do organization = insert(:organization) account = insert(:stripe_connect_account, organization: organization, charges_enabled: false) + account = CodeCorpsWeb.StripeConnectAccountController.preload(account) rendered_json = render(CodeCorpsWeb.StripeConnectAccountView, "show.json-api", data: account) assert rendered_json["data"]["attributes"]["can-accept-donations"] == true assert rendered_json["data"]["attributes"]["charges-enabled"] == false @@ -136,30 +140,35 @@ defmodule CodeCorpsWeb.StripeConnectAccountViewTest do describe "recipient-status" do test "renders as 'required' by default" do account = insert(:stripe_connect_account, legal_entity_verification_status: "unverified") + account = CodeCorpsWeb.StripeConnectAccountController.preload(account) rendered_json = render(CodeCorpsWeb.StripeConnectAccountView, "show.json-api", data: account) assert rendered_json["data"]["attributes"]["recipient-status"] == "required" end test "renders as 'verifying' when fields_needed includes personal_id_number" do account = insert(:stripe_connect_account, legal_entity_verification_status: "unverified", verification_fields_needed: ["legal_entity.personal_id_number"]) + account = CodeCorpsWeb.StripeConnectAccountController.preload(account) rendered_json = render(CodeCorpsWeb.StripeConnectAccountView, "show.json-api", data: account) assert rendered_json["data"]["attributes"]["recipient-status"] == "verifying" end test "renders as 'verifying' when fields_needed includes verification.document" do account = insert(:stripe_connect_account, legal_entity_verification_status: "unverified", verification_fields_needed: ["legal_entity.verification.document"]) + account = CodeCorpsWeb.StripeConnectAccountController.preload(account) rendered_json = render(CodeCorpsWeb.StripeConnectAccountView, "show.json-api", data: account) assert rendered_json["data"]["attributes"]["recipient-status"] == "verifying" end test "renders as 'verifying' when appropriate" do account = insert(:stripe_connect_account, legal_entity_verification_status: "pending") + account = CodeCorpsWeb.StripeConnectAccountController.preload(account) rendered_json = render(CodeCorpsWeb.StripeConnectAccountView, "show.json-api", data: account) assert rendered_json["data"]["attributes"]["recipient-status"] == "verifying" end test "renders as 'verified' when appropriate" do account = insert(:stripe_connect_account, legal_entity_verification_status: "verified") + account = CodeCorpsWeb.StripeConnectAccountController.preload(account) rendered_json = render(CodeCorpsWeb.StripeConnectAccountView, "show.json-api", data: account) assert rendered_json["data"]["attributes"]["recipient-status"] == "verified" end @@ -168,6 +177,7 @@ defmodule CodeCorpsWeb.StripeConnectAccountViewTest do describe "verification-document-status" do test "renders as 'pending_requirement' by default" do account = insert(:stripe_connect_account) + account = CodeCorpsWeb.StripeConnectAccountController.preload(account) rendered_json = render(CodeCorpsWeb.StripeConnectAccountView, "show.json-api", data: account) assert rendered_json["data"]["attributes"]["verification-document-status"] == "pending_requirement" end @@ -177,6 +187,7 @@ defmodule CodeCorpsWeb.StripeConnectAccountViewTest do :stripe_connect_account, legal_entity_verification_document: nil, verification_fields_needed: ["legal_entity.type"]) + account = CodeCorpsWeb.StripeConnectAccountController.preload(account) rendered_json = render(CodeCorpsWeb.StripeConnectAccountView, "show.json-api", data: account) assert rendered_json["data"]["attributes"]["verification-document-status"] == "pending_requirement" end @@ -186,6 +197,7 @@ defmodule CodeCorpsWeb.StripeConnectAccountViewTest do :stripe_connect_account, legal_entity_verification_document: nil, verification_fields_needed: ["legal_entity.verification.document"]) + account = CodeCorpsWeb.StripeConnectAccountController.preload(account) rendered_json = render(CodeCorpsWeb.StripeConnectAccountView, "show.json-api", data: account) assert rendered_json["data"]["attributes"]["verification-document-status"] == "required" end @@ -195,6 +207,7 @@ defmodule CodeCorpsWeb.StripeConnectAccountViewTest do :stripe_connect_account, legal_entity_verification_document: "file_123", legal_entity_verification_status: "pending") + account = CodeCorpsWeb.StripeConnectAccountController.preload(account) rendered_json = render(CodeCorpsWeb.StripeConnectAccountView, "show.json-api", data: account) assert rendered_json["data"]["attributes"]["verification-document-status"] == "verifying" end @@ -203,6 +216,7 @@ defmodule CodeCorpsWeb.StripeConnectAccountViewTest do account = insert( :stripe_connect_account, verification_fields_needed: nil) + account = CodeCorpsWeb.StripeConnectAccountController.preload(account) rendered_json = render(CodeCorpsWeb.StripeConnectAccountView, "show.json-api", data: account) assert rendered_json["data"]["attributes"]["verification-document-status"] == "verified" end @@ -212,6 +226,7 @@ defmodule CodeCorpsWeb.StripeConnectAccountViewTest do :stripe_connect_account, legal_entity_verification_document: "file_123", verification_fields_needed: ["legal_entity.personal_id_number"]) + account = CodeCorpsWeb.StripeConnectAccountController.preload(account) rendered_json = render(CodeCorpsWeb.StripeConnectAccountView, "show.json-api", data: account) assert rendered_json["data"]["attributes"]["verification-document-status"] == "verified" end @@ -221,6 +236,7 @@ defmodule CodeCorpsWeb.StripeConnectAccountViewTest do :stripe_connect_account, legal_entity_verification_document: "file_123", verification_fields_needed: ["legal_entity.verification.document"]) + account = CodeCorpsWeb.StripeConnectAccountController.preload(account) rendered_json = render(CodeCorpsWeb.StripeConnectAccountView, "show.json-api", data: account) assert rendered_json["data"]["attributes"]["verification-document-status"] == "errored" end @@ -229,6 +245,7 @@ defmodule CodeCorpsWeb.StripeConnectAccountViewTest do describe "personal-id-number-status" do test "renders as 'pending_requirement' by default" do account = insert(:stripe_connect_account) + account = CodeCorpsWeb.StripeConnectAccountController.preload(account) rendered_json = render(CodeCorpsWeb.StripeConnectAccountView, "show.json-api", data: account) assert rendered_json["data"]["attributes"]["personal-id-number-status"] == "pending_requirement" end @@ -238,6 +255,7 @@ defmodule CodeCorpsWeb.StripeConnectAccountViewTest do :stripe_connect_account, legal_entity_personal_id_number_provided: false, verification_fields_needed: ["legal_entity.type"]) + account = CodeCorpsWeb.StripeConnectAccountController.preload(account) rendered_json = render(CodeCorpsWeb.StripeConnectAccountView, "show.json-api", data: account) assert rendered_json["data"]["attributes"]["personal-id-number-status"] == "pending_requirement" end @@ -247,6 +265,7 @@ defmodule CodeCorpsWeb.StripeConnectAccountViewTest do :stripe_connect_account, legal_entity_personal_id_number_provided: false, verification_fields_needed: ["legal_entity.personal_id_number"]) + account = CodeCorpsWeb.StripeConnectAccountController.preload(account) rendered_json = render(CodeCorpsWeb.StripeConnectAccountView, "show.json-api", data: account) assert rendered_json["data"]["attributes"]["personal-id-number-status"] == "required" end @@ -256,6 +275,7 @@ defmodule CodeCorpsWeb.StripeConnectAccountViewTest do :stripe_connect_account, legal_entity_personal_id_number_provided: true, legal_entity_verification_status: "pending") + account = CodeCorpsWeb.StripeConnectAccountController.preload(account) rendered_json = render(CodeCorpsWeb.StripeConnectAccountView, "show.json-api", data: account) assert rendered_json["data"]["attributes"]["personal-id-number-status"] == "verifying" end @@ -264,6 +284,7 @@ defmodule CodeCorpsWeb.StripeConnectAccountViewTest do account = insert( :stripe_connect_account, verification_fields_needed: nil) + account = CodeCorpsWeb.StripeConnectAccountController.preload(account) rendered_json = render(CodeCorpsWeb.StripeConnectAccountView, "show.json-api", data: account) assert rendered_json["data"]["attributes"]["personal-id-number-status"] == "verified" end @@ -273,6 +294,7 @@ defmodule CodeCorpsWeb.StripeConnectAccountViewTest do :stripe_connect_account, legal_entity_personal_id_number_provided: true, verification_fields_needed: ["external_account"]) + account = CodeCorpsWeb.StripeConnectAccountController.preload(account) rendered_json = render(CodeCorpsWeb.StripeConnectAccountView, "show.json-api", data: account) assert rendered_json["data"]["attributes"]["personal-id-number-status"] == "verified" end @@ -281,6 +303,7 @@ defmodule CodeCorpsWeb.StripeConnectAccountViewTest do describe "bank-account-status" do test "renders as 'pending_requirement' by default" do account = insert(:stripe_connect_account) + account = CodeCorpsWeb.StripeConnectAccountController.preload(account) rendered_json = render(CodeCorpsWeb.StripeConnectAccountView, "show.json-api", data: account) assert rendered_json["data"]["attributes"]["bank-account-status"] == "pending_requirement" end @@ -290,6 +313,7 @@ defmodule CodeCorpsWeb.StripeConnectAccountViewTest do :stripe_connect_account, legal_entity_verification_status: "pending", verification_fields_needed: ["external_account"]) + account = CodeCorpsWeb.StripeConnectAccountController.preload(account) rendered_json = render(CodeCorpsWeb.StripeConnectAccountView, "show.json-api", data: account) assert rendered_json["data"]["attributes"]["bank-account-status"] == "pending_requirement" end @@ -299,6 +323,7 @@ defmodule CodeCorpsWeb.StripeConnectAccountViewTest do :stripe_connect_account, legal_entity_verification_status: "verified", verification_fields_needed: ["external_account"]) + account = CodeCorpsWeb.StripeConnectAccountController.preload(account) rendered_json = render(CodeCorpsWeb.StripeConnectAccountView, "show.json-api", data: account) assert rendered_json["data"]["attributes"]["bank-account-status"] == "required" end @@ -308,6 +333,7 @@ defmodule CodeCorpsWeb.StripeConnectAccountViewTest do :stripe_connect_account, legal_entity_verification_status: "verified", verification_fields_needed: []) + account = CodeCorpsWeb.StripeConnectAccountController.preload(account) rendered_json = render(CodeCorpsWeb.StripeConnectAccountView, "show.json-api", data: account) assert rendered_json["data"]["attributes"]["bank-account-status"] == "verified" end @@ -318,6 +344,7 @@ defmodule CodeCorpsWeb.StripeConnectAccountViewTest do account = insert(:stripe_connect_account) insert(:stripe_external_account, last4: "ABCD", routing_number: "123456", stripe_connect_account: account) + account = CodeCorpsWeb.StripeConnectAccountController.preload(account) rendered_json = render(CodeCorpsWeb.StripeConnectAccountView, "show.json-api", data: account) assert rendered_json["data"]["attributes"]["bank-account-last4"] == "ABCD" diff --git a/test/lib/code_corps_web/views/stripe_connect_subscription_view_test.exs b/test/lib/code_corps_web/views/stripe_connect_subscription_view_test.exs index 67df70713..2b11644b4 100644 --- a/test/lib/code_corps_web/views/stripe_connect_subscription_view_test.exs +++ b/test/lib/code_corps_web/views/stripe_connect_subscription_view_test.exs @@ -7,6 +7,7 @@ defmodule CodeCorpsWeb.StripeConnectSubscriptionViewTest do user = insert(:user) subscription = insert(:stripe_connect_subscription, stripe_connect_plan: plan, user: user) + subscription = CodeCorpsWeb.StripeConnectSubscriptionController.preload(subscription) rendered_json = render(CodeCorpsWeb.StripeConnectSubscriptionView, "show.json-api", data: subscription) expected_json = %{ diff --git a/test/lib/code_corps_web/views/task_list_view_test.exs b/test/lib/code_corps_web/views/task_list_view_test.exs index 525d8851b..f57181026 100644 --- a/test/lib/code_corps_web/views/task_list_view_test.exs +++ b/test/lib/code_corps_web/views/task_list_view_test.exs @@ -6,6 +6,7 @@ defmodule CodeCorpsWeb.TaskListViewTest do task_list = insert(:task_list, order: 1000, project: project) task = insert(:task, order: 1000, task_list: task_list) + task_list = CodeCorpsWeb.TaskListController.preload(task_list) rendered_json = render(CodeCorpsWeb.TaskListView, "show.json-api", data: task_list) expected_json = %{ diff --git a/test/lib/code_corps_web/views/task_view_test.exs b/test/lib/code_corps_web/views/task_view_test.exs index da99faebf..f99997f05 100644 --- a/test/lib/code_corps_web/views/task_view_test.exs +++ b/test/lib/code_corps_web/views/task_view_test.exs @@ -10,7 +10,8 @@ defmodule CodeCorpsWeb.TaskViewTest do task_skill = insert(:task_skill, task: task) user_task = insert(:user_task, task: task) - rendered_json = render(CodeCorpsWeb.TaskView, "show.json-api", data: task) + task = CodeCorpsWeb.TaskController.preload(task) + rendered_json = render(CodeCorpsWeb.TaskView, "show.json-api", data: task) expected_json = %{ "data" => %{ diff --git a/test/lib/code_corps_web/views/user_view_test.exs b/test/lib/code_corps_web/views/user_view_test.exs index 2f10bbbcd..a53a30129 100644 --- a/test/lib/code_corps_web/views/user_view_test.exs +++ b/test/lib/code_corps_web/views/user_view_test.exs @@ -20,6 +20,7 @@ defmodule CodeCorpsWeb.UserViewTest do host = Application.get_env(:code_corps, :asset_host) intercom_user_hash = UserView.intercom_user_hash(user, %Plug.Conn{}) + user = CodeCorpsWeb.UserController.preload(user) rendered_json = render(UserView, "show.json-api", data: user) expected_json = %{ @@ -105,6 +106,7 @@ defmodule CodeCorpsWeb.UserViewTest do ConnTest.build_conn() |> Conn.assign(:current_user, user) + user = CodeCorpsWeb.UserController.preload(user) rendered_json = render(UserView, "show.json-api", data: user, conn: conn) assert rendered_json["data"]["attributes"]["email"] == user.email end @@ -117,6 +119,7 @@ defmodule CodeCorpsWeb.UserViewTest do ConnTest.build_conn() |> Conn.assign(:current_user, auth_user) + users = CodeCorpsWeb.UserController.preload(users) rendered_json = render(UserView, "show.json-api", data: users, conn: conn) emails = @@ -157,6 +160,8 @@ defmodule CodeCorpsWeb.UserViewTest do end defp render_user_json(user) do + user = CodeCorpsWeb.UserController.preload(user) + conn = ConnTest.build_conn() |> Conn.assign(:current_user, user)