summaryrefslogtreecommitdiff
path: root/app/models/members
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2014-09-14 19:32:51 +0300
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2014-09-14 19:32:51 +0300
commitc69b8e04591907d030b2cd544a606fd0e576116a (patch)
tree317db4259219bc7f3a3ff6e3c38c802a8d086d2c /app/models/members
parenteb4a9bfbca5427e6b9a8fcf2ed0b1f9f96ae099d (diff)
downloadgitlab-ce-c69b8e04591907d030b2cd544a606fd0e576116a.tar.gz
Huge replace of old users_project and users_group references
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Diffstat (limited to 'app/models/members')
-rw-r--r--app/models/members/group_member.rb40
-rw-r--r--app/models/members/project_member.rb133
2 files changed, 173 insertions, 0 deletions
diff --git a/app/models/members/group_member.rb b/app/models/members/group_member.rb
new file mode 100644
index 00000000000..7f68662de70
--- /dev/null
+++ b/app/models/members/group_member.rb
@@ -0,0 +1,40 @@
+class GroupMember < Member
+ SOURCE_TYPE = 'Group'
+
+ # Make sure group member points only to group as it source
+ default_value_for :source_type, SOURCE_TYPE
+ validates_format_of :source_type, with: /\AGroup\z/
+ default_scope { where(source_type: SOURCE_TYPE) }
+
+ scope :with_group, ->(group) { where(source_id: group.id) }
+ scope :with_user, ->(user) { where(user_id: user.id) }
+
+ after_create :notify_create
+ after_update :notify_update
+
+ def self.access_level_roles
+ Gitlab::Access.options_with_owner
+ end
+
+ def group
+ source
+ end
+
+ def access_field
+ access_level
+ end
+
+ def notify_create
+ notification_service.new_group_member(self)
+ end
+
+ def notify_update
+ if access_level_changed?
+ notification_service.update_group_member(self)
+ end
+ end
+
+ def notification_service
+ NotificationService.new
+ end
+end
diff --git a/app/models/members/project_member.rb b/app/models/members/project_member.rb
new file mode 100644
index 00000000000..403b87b7e36
--- /dev/null
+++ b/app/models/members/project_member.rb
@@ -0,0 +1,133 @@
+class ProjectMember < Member
+ SOURCE_TYPE = 'Project'
+
+ include Gitlab::ShellAdapter
+
+ # Make sure project member points only to project as it source
+ default_value_for :source_type, SOURCE_TYPE
+ validates_format_of :source_type, with: /\AProject\z/
+ default_scope { where(source_type: SOURCE_TYPE) }
+
+ after_create :post_create_hook
+ after_update :post_update_hook
+ after_destroy :post_destroy_hook
+
+ scope :in_project, ->(project) { where(source_id: project.id) }
+ scope :in_projects, ->(projects) { where(source_id: projects.pluck(:id)) }
+ scope :with_user, ->(user) { where(user_id: user.id) }
+
+ class << self
+
+ # Add users to project teams with passed access option
+ #
+ # access can be an integer representing a access code
+ # or symbol like :master representing role
+ #
+ # Ex.
+ # add_users_into_projects(
+ # project_ids,
+ # user_ids,
+ # ProjectMember::MASTER
+ # )
+ #
+ # add_users_into_projects(
+ # project_ids,
+ # user_ids,
+ # :master
+ # )
+ #
+ def add_users_into_projects(project_ids, user_ids, access)
+ access_level = if roles_hash.has_key?(access)
+ roles_hash[access]
+ elsif roles_hash.values.include?(access.to_i)
+ access
+ else
+ raise "Non valid access"
+ end
+
+ ProjectMember.transaction do
+ project_ids.each do |project_id|
+ user_ids.each do |user_id|
+ member = ProjectMember.new(access_level: access_level, user_id: user_id)
+ member.source_id = project_id
+ member.save
+ end
+ end
+ end
+
+ true
+ rescue
+ false
+ end
+
+ def truncate_teams(project_ids)
+ ProjectMember.transaction do
+ members = ProjectMember.where(source_id: project_ids)
+ members.each do |member|
+ member.destroy
+ end
+ end
+
+ true
+ rescue
+ false
+ end
+
+ def truncate_team project
+ truncate_teams [project.id]
+ end
+
+ def roles_hash
+ Gitlab::Access.sym_options
+ end
+
+ def access_roles
+ Gitlab::Access.options
+ end
+ end
+
+ def access_field
+ access_level
+ end
+
+ def owner?
+ project.owner == user
+ end
+
+ def post_create_hook
+ Event.create(
+ project_id: self.project.id,
+ action: Event::JOINED,
+ author_id: self.user.id
+ )
+
+ notification_service.new_team_member(self) unless owner?
+ system_hook_service.execute_hooks_for(self, :create)
+ end
+
+ def post_update_hook
+ notification_service.update_team_member(self) if self.access_level_changed?
+ end
+
+ def post_destroy_hook
+ Event.create(
+ project_id: self.project.id,
+ action: Event::LEFT,
+ author_id: self.user.id
+ )
+
+ system_hook_service.execute_hooks_for(self, :destroy)
+ end
+
+ def notification_service
+ NotificationService.new
+ end
+
+ def system_hook_service
+ SystemHooksService.new
+ end
+
+ def project
+ source
+ end
+end