From fa3ae24ca7a11f3d87c8838cf05a95dfecfa4c5c Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets <dzaporozhets@sphereconsultinginc.com>
Date: Tue, 2 Oct 2012 18:17:12 +0300
Subject: [PATCH] Group entity. Group has many projects

---
 app/models/group.rb                           | 22 +++++++++++++++++++
 app/models/project.rb                         |  3 +++
 db/migrate/20121002150926_create_groups.rb    | 11 ++++++++++
 .../20121002151033_add_group_id_to_project.rb |  5 +++++
 db/schema.rb                                  | 11 +++++++++-
 spec/factories/groups.rb                      | 21 ++++++++++++++++++
 spec/models/group_spec.rb                     | 22 +++++++++++++++++++
 spec/models/project_spec.rb                   | 22 +++++++++++++++++++
 8 files changed, 116 insertions(+), 1 deletion(-)
 create mode 100644 app/models/group.rb
 create mode 100644 db/migrate/20121002150926_create_groups.rb
 create mode 100644 db/migrate/20121002151033_add_group_id_to_project.rb
 create mode 100644 spec/factories/groups.rb
 create mode 100644 spec/models/group_spec.rb

diff --git a/app/models/group.rb b/app/models/group.rb
new file mode 100644
index 00000000000..f18b7d57650
--- /dev/null
+++ b/app/models/group.rb
@@ -0,0 +1,22 @@
+# == Schema Information
+#
+# Table name: groups
+#
+#  id         :integer         not null, primary key
+#  name       :string(255)     not null
+#  code       :string(255)     not null
+#  owner_id   :integer         not null
+#  created_at :datetime        not null
+#  updated_at :datetime        not null
+#
+
+class Group < ActiveRecord::Base
+  attr_accessible :code, :name, :owner_id
+
+  has_many :projects
+  belongs_to :owner, class_name: "User"
+
+  validates :name, presence: true, uniqueness: true
+  validates :code, presence: true, uniqueness: true
+  validates :owner_id, presence: true
+end
diff --git a/app/models/project.rb b/app/models/project.rb
index 9b13de62e82..9d2b99e599b 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -11,6 +11,7 @@ class Project < ActiveRecord::Base
   attr_accessor :error_code
 
   # Relations
+  belongs_to :group
   belongs_to :owner, class_name: "User"
   has_many :users,          through: :users_projects
   has_many :events,         dependent: :destroy
@@ -173,4 +174,6 @@ end
 #  wall_enabled           :boolean         default(TRUE), not null
 #  merge_requests_enabled :boolean         default(TRUE), not null
 #  wiki_enabled           :boolean         default(TRUE), not null
+#  group_id               :integer
 #
+
diff --git a/db/migrate/20121002150926_create_groups.rb b/db/migrate/20121002150926_create_groups.rb
new file mode 100644
index 00000000000..ac178294c02
--- /dev/null
+++ b/db/migrate/20121002150926_create_groups.rb
@@ -0,0 +1,11 @@
+class CreateGroups < ActiveRecord::Migration
+  def change
+    create_table :groups do |t|
+      t.string :name, null: false
+      t.string :code, null: false
+      t.integer :owner_id, null: false
+
+      t.timestamps
+    end
+  end
+end
diff --git a/db/migrate/20121002151033_add_group_id_to_project.rb b/db/migrate/20121002151033_add_group_id_to_project.rb
new file mode 100644
index 00000000000..683fbfec513
--- /dev/null
+++ b/db/migrate/20121002151033_add_group_id_to_project.rb
@@ -0,0 +1,5 @@
+class AddGroupIdToProject < ActiveRecord::Migration
+  def change
+    add_column :projects, :group_id, :integer
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 00bb55234af..ec4729c0c08 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -11,7 +11,7 @@
 #
 # It's strongly recommended to check this file into your version control system.
 
-ActiveRecord::Schema.define(:version => 20120905043334) do
+ActiveRecord::Schema.define(:version => 20121002151033) do
 
   create_table "events", :force => true do |t|
     t.string   "target_type"
@@ -25,6 +25,14 @@ ActiveRecord::Schema.define(:version => 20120905043334) do
     t.integer  "author_id"
   end
 
+  create_table "groups", :force => true do |t|
+    t.string   "name",       :null => false
+    t.string   "code",       :null => false
+    t.integer  "owner_id",   :null => false
+    t.datetime "created_at", :null => false
+    t.datetime "updated_at", :null => false
+  end
+
   create_table "issues", :force => true do |t|
     t.string   "title"
     t.integer  "assignee_id"
@@ -108,6 +116,7 @@ ActiveRecord::Schema.define(:version => 20120905043334) do
     t.boolean  "wall_enabled",           :default => true, :null => false
     t.boolean  "merge_requests_enabled", :default => true, :null => false
     t.boolean  "wiki_enabled",           :default => true, :null => false
+    t.integer  "group_id"
   end
 
   create_table "protected_branches", :force => true do |t|
diff --git a/spec/factories/groups.rb b/spec/factories/groups.rb
new file mode 100644
index 00000000000..d583b186fed
--- /dev/null
+++ b/spec/factories/groups.rb
@@ -0,0 +1,21 @@
+# == Schema Information
+#
+# Table name: groups
+#
+#  id         :integer         not null, primary key
+#  name       :string(255)     not null
+#  code       :string(255)     not null
+#  owner_id   :integer         not null
+#  created_at :datetime        not null
+#  updated_at :datetime        not null
+#
+
+# Read about factories at https://github.com/thoughtbot/factory_girl
+
+FactoryGirl.define do
+  factory :group do
+    name "MyString"
+    code "MyString"
+    owner_id 1
+  end
+end
diff --git a/spec/models/group_spec.rb b/spec/models/group_spec.rb
new file mode 100644
index 00000000000..eea196fd864
--- /dev/null
+++ b/spec/models/group_spec.rb
@@ -0,0 +1,22 @@
+# == Schema Information
+#
+# Table name: groups
+#
+#  id         :integer         not null, primary key
+#  name       :string(255)     not null
+#  code       :string(255)     not null
+#  owner_id   :integer         not null
+#  created_at :datetime        not null
+#  updated_at :datetime        not null
+#
+
+require 'spec_helper'
+
+describe Group do
+  it { should have_many :projects }
+  it { should validate_presence_of :name }
+  it { should validate_uniqueness_of(:name) }
+  it { should validate_presence_of :code }
+  it { should validate_uniqueness_of(:code) }
+  it { should validate_presence_of :owner_id }
+end
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index bb975a93dfd..b7d846e8c57 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -1,7 +1,29 @@
+# == Schema Information
+#
+# Table name: projects
+#
+#  id                     :integer         not null, primary key
+#  name                   :string(255)
+#  path                   :string(255)
+#  description            :text
+#  created_at             :datetime        not null
+#  updated_at             :datetime        not null
+#  private_flag           :boolean         default(TRUE), not null
+#  code                   :string(255)
+#  owner_id               :integer
+#  default_branch         :string(255)
+#  issues_enabled         :boolean         default(TRUE), not null
+#  wall_enabled           :boolean         default(TRUE), not null
+#  merge_requests_enabled :boolean         default(TRUE), not null
+#  wiki_enabled           :boolean         default(TRUE), not null
+#  group_id               :integer
+#
+
 require 'spec_helper'
 
 describe Project do
   describe "Associations" do
+    it { should belong_to(:group) }
     it { should belong_to(:owner).class_name('User') }
     it { should have_many(:users) }
     it { should have_many(:events).dependent(:destroy) }
-- 
GitLab