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
|