277 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			277 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
| 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
 |