github.com/rakutentech/cli@v6.12.5-0.20151006231303-24468b65536e+incompatible/cf/commands/user/set_space_role.go (about)

     1  package user
     2  
     3  import (
     4  	"errors"
     5  
     6  	. "github.com/cloudfoundry/cli/cf/i18n"
     7  	"github.com/cloudfoundry/cli/flags"
     8  
     9  	"github.com/cloudfoundry/cli/cf/api"
    10  	"github.com/cloudfoundry/cli/cf/api/spaces"
    11  	"github.com/cloudfoundry/cli/cf/command_registry"
    12  	"github.com/cloudfoundry/cli/cf/configuration/core_config"
    13  	"github.com/cloudfoundry/cli/cf/models"
    14  	"github.com/cloudfoundry/cli/cf/requirements"
    15  	"github.com/cloudfoundry/cli/cf/terminal"
    16  )
    17  
    18  type SpaceRoleSetter interface {
    19  	command_registry.Command
    20  	SetSpaceRole(space models.Space, role, userGuid, userName string) (err error)
    21  }
    22  
    23  type SetSpaceRole struct {
    24  	ui        terminal.UI
    25  	config    core_config.Reader
    26  	spaceRepo spaces.SpaceRepository
    27  	userRepo  api.UserRepository
    28  	userReq   requirements.UserRequirement
    29  	orgReq    requirements.OrganizationRequirement
    30  }
    31  
    32  func init() {
    33  	command_registry.Register(&SetSpaceRole{})
    34  }
    35  
    36  func (cmd *SetSpaceRole) MetaData() command_registry.CommandMetadata {
    37  	return command_registry.CommandMetadata{
    38  		Name:        "set-space-role",
    39  		Description: T("Assign a space role to a user"),
    40  		Usage: T("CF_NAME set-space-role USERNAME ORG SPACE ROLE\n\n") +
    41  			T("ROLES:\n") +
    42  			T("   SpaceManager - Invite and manage users, and enable features for a given space\n") +
    43  			T("   SpaceDeveloper - Create and manage apps and services, and see logs and reports\n") +
    44  			T("   SpaceAuditor - View logs, reports, and settings on this space\n"),
    45  	}
    46  }
    47  
    48  func (cmd *SetSpaceRole) Requirements(requirementsFactory requirements.Factory, fc flags.FlagContext) (reqs []requirements.Requirement, err error) {
    49  	if len(fc.Args()) != 4 {
    50  		cmd.ui.Failed(T("Incorrect Usage. Requires USERNAME, ORG, SPACE, ROLE as arguments\n\n") + command_registry.Commands.CommandUsage("set-space-role"))
    51  	}
    52  
    53  	cmd.userReq = requirementsFactory.NewUserRequirement(fc.Args()[0])
    54  	cmd.orgReq = requirementsFactory.NewOrganizationRequirement(fc.Args()[1])
    55  
    56  	reqs = []requirements.Requirement{
    57  		requirementsFactory.NewLoginRequirement(),
    58  		cmd.userReq,
    59  		cmd.orgReq,
    60  	}
    61  	return
    62  }
    63  
    64  func (cmd *SetSpaceRole) SetDependency(deps command_registry.Dependency, pluginCall bool) command_registry.Command {
    65  	cmd.ui = deps.Ui
    66  	cmd.config = deps.Config
    67  	cmd.spaceRepo = deps.RepoLocator.GetSpaceRepository()
    68  	cmd.userRepo = deps.RepoLocator.GetUserRepository()
    69  	return cmd
    70  }
    71  
    72  func (cmd *SetSpaceRole) Execute(c flags.FlagContext) {
    73  	spaceName := c.Args()[2]
    74  	role := models.UserInputToSpaceRole[c.Args()[3]]
    75  	user := cmd.userReq.GetUser()
    76  	org := cmd.orgReq.GetOrganization()
    77  
    78  	space, apiErr := cmd.spaceRepo.FindByNameInOrg(spaceName, org.Guid)
    79  	if apiErr != nil {
    80  		cmd.ui.Failed(apiErr.Error())
    81  		return
    82  	}
    83  
    84  	err := cmd.SetSpaceRole(space, role, user.Guid, user.Username)
    85  	if err != nil {
    86  		cmd.ui.Failed(err.Error())
    87  		return
    88  	}
    89  }
    90  
    91  func (cmd *SetSpaceRole) SetSpaceRole(space models.Space, role, userGuid, userName string) (err error) {
    92  	cmd.ui.Say(T("Assigning role {{.Role}} to user {{.TargetUser}} in org {{.TargetOrg}} / space {{.TargetSpace}} as {{.CurrentUser}}...",
    93  		map[string]interface{}{
    94  			"Role":        terminal.EntityNameColor(role),
    95  			"TargetUser":  terminal.EntityNameColor(userName),
    96  			"TargetOrg":   terminal.EntityNameColor(space.Organization.Name),
    97  			"TargetSpace": terminal.EntityNameColor(space.Name),
    98  			"CurrentUser": terminal.EntityNameColor(cmd.config.Username()),
    99  		}))
   100  
   101  	apiErr := cmd.userRepo.SetSpaceRole(userGuid, space.Guid, space.Organization.Guid, role)
   102  	if apiErr != nil {
   103  		err = errors.New(apiErr.Error())
   104  		return
   105  	}
   106  
   107  	cmd.ui.Ok()
   108  	return
   109  }