From f54e6a3a3e576dc297cf523924d452bb088a0d76 Mon Sep 17 00:00:00 2001 From: Christopher Styles Date: Sat, 18 Mar 2017 02:03:47 -0700 Subject: [PATCH] Remove organization memberships This update drops the `organization_memberships` table, removes all related temporary migration tasks from the `priv/repo/scripts` directory and removes all occurrences of organization memberships throughout the API codebase. Resolves #718. --- .../analytics/segment_event_name_builder.ex | 6 -- .../analytics/segment_tracking_support.ex | 2 - .../analytics/segment_traits_builder.ex | 8 -- lib/code_corps/validators/slug_validator.ex | 2 +- ...318082740_drop_organization_membership.exs | 20 ++++ .../migrate_organization_memberships.exs | 45 --------- .../scripts/migrate_organization_owners.exs | 33 ------- priv/repo/scripts/migrate_project_owners.exs | 33 ------- priv/repo/structure.sql | 73 +------------- .../segment_event_name_builder_test.exs | 5 - test/models/organization_membership_test.exs | 97 ------------------- test/support/factories.ex | 8 -- .../organization_membership_view_test.exs | 36 ------- test/views/organization_view_test.exs | 6 -- test/views/user_view_test.exs | 6 -- web/models/organization.ex | 3 - web/models/organization_membership.ex | 59 ----------- web/models/user.ex | 3 - web/views/organization_membership_view.ex | 10 -- web/views/organization_view.ex | 3 +- web/views/user_view.ex | 3 +- 21 files changed, 24 insertions(+), 437 deletions(-) create mode 100644 priv/repo/migrations/20170318082740_drop_organization_membership.exs delete mode 100644 priv/repo/scripts/migrate_organization_memberships.exs delete mode 100644 priv/repo/scripts/migrate_organization_owners.exs delete mode 100644 priv/repo/scripts/migrate_project_owners.exs delete mode 100644 test/models/organization_membership_test.exs delete mode 100644 test/views/organization_membership_view_test.exs delete mode 100644 web/models/organization_membership.ex delete mode 100644 web/views/organization_membership_view.ex diff --git a/lib/code_corps/analytics/segment_event_name_builder.ex b/lib/code_corps/analytics/segment_event_name_builder.ex index 84c95a823..00a89e161 100644 --- a/lib/code_corps/analytics/segment_event_name_builder.ex +++ b/lib/code_corps/analytics/segment_event_name_builder.ex @@ -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.OrganizationMembership{}) do - "Requested Organization Membership" - end - defp get_event_name(:update, %CodeCorps.OrganizationMembership{}) do - "Approved Organization Membership" - end defp get_event_name(:create, %CodeCorps.ProjectUser{}) do "Requested Project Membership" end diff --git a/lib/code_corps/analytics/segment_tracking_support.ex b/lib/code_corps/analytics/segment_tracking_support.ex index 5bd9ab2d2..8131fbf07 100644 --- a/lib/code_corps/analytics/segment_tracking_support.ex +++ b/lib/code_corps/analytics/segment_tracking_support.ex @@ -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.OrganizationMembership{}), do: true - def includes?(:update, %CodeCorps.OrganizationMembership{}), do: true def includes?(:create, %CodeCorps.ProjectUser{}), do: true def includes?(:update, %CodeCorps.ProjectUser{}), do: true def includes?(:create, %CodeCorps.StripeConnectAccount{}), do: true diff --git a/lib/code_corps/analytics/segment_traits_builder.ex b/lib/code_corps/analytics/segment_traits_builder.ex index 812abcf61..b696338cf 100644 --- a/lib/code_corps/analytics/segment_traits_builder.ex +++ b/lib/code_corps/analytics/segment_traits_builder.ex @@ -30,14 +30,6 @@ defmodule CodeCorps.Analytics.SegmentTraitsBuilder do } end - defp traits(organization_membership = %CodeCorps.OrganizationMembership{}) do - organization_membership = organization_membership |> CodeCorps.Repo.preload(:organization) - %{ - organization: organization_membership.organization.name, - organization_id: organization_membership.organization.id - } - end - defp traits(record = %CodeCorps.ProjectUser{}) do record = record |> CodeCorps.Repo.preload(:project) %{ diff --git a/lib/code_corps/validators/slug_validator.ex b/lib/code_corps/validators/slug_validator.ex index 3ace0f806..2c16a4991 100644 --- a/lib/code_corps/validators/slug_validator.ex +++ b/lib/code_corps/validators/slug_validator.ex @@ -34,7 +34,7 @@ defmodule CodeCorps.Validators.SlugValidator do images issues mentions notifications - oauth oauth_clients organizations organization-memberships + oauth oauth_clients organizations ping projects project-categories project-skills repositories roles diff --git a/priv/repo/migrations/20170318082740_drop_organization_membership.exs b/priv/repo/migrations/20170318082740_drop_organization_membership.exs new file mode 100644 index 000000000..5fa8bb94a --- /dev/null +++ b/priv/repo/migrations/20170318082740_drop_organization_membership.exs @@ -0,0 +1,20 @@ +defmodule CodeCorps.Repo.Migrations.DropOrganizationMembership do + use Ecto.Migration + + def up do + drop index :organization_memberships, [:member_id, :organization_id] + drop table(:organization_memberships) + end + + def down do + create table(:organization_memberships) do + add :role, :string, null: false + add :organization_id, references(:organizations, on_delete: :nothing), null: false + add :member_id, references(:users, on_delete: :nothing), null: false + + timestamps() + end + + create index :organization_memberships, [:member_id, :organization_id], unique: true + end +end diff --git a/priv/repo/scripts/migrate_organization_memberships.exs b/priv/repo/scripts/migrate_organization_memberships.exs deleted file mode 100644 index 6a6d7579f..000000000 --- a/priv/repo/scripts/migrate_organization_memberships.exs +++ /dev/null @@ -1,45 +0,0 @@ -defmodule CodeCorps.Repo.Scripts.MigrateOrganizations do - require Logger - - alias CodeCorps.{OrganizationMembership, Project, ProjectUser, Repo, User} - - def run do - OrganizationMembership - |> Repo.all() - |> Repo.preload([:member, {:organization, :projects}]) - |> Enum.map(&migrate_member/1) - |> aggregate_results - |> log - end - - defp migrate_member(%OrganizationMembership{ - member: user, - organization: %{projects: [project]}, - role: role - }) do - create_membership(project, user, role) - end - - defp create_membership(%Project{id: project_id}, %User{id: user_id}, role) do - %ProjectUser{} |> build_changeset(project_id, user_id, role) |> Repo.insert() - end - - defp build_changeset(struct, project_id, user_id, role) do - attrs = %{project_id: project_id, user_id: user_id, role: role} - struct - |> Ecto.Changeset.cast(attrs, [:project_id, :user_id, :role]) - |> Ecto.Changeset.unique_constraint(:project, name: :project_users_user_id_project_id_index) - end - - defp aggregate_results(results) do - passing_count = Enum.count(results, fn({status, _}) -> status == :ok end) - error_count = Enum.count(results, fn({status, _}) -> status == :error end) - {passing_count, error_count} - end - - defp log({passing_count, error_count}) do - Logger.info("#{passing_count} memberships migrated, #{error_count} errors.") - end -end - -CodeCorps.Repo.Scripts.MigrateOrganizations.run() diff --git a/priv/repo/scripts/migrate_organization_owners.exs b/priv/repo/scripts/migrate_organization_owners.exs deleted file mode 100644 index ec95c3386..000000000 --- a/priv/repo/scripts/migrate_organization_owners.exs +++ /dev/null @@ -1,33 +0,0 @@ -defmodule CodeCorps.Repo.Scripts.MigrateOrganizationOwners do - require Logger - - import Ecto.Query - - alias CodeCorps.{OrganizationMembership, Repo} - - def run do - OrganizationMembership - |> where([m], m.role == "owner") - |> Repo.all() - |> Repo.preload([:organization]) - |> Enum.map(&migrate_owner/1) - |> aggregate_results - |> log - end - - defp migrate_owner(%OrganizationMembership{member_id: user_id, organization: organization}) do - organization |> Ecto.Changeset.cast(%{owner_id: user_id}, [:owner_id]) |> Repo.update() - end - - defp aggregate_results(results) do - passing_count = Enum.count(results, fn({status, _}) -> status == :ok end) - error_count = Enum.count(results, fn({status, _}) -> status == :error end) - {passing_count, error_count} - end - - defp log({passing_count, error_count}) do - Logger.info("#{passing_count} owners migrated, #{error_count} errors.") - end -end - -CodeCorps.Repo.Scripts.MigrateOrganizationOwners.run() diff --git a/priv/repo/scripts/migrate_project_owners.exs b/priv/repo/scripts/migrate_project_owners.exs deleted file mode 100644 index 0a7bc9068..000000000 --- a/priv/repo/scripts/migrate_project_owners.exs +++ /dev/null @@ -1,33 +0,0 @@ -defmodule CodeCorps.Repo.Scripts.MigrateProjectOwners do - require Logger - - import Ecto.Query - - alias CodeCorps.{OrganizationMembership, Repo} - - def run do - OrganizationMembership - |> where([m], m.role == "owner") - |> Repo.all() - |> Repo.preload([:member, {:organization, :projects}]) - |> Enum.map(&migrate_owner/1) - |> aggregate_results - |> log - end - - defp migrate_owner(%OrganizationMembership{member_id: user_id, organization: %{projects: [project]}}) do - project |> Ecto.Changeset.cast(%{owner_id: user_id}, [:owner_id]) |> Repo.update() - end - - defp aggregate_results(results) do - passing_count = Enum.count(results, fn({status, _}) -> status == :ok end) - error_count = Enum.count(results, fn({status, _}) -> status == :error end) - {passing_count, error_count} - end - - defp log({passing_count, error_count}) do - Logger.info("#{passing_count} owners migrated, #{error_count} errors.") - end -end - -CodeCorps.Repo.Scripts.MigrateProjectOwners.run() diff --git a/priv/repo/structure.sql b/priv/repo/structure.sql index b15b46caf..7b30647db 100644 --- a/priv/repo/structure.sql +++ b/priv/repo/structure.sql @@ -183,39 +183,6 @@ CREATE SEQUENCE donation_goals_id_seq ALTER SEQUENCE donation_goals_id_seq OWNED BY donation_goals.id; --- --- Name: organization_memberships; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE organization_memberships ( - id integer NOT NULL, - role character varying(255) NOT NULL, - organization_id integer NOT NULL, - member_id integer NOT NULL, - inserted_at timestamp without time zone NOT NULL, - updated_at timestamp without time zone NOT NULL -); - - --- --- Name: organization_memberships_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE organization_memberships_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: organization_memberships_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE organization_memberships_id_seq OWNED BY organization_memberships.id; - - -- -- Name: organizations; Type: TABLE; Schema: public; Owner: - -- @@ -1403,13 +1370,6 @@ ALTER TABLE ONLY comments ALTER COLUMN id SET DEFAULT nextval('comments_id_seq': ALTER TABLE ONLY donation_goals ALTER COLUMN id SET DEFAULT nextval('donation_goals_id_seq'::regclass); --- --- Name: id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY organization_memberships ALTER COLUMN id SET DEFAULT nextval('organization_memberships_id_seq'::regclass); - - -- -- Name: id; Type: DEFAULT; Schema: public; Owner: - -- @@ -1652,14 +1612,6 @@ ALTER TABLE ONLY donation_goals ADD CONSTRAINT donation_goals_pkey PRIMARY KEY (id); --- --- Name: organization_memberships_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY organization_memberships - ADD CONSTRAINT organization_memberships_pkey PRIMARY KEY (id); - - -- -- Name: organizations_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- @@ -1930,13 +1882,6 @@ CREATE UNIQUE INDEX index_projects_on_user_id_skill_id ON user_skills USING btre CREATE UNIQUE INDEX index_skills_on_title ON skills USING btree (lower((title)::text)); --- --- Name: organization_memberships_member_id_organization_id_index; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX organization_memberships_member_id_organization_id_index ON organization_memberships USING btree (member_id, organization_id); - - -- -- Name: organizations_approved_index; Type: INDEX; Schema: public; Owner: - -- @@ -2284,22 +2229,6 @@ ALTER TABLE ONLY donation_goals ADD CONSTRAINT donation_goals_project_id_fkey FOREIGN KEY (project_id) REFERENCES projects(id); --- --- Name: organization_memberships_member_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY organization_memberships - ADD CONSTRAINT organization_memberships_member_id_fkey FOREIGN KEY (member_id) REFERENCES users(id); - - --- --- Name: organization_memberships_organization_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY organization_memberships - ADD CONSTRAINT organization_memberships_organization_id_fkey FOREIGN KEY (organization_id) REFERENCES organizations(id); - - -- -- Name: organizations_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- @@ -2664,5 +2593,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); +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); diff --git a/test/lib/code_corps/analytics/segment_event_name_builder_test.exs b/test/lib/code_corps/analytics/segment_event_name_builder_test.exs index 063b02534..053a071a3 100644 --- a/test/lib/code_corps/analytics/segment_event_name_builder_test.exs +++ b/test/lib/code_corps/analytics/segment_event_name_builder_test.exs @@ -13,11 +13,6 @@ defmodule CodeCorps.Analytics.SegmentEventNameBuilderTest do assert SegmentEventNameBuilder.build(:update, build(:comment)) == "Edited Comment" end - test "with organization membership" do - assert SegmentEventNameBuilder.build(:create, build(:organization_membership)) == "Requested Organization Membership" - assert SegmentEventNameBuilder.build(:update, build(:organization_membership)) == "Approved Organization Membership" - 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" diff --git a/test/models/organization_membership_test.exs b/test/models/organization_membership_test.exs deleted file mode 100644 index 643d76564..000000000 --- a/test/models/organization_membership_test.exs +++ /dev/null @@ -1,97 +0,0 @@ -defmodule CodeCorps.OrganizationMembershipTest do - use CodeCorps.ModelCase - - alias CodeCorps.OrganizationMembership - - describe "update_changeset role validation" do - test "includes pending" do - attrs = %{role: "pending"} - changeset = OrganizationMembership.update_changeset(%OrganizationMembership{}, attrs) - assert changeset.valid? - end - - test "includes contributor" do - attrs = %{role: "contributor"} - changeset = OrganizationMembership.update_changeset(%OrganizationMembership{}, attrs) - assert changeset.valid? - end - - test "includes admin" do - attrs = %{role: "admin"} - changeset = OrganizationMembership.update_changeset(%OrganizationMembership{}, attrs) - assert changeset.valid? - end - - test "includes owner" do - attrs = %{role: "owner"} - changeset = OrganizationMembership.update_changeset(%OrganizationMembership{}, attrs) - assert changeset.valid? - end - - test "does not include invalid values" do - attrs = %{role: "invalid"} - changeset = OrganizationMembership.update_changeset(%OrganizationMembership{}, attrs) - refute changeset.valid? - end - end - - describe "create_owner_changeset" do - @valid_attrs %{member_id: 1, organization_id: 2} - @invalid_attrs %{} - - test "changeset with valid attributes" do - changeset = OrganizationMembership.create_owner_changeset(%OrganizationMembership{}, @valid_attrs) - assert changeset.valid? - end - end - - describe "create_changeset" do - @valid_attrs %{member_id: 1, organization_id: 2} - @invalid_attrs %{} - - test "changeset with valid attributes" do - changeset = OrganizationMembership.create_changeset(%OrganizationMembership{}, @valid_attrs) - assert changeset.valid? - end - - test "changeset with invalid attributes" do - changeset = OrganizationMembership.create_changeset(%OrganizationMembership{}, @invalid_attrs) - refute changeset.valid? - - changeset |> assert_validation_triggered(:member_id, :required) - changeset |> assert_validation_triggered(:organization_id, :required) - end - - test "changeset ensures member and organization actually exist" do - changeset = OrganizationMembership.create_changeset(%OrganizationMembership{}, @valid_attrs) - - {result, changeset} = changeset |> Repo.insert - - assert result == :error - changeset |> assert_error_message(:organization, "does not exist") - - # assoc_constraint works through one relationship at a time - organization = insert(:organization) - attrs = Map.merge(@valid_attrs, %{organization_id: organization.id}) - changeset = OrganizationMembership.create_changeset(%OrganizationMembership{}, attrs) - - {result, changeset} = changeset |> Repo.insert - - assert result == :error - changeset |> assert_error_message(:member, "does not exist") - end - - test "ensures uniqueness of organization/member combination" do - existing = insert(:organization_membership) - - changeset = OrganizationMembership.create_changeset( - %OrganizationMembership{}, - %{member_id: existing.member_id, organization_id: existing.organization_id} - ) - - {:error, changeset} = changeset |> Repo.insert - - changeset |> assert_error_message(:member, "has already been taken") - end - end -end diff --git a/test/support/factories.ex b/test/support/factories.ex index 6f3d892c4..436920ce1 100644 --- a/test/support/factories.ex +++ b/test/support/factories.ex @@ -38,14 +38,6 @@ defmodule CodeCorps.Factories do } end - def organization_membership_factory do - %CodeCorps.OrganizationMembership{ - member: build(:user), - organization: build(:organization), - role: "contributor" - } - end - def task_factory do %CodeCorps.Task{ title: "Test task", diff --git a/test/views/organization_membership_view_test.exs b/test/views/organization_membership_view_test.exs deleted file mode 100644 index 08f8a61ad..000000000 --- a/test/views/organization_membership_view_test.exs +++ /dev/null @@ -1,36 +0,0 @@ -defmodule CodeCorps.OrganizationMembershipViewTest do - use CodeCorps.ViewCase - - test "renders all attributes and relationships properly" do - organization = insert(:organization) - user = insert(:user) - organization_membership = insert(:organization_membership, member: user, organization: organization) - - rendered_json = render(CodeCorps.OrganizationMembershipView, "show.json-api", data: organization_membership) - - expected_json = %{ - "data" => %{ - "id" => organization_membership.id |> Integer.to_string, - "type" => "organization-membership", - "attributes" => %{ - "inserted-at" => organization_membership.inserted_at, - "role" => organization_membership.role, - "updated-at" => organization_membership.updated_at - }, - "relationships" => %{ - "member" => %{ - "data" => %{"id" => organization_membership.member_id |> Integer.to_string, "type" => "user"} - }, - "organization" => %{ - "data" => %{"id" => organization_membership.organization_id |> Integer.to_string, "type" => "organization"} - } - } - }, - "jsonapi" => %{ - "version" => "1.0" - } - } - - assert rendered_json == expected_json - end -end diff --git a/test/views/organization_view_test.exs b/test/views/organization_view_test.exs index 3537d5cbd..eb9429ef7 100644 --- a/test/views/organization_view_test.exs +++ b/test/views/organization_view_test.exs @@ -5,7 +5,6 @@ defmodule CodeCorps.OrganizationViewTest do user = insert(:user) organization = insert(:organization, owner: user, default_color: "blue") project = insert(:project, organization: organization) - organization_membership = insert(:organization_membership, member: user, organization: organization) slugged_route = insert(:slugged_route, organization: organization) stripe_connect_account = insert(:stripe_connect_account, organization: organization) @@ -30,11 +29,6 @@ defmodule CodeCorps.OrganizationViewTest do "owner" => %{ "data" => %{"id" => user.id |> Integer.to_string, "type" => "user"} }, - "organization-memberships" => %{ - "data" => [ - %{"id" => organization_membership.id |> Integer.to_string, "type" => "organization-membership"} - ] - }, "projects" => %{ "data" => [ %{"id" => project.id |> Integer.to_string, "type" => "project"} diff --git a/test/views/user_view_test.exs b/test/views/user_view_test.exs index c60d341b0..410264402 100644 --- a/test/views/user_view_test.exs +++ b/test/views/user_view_test.exs @@ -6,7 +6,6 @@ defmodule CodeCorps.UserViewTest do test "renders all attributes and relationships properly" do user = insert(:user, first_name: "First", last_name: "Last", default_color: "blue") - organization_membership = insert(:organization_membership, member: user) slugged_route = insert(:slugged_route, user: user) stripe_connect_subscription = insert(:stripe_connect_subscription, user: user) stripe_platform_card = insert(:stripe_platform_card, user: user) @@ -42,11 +41,6 @@ defmodule CodeCorps.UserViewTest do "website" => user.website }, "relationships" => %{ - "organization-memberships" => %{ - "data" => [ - %{"id" => organization_membership.id |> Integer.to_string, "type" => "organization-membership"} - ] - }, "project-users" => %{ "data" => [ %{"id" => project_user.id |> Integer.to_string, "type" => "project-user"} diff --git a/web/models/organization.ex b/web/models/organization.ex index 687d812a6..d25df737d 100644 --- a/web/models/organization.ex +++ b/web/models/organization.ex @@ -28,9 +28,6 @@ defmodule CodeCorps.Organization do has_many :projects, CodeCorps.Project - has_many :organization_memberships, CodeCorps.OrganizationMembership - has_many :members, through: [:organization_memberships, :member] - timestamps() end diff --git a/web/models/organization_membership.ex b/web/models/organization_membership.ex deleted file mode 100644 index cefb1cbc6..000000000 --- a/web/models/organization_membership.ex +++ /dev/null @@ -1,59 +0,0 @@ -defmodule CodeCorps.OrganizationMembership do - @moduledoc """ - Represents a membership of a user in an organization. - """ - - use CodeCorps.Web, :model - - @type t :: %__MODULE__{} - - schema "organization_memberships" do - field :role, :string - - belongs_to :organization, CodeCorps.Organization - belongs_to :member, CodeCorps.User - - timestamps() - end - - @doc """ - Builds a changeset based on the `struct` and `params`, for creating a record. - The membership role is strictly set to "pending" by the system, regardless of parameters - """ - def create_changeset(struct, params \\ %{}) do - struct - |> cast(params, [:member_id, :organization_id]) - |> validate_required([:member_id, :organization_id]) - |> assoc_constraint(:member) - |> assoc_constraint(:organization) - |> unique_constraint(:member, name: :organization_memberships_member_id_organization_id_index) - |> put_change(:role, "pending") - end - - @doc """ - Builds a changeset based on the `struct` and `params`, for creating a record. - The membership role is strictly set to "owner" by the system, regardless of parameters - """ - def create_owner_changeset(struct, params \\ %{}) do - struct - |> cast(params, [:member_id, :organization_id]) - |> validate_required([:member_id, :organization_id]) - |> assoc_constraint(:member) - |> assoc_constraint(:organization) - |> put_change(:role, "owner") - end - - @doc """ - Builds a changeset based on the `struct` and `params`, for updating a record. - """ - def update_changeset(struct, params \\ %{}) do - struct - |> cast(params, [:role]) - |> validate_required([:role]) - |> validate_inclusion(:role, roles()) - end - - defp roles do - ~w{ pending contributor admin owner } - end -end diff --git a/web/models/user.ex b/web/models/user.ex index 9696562ea..10f20c1bd 100644 --- a/web/models/user.ex +++ b/web/models/user.ex @@ -33,9 +33,6 @@ defmodule CodeCorps.User do field :state, :string, default: "signed_up" field :state_transition, :string, virtual: true - has_many :organization_memberships, CodeCorps.OrganizationMembership, foreign_key: :member_id - has_many :organizations, through: [:organization_memberships, :organization] - has_one :slugged_route, SluggedRoute has_many :project_users, CodeCorps.ProjectUser diff --git a/web/views/organization_membership_view.ex b/web/views/organization_membership_view.ex deleted file mode 100644 index 72ba79b7b..000000000 --- a/web/views/organization_membership_view.ex +++ /dev/null @@ -1,10 +0,0 @@ -defmodule CodeCorps.OrganizationMembershipView do - use CodeCorps.PreloadHelpers, default_preloads: [:member, :organization] - use CodeCorps.Web, :view - use JaSerializer.PhoenixView - - attributes [:role, :inserted_at, :updated_at] - - has_one :member, serializer: CodeCorps.UserView - has_one :organization, serializer: CodeCorps.OrganizationView -end diff --git a/web/views/organization_view.ex b/web/views/organization_view.ex index 25b0c0942..c282381bf 100644 --- a/web/views/organization_view.ex +++ b/web/views/organization_view.ex @@ -1,6 +1,6 @@ defmodule CodeCorps.OrganizationView do alias CodeCorps.Cloudex.CloudinaryUrl - use CodeCorps.PreloadHelpers, default_preloads: [:owner, :organization_memberships, :projects, :slugged_route, :stripe_connect_account] + use CodeCorps.PreloadHelpers, default_preloads: [:owner, :projects, :slugged_route, :stripe_connect_account] use CodeCorps.Web, :view use JaSerializer.PhoenixView @@ -13,7 +13,6 @@ defmodule CodeCorps.OrganizationView do has_one :slugged_route, serializer: CodeCorps.SluggedRouteView has_one :stripe_connect_account, serializer: CodeCorps.StripeConnectAccountView - has_many :organization_memberships, serializer: CodeCorps.OrganizationMembershipView, identifiers: :always has_many :projects, serializer: CodeCorps.ProjectView, identifiers: :always def icon_large_url(organization, _conn) do diff --git a/web/views/user_view.ex b/web/views/user_view.ex index 205d8e426..72c82162f 100644 --- a/web/views/user_view.ex +++ b/web/views/user_view.ex @@ -5,7 +5,7 @@ defmodule CodeCorps.UserView do default_preloads: [ :project_users, :slugged_route, :stripe_connect_subscriptions, :stripe_platform_card, :stripe_platform_customer, - :organization_memberships, :user_categories, :user_roles, :user_skills + :user_categories, :user_roles, :user_skills ] use CodeCorps.Web, :view use JaSerializer.PhoenixView @@ -22,7 +22,6 @@ defmodule CodeCorps.UserView do has_many :project_users, serializer: CodeCorps.ProjectUserView, identifiers: :always has_many :stripe_connect_subscriptions, serializer: CodeCorps.StripeConnectSubscriptionView, identifiers: :always - has_many :organization_memberships, serializer: CodeCorps.OrganizationMembershipView, identifiers: :always has_many :user_categories, serializer: CodeCorps.UserCategoryView, identifiers: :always has_many :user_roles, serializer: CodeCorps.UserRoleView, identifiers: :always has_many :user_skills, serializer: CodeCorps.UserSkillView, identifiers: :always