Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAndrey Kumanyaev <me@zzet.org>2013-01-19 21:43:07 +0400
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2013-01-25 00:31:24 +0400
commit360aa1b4075ba6ffa9927971c580db0059ab4842 (patch)
tree99b0a448984191ff1b7c8c70894cce99386d61ff /lib
parent911f6eb1067f27606c9f6f1f8e554fba0cf02d19 (diff)
Team core management
Diffstat (limited to 'lib')
-rw-r--r--lib/gitlab/user_team_manager.rb93
1 files changed, 93 insertions, 0 deletions
diff --git a/lib/gitlab/user_team_manager.rb b/lib/gitlab/user_team_manager.rb
new file mode 100644
index 00000000000..d010c79223e
--- /dev/null
+++ b/lib/gitlab/user_team_manager.rb
@@ -0,0 +1,93 @@
+# UserTeamManager class
+#
+# Used for manage User teams with project repositories
+module Gitlab
+ class UserTeamManager
+ class << self
+ def assign(team, project, access)
+ project = Project.find(project) unless project.is_a? Project
+ searched_project = team.user_team_project_relationships.find_by_project_id(project.id)
+
+ unless searched_project.present?
+ team.user_team_project_relationships.create(project_id: project.id, greatest_access: access)
+ update_team_users_access_in_project(team, project)
+ end
+ end
+
+ def resign(team, project)
+ project = Project.find(project) unless project.is_a? Project
+
+ team.user_team_project_relationships.with_project(project).destroy_all
+
+ update_team_users_access_in_project(team, project)
+ end
+
+ def update_team_users_access_in_project(team, project)
+ members = team.members
+ members.each do |member|
+ update_team_user_access_in_project(team, member, project)
+ end
+ end
+
+ def update_team_user_access_in_project(team, user, project)
+ granted_access = max_teams_member_permission_in_project(user, project)
+
+ project_team_user = UsersProject.find_by_user_id_and_project_id(user.id, project.id)
+
+ if project_team_user.present?
+ project_team_user.destroy
+ end
+
+ if project_team_user.blank? && granted_access > 0
+ UsersProject.add_users_into_projects([project.id], [user.id], granted_access)
+ end
+ end
+
+ def max_teams_member_permission_in_project(user, project, teams = nil)
+ result_access = 0
+
+ user_teams = project.user_teams.with_member(user)
+
+ teams ||= user_teams
+
+ if teams.any?
+ teams.each do |team|
+ granted_access = max_team_member_permission_in_project(team, user, project)
+ result_access = [granted_access, result_access].max
+ end
+ end
+ result_access
+ end
+
+ def max_team_member_permission_in_project(team, user, project)
+ member_access = team.default_projects_access(user)
+ team_access = team.user_team_project_relationships.find_by_project_id(project.id).greatest_access
+
+ [team_access, member_access].min
+ end
+
+ def add_member_into_team(team, user, access, admin)
+ user = User.find(user) unless user.is_a? User
+
+ team.user_team_user_relationships.create(user_id: user.id, permission: access, group_admin: admin)
+ team.projects.each do |project|
+ update_team_user_access_in_project(team, user, project)
+ end
+ end
+
+ def remove_member_from_team(team, user)
+ user = User.find(user) unless user.is_a? User
+
+ team.user_team_user_relationships.with_user(user).destroy_all
+ other_teams = []
+ team.projects.each do |project|
+ other_teams << project.user_teams.with_member(user)
+ end
+ other_teams.uniq
+ unless other_teams.any?
+ UsersProject.in_projects(team.projects).with_user(user).destroy_all
+ end
+ end
+ end
+ end
+end