diff options
author | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2013-05-27 15:05:01 +0300 |
---|---|---|
committer | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2013-05-27 15:05:01 +0300 |
commit | c3ba0ee64b00a57490dbc9a745e2c422268a9117 (patch) | |
tree | 0f18600e1a47554f7f1c5590f5604cbc7fb0ccda /lib | |
parent | 69d70400cc8ee3ea02e5c66b92b5965dcbe6fa76 (diff) | |
parent | 0ebfa5e5a2f93cb57e00159aa20ec8bf52dba67e (diff) | |
download | gitlab-ce-c3ba0ee64b00a57490dbc9a745e2c422268a9117.tar.gz |
Merge branch 'feature_teams_api' of https://github.com/former03/gitlabhq into former03-feature_teams_api
Conflicts:
doc/api/README.md
Diffstat (limited to 'lib')
-rw-r--r-- | lib/api/api.rb | 1 | ||||
-rw-r--r-- | lib/api/entities.rb | 16 | ||||
-rw-r--r-- | lib/api/user_teams.rb | 276 |
3 files changed, 293 insertions, 0 deletions
diff --git a/lib/api/api.rb b/lib/api/api.rb index c2752406122..9571d49d9d5 100644 --- a/lib/api/api.rb +++ b/lib/api/api.rb @@ -35,5 +35,6 @@ module API mount Notes mount Internal mount SystemHooks + mount UserTeams end end diff --git a/lib/api/entities.rb b/lib/api/entities.rb index c3c351e1733..7b35f5f529f 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -40,6 +40,18 @@ module API end end + class TeamMember < UserBasic + expose :permission, as: :access_level do |user, options| + options[:user_team].user_team_user_relationships.find_by_user_id(user.id).permission + end + end + + class TeamProject < Project + expose :greatest_access, as: :greatest_access_level do |project, options| + options[:user_team].user_team_project_relationships.find_by_project_id(project.id).greatest_access + end + end + class Group < Grape::Entity expose :id, :name, :path, :owner_id end @@ -87,6 +99,10 @@ module API expose :id, :title, :key, :created_at end + class UserTeam < Grape::Entity + expose :id, :name, :path, :owner_id + end + class MergeRequest < Grape::Entity expose :id, :target_branch, :source_branch, :project_id, :title, :state expose :author, :assignee, using: Entities::UserBasic diff --git a/lib/api/user_teams.rb b/lib/api/user_teams.rb new file mode 100644 index 00000000000..05aa72f0e92 --- /dev/null +++ b/lib/api/user_teams.rb @@ -0,0 +1,276 @@ +module API + # user_teams API + class UserTeams < Grape::API + before { authenticate! } + + resource :user_teams do + helpers do + def handle_team_member_errors(errors) + if errors[:permission].any? + render_api_error!(errors[:permission], 422) + end + not_found! + end + + def validate_access_level?(level) + [UsersProject::GUEST, UsersProject::REPORTER, UsersProject::DEVELOPER, UsersProject::MASTER].include? level.to_i + end + end + + + # Get a user_teams list + # + # Example Request: + # GET /user_teams + get do + if current_user.admin + @user_teams = paginate UserTeam + else + @user_teams = paginate current_user.user_teams + end + present @user_teams, with: Entities::UserTeam + end + + + # Create user_team. Available only for admin + # + # Parameters: + # name (required) - The name of the user_team + # path (required) - The path of the user_team + # Example Request: + # POST /user_teams + post do + authenticated_as_admin! + required_attributes! [:name, :path] + + attrs = attributes_for_keys [:name, :path] + @user_team = UserTeam.new(attrs) + @user_team.owner = current_user + + if @user_team.save + present @user_team, with: Entities::UserTeam + else + not_found! + end + end + + + # Get a single user_team + # + # Parameters: + # id (required) - The ID of a user_team + # Example Request: + # GET /user_teams/:id + get ":id" do + @user_team = UserTeam.find(params[:id]) + if current_user.admin or current_user.user_teams.include? @user_team + present @user_team, with: Entities::UserTeam + else + not_found! + end + end + + + # Get user_team members + # + # Parameters: + # id (required) - The ID of a user_team + # Example Request: + # GET /user_teams/:id/members + get ":id/members" do + @user_team = UserTeam.find(params[:id]) + if current_user.admin or current_user.user_teams.include? @user_team + @members = paginate @user_team.members + present @members, with: Entities::TeamMember, user_team: @user_team + else + not_found! + end + end + + + # Add a new user_team member + # + # Parameters: + # id (required) - The ID of a user_team + # user_id (required) - The ID of a user + # access_level (required) - Project access level + # Example Request: + # POST /user_teams/:id/members + post ":id/members" do + authenticated_as_admin! + required_attributes! [:user_id, :access_level] + + if not validate_access_level?(params[:access_level]) + render_api_error!("Wrong access level", 422) + end + + @user_team = UserTeam.find(params[:id]) + if @user_team + team_member = @user_team.user_team_user_relationships.find_by_user_id(params[:user_id]) + # Not existing member + if team_member.nil? + @user_team.add_member(params[:user_id], params[:access_level], false) + team_member = @user_team.user_team_user_relationships.find_by_user_id(params[:user_id]) + + if team_member.nil? + render_api_error!("Error creating membership", 500) + else + @member = team_member.user + present @member, with: Entities::TeamMember, user_team: @user_team + end + else + render_api_error!("Already exists", 409) + end + else + not_found! + end + end + + + # Get a single team member from user_team + # + # Parameters: + # id (required) - The ID of a user_team + # user_id (required) - The ID of a team member + # Example Request: + # GET /user_teams/:id/members/:user_id + get ":id/members/:user_id" do + @user_team = UserTeam.find(params[:id]) + if current_user.admin or current_user.user_teams.include? @user_team + team_member = @user_team.user_team_user_relationships.find_by_user_id(params[:user_id]) + unless team_member.nil? + present team_member.user, with: Entities::TeamMember, user_team: @user_team + else + not_found! + end + else + not_found! + end + end + + # Remove a team member from user_team + # + # Parameters: + # id (required) - The ID of a user_team + # user_id (required) - The ID of a team member + # Example Request: + # DELETE /user_teams/:id/members/:user_id + delete ":id/members/:user_id" do + authenticated_as_admin! + + @user_team = UserTeam.find(params[:id]) + if @user_team + team_member = @user_team.user_team_user_relationships.find_by_user_id(params[:user_id]) + unless team_member.nil? + team_member.destroy + else + not_found! + end + else + not_found! + end + end + + + # Get to user_team assigned projects + # + # Parameters: + # id (required) - The ID of a user_team + # Example Request: + # GET /user_teams/:id/projects + get ":id/projects" do + @user_team = UserTeam.find(params[:id]) + if current_user.admin or current_user.user_teams.include? @user_team + @projects = paginate @user_team.projects + present @projects, with: Entities::TeamProject, user_team: @user_team + else + not_found! + end + end + + + # Add a new user_team project + # + # Parameters: + # id (required) - The ID of a user_team + # project_id (required) - The ID of a project + # greatest_access_level (required) - Project access level + # Example Request: + # POST /user_teams/:id/projects + post ":id/projects" do + authenticated_as_admin! + required_attributes! [:project_id, :greatest_access_level] + + if not validate_access_level?(params[:greatest_access_level]) + render_api_error!("Wrong greatest_access_level", 422) + end + + @user_team = UserTeam.find(params[:id]) + if @user_team + team_project = @user_team.user_team_project_relationships.find_by_project_id(params[:project_id]) + + # No existing project + if team_project.nil? + @user_team.assign_to_projects([params[:project_id]], params[:greatest_access_level]) + team_project = @user_team.user_team_project_relationships.find_by_project_id(params[:project_id]) + if team_project.nil? + render_api_error!("Error creating project assignment", 500) + else + @project = team_project.project + present @project, with: Entities::TeamProject, user_team: @user_team + end + else + render_api_error!("Already exists", 409) + end + else + not_found! + end + end + + # Show a single team project from user_team + # + # Parameters: + # id (required) - The ID of a user_team + # project_id (required) - The ID of a project assigned to the team + # Example Request: + # GET /user_teams/:id/projects/:project_id + get ":id/projects/:project_id" do + @user_team = UserTeam.find(params[:id]) + if current_user.admin or current_user.user_teams.include? @user_team + team_project = @user_team.user_team_project_relationships.find_by_project_id(params[:project_id]) + unless team_project.nil? + present team_project.project, with: Entities::TeamProject, user_team: @user_team + else + not_found! + end + else + not_found! + end + end + + # Remove a team project from user_team + # + # Parameters: + # id (required) - The ID of a user_team + # project_id (required) - The ID of a project assigned to the team + # Example Request: + # DELETE /user_teams/:id/projects/:project_id + delete ":id/projects/:project_id" do + authenticated_as_admin! + + @user_team = UserTeam.find(params[:id]) + if @user_team + team_project = @user_team.user_team_project_relationships.find_by_project_id(params[:project_id]) + unless team_project.nil? + team_project.destroy + else + not_found! + end + else + not_found! + end + end + + end + end +end |