Skip to content

Commit b4544cd

Browse files
committed
PartnerGroup and PartnerGroupMembership models
- migrations - factories - validation specs
1 parent eafb692 commit b4544cd

11 files changed

+189
-0
lines changed

app/controllers/api/v1/partner_requests_controller.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ def show
2222
return head :forbidden unless api_key_valid?
2323

2424
organization = Organization.find(params[:id])
25+
# replace this with items from partner group
2526
render json: organization.valid_items, status: :ok
2627
rescue ActiveRecord::RecordNotFound => e
2728
render json: { error: e.message }, status: :bad_request

app/models/organization.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class Organization < ApplicationRecord
4545
has_many :donations
4646
has_many :manufacturers
4747
has_many :partners
48+
has_many :partner_groups
4849
has_many :purchases
4950
has_many :requests
5051
has_many :storage_locations

app/models/partner_group.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# == Schema Information
2+
#
3+
# Table name: partner_groups
4+
#
5+
# id :bigint not null, primary key
6+
# name :string
7+
# created_at :datetime not null
8+
# updated_at :datetime not null
9+
# organization_id :bigint
10+
#
11+
class PartnerGroup < ApplicationRecord
12+
belongs_to :organization
13+
has_many :partner_group_memberships
14+
has_many :partners, through: :partner_group_memberships
15+
16+
validates :organization, presence: true
17+
validates :name, presence: true, uniqueness: { scope: :organization }
18+
end
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# == Schema Information
2+
#
3+
# Table name: partner_group_memberships
4+
#
5+
# id :bigint not null, primary key
6+
# created_at :datetime not null
7+
# updated_at :datetime not null
8+
# partner_group_id :bigint
9+
# partner_id :bigint
10+
#
11+
class PartnerGroupMembership < ApplicationRecord
12+
belongs_to :partner_group
13+
belongs_to :partner
14+
has_one :organization, through: :partner_group
15+
16+
validates :partner_group, presence: true
17+
validates :partner, presence: true, uniqueness: { scope: :partner_group }
18+
19+
validate :partner_belongs_to_partner_group_organization
20+
21+
private
22+
23+
def partner_belongs_to_partner_group_organization
24+
return if organization.nil?
25+
26+
unless organization == partner.organization
27+
errors.add :partner, "partner must belong to same organization as partner_group"
28+
end
29+
end
30+
end
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
class CreatePartnerGroups < ActiveRecord::Migration[6.0]
2+
def change
3+
create_table :partner_groups do |t|
4+
t.references :organization, foreign_key: true
5+
t.string :name
6+
7+
t.timestamps
8+
end
9+
end
10+
end
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
class CreatePartnerGroupMemberships < ActiveRecord::Migration[6.0]
2+
def change
3+
create_table :partner_group_memberships do |t|
4+
t.references :partner_group, foreign_key: true
5+
t.references :partner, foreign_key: true
6+
7+
t.timestamps
8+
end
9+
end
10+
end

db/schema.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
# It's strongly recommended that you check this file into your version control system.
1212

1313
ActiveRecord::Schema.define(version: 20_210_107_175_100) do
14+
1415
# These are extensions that must be enabled in order to support this database
1516
enable_extension "plpgsql"
1617

@@ -289,6 +290,23 @@
289290
t.index ["short_name"], name: "index_organizations_on_short_name"
290291
end
291292

293+
create_table "partner_group_memberships", force: :cascade do |t|
294+
t.bigint "partner_group_id"
295+
t.bigint "partner_id"
296+
t.datetime "created_at", precision: 6, null: false
297+
t.datetime "updated_at", precision: 6, null: false
298+
t.index ["partner_group_id"], name: "index_partner_group_memberships_on_partner_group_id"
299+
t.index ["partner_id"], name: "index_partner_group_memberships_on_partner_id"
300+
end
301+
302+
create_table "partner_groups", force: :cascade do |t|
303+
t.bigint "organization_id"
304+
t.string "name"
305+
t.datetime "created_at", precision: 6, null: false
306+
t.datetime "updated_at", precision: 6, null: false
307+
t.index ["organization_id"], name: "index_partner_groups_on_organization_id"
308+
end
309+
292310
create_table "partners", id: :serial, force: :cascade do |t|
293311
t.string "name"
294312
t.string "email"
@@ -418,6 +436,9 @@
418436
add_foreign_key "kits", "organizations"
419437
add_foreign_key "manufacturers", "organizations"
420438
add_foreign_key "organizations", "account_requests"
439+
add_foreign_key "partner_group_memberships", "partner_groups"
440+
add_foreign_key "partner_group_memberships", "partners"
441+
add_foreign_key "partner_groups", "organizations"
421442
add_foreign_key "requests", "organizations"
422443
add_foreign_key "requests", "partners"
423444
end
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# == Schema Information
2+
#
3+
# Table name: partner_group_memberships
4+
#
5+
# id :bigint not null, primary key
6+
# created_at :datetime not null
7+
# updated_at :datetime not null
8+
# partner_group_id :bigint
9+
# partner_id :bigint
10+
#
11+
12+
FactoryBot.define do
13+
factory :partner_group_membership do
14+
partner_group
15+
partner
16+
end
17+
end

spec/factories/partner_groups.rb

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# == Schema Information
2+
#
3+
# Table name: partner_groups
4+
#
5+
# id :bigint not null, primary key
6+
# name :string
7+
# created_at :datetime not null
8+
# updated_at :datetime not null
9+
# organization_id :bigint
10+
#
11+
12+
FactoryBot.define do
13+
factory :partner_group do
14+
sequence(:name) { |n| "Group #{n}" }
15+
organization { Organization.try(:first) || create(:organization) }
16+
end
17+
end
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# == Schema Information
2+
#
3+
# Table name: partner_group_memberships
4+
#
5+
# id :bigint not null, primary key
6+
# created_at :datetime not null
7+
# updated_at :datetime not null
8+
# partner_group_id :bigint
9+
# partner_id :bigint
10+
#
11+
RSpec.describe PartnerGroupMembership, type: :model do
12+
context "Validations >" do
13+
it "must belong to a partner_group" do
14+
expect(build(:partner_group_membership, partner_group_id: nil)).not_to be_valid
15+
end
16+
17+
it "must belong to a partner" do
18+
expect(build(:partner_group_membership, partner_id: nil)).not_to be_valid
19+
end
20+
21+
it "a partner can only be a member of a partner_group once" do
22+
membership = create(:partner_group_membership)
23+
expect(build(:partner_group_membership,
24+
partner_group: membership.partner_group,
25+
partner: membership.partner)).not_to be_valid
26+
end
27+
28+
it "a partner must belong to the same organization as the partner_group" do
29+
partner_group = create(:partner_group, organization: create(:organization))
30+
partner = create(:partner, organization: create(:organization))
31+
expect(build(:partner_group_membership,
32+
partner_group: partner_group,
33+
partner: partner)).not_to be_valid
34+
end
35+
end
36+
end

0 commit comments

Comments
 (0)