mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
chore!: allow CreateUser to accept multiple organizations (#14383)
* chore: allow CreateUser to accept multiple organizations In a multi-org deployment, it makes more sense to allow for multiple org memberships to be assigned at create. The legacy param will still be honored. * Handle sdk deprecation better by maintaining cli functions
This commit is contained in:
+63
-1
@@ -113,6 +113,11 @@ type CreateFirstUserResponse struct {
|
||||
OrganizationID uuid.UUID `json:"organization_id" format:"uuid"`
|
||||
}
|
||||
|
||||
// CreateUserRequest
|
||||
// Deprecated: Use CreateUserRequestWithOrgs instead. This will be removed.
|
||||
// TODO: When removing, we should rename CreateUserRequestWithOrgs -> CreateUserRequest
|
||||
// Then alias CreateUserRequestWithOrgs to CreateUserRequest.
|
||||
// @typescript-ignore CreateUserRequest
|
||||
type CreateUserRequest struct {
|
||||
Email string `json:"email" validate:"required,email" format:"email"`
|
||||
Username string `json:"username" validate:"required,username"`
|
||||
@@ -127,6 +132,45 @@ type CreateUserRequest struct {
|
||||
OrganizationID uuid.UUID `json:"organization_id" validate:"" format:"uuid"`
|
||||
}
|
||||
|
||||
type CreateUserRequestWithOrgs struct {
|
||||
Email string `json:"email" validate:"required,email" format:"email"`
|
||||
Username string `json:"username" validate:"required,username"`
|
||||
Name string `json:"name" validate:"user_real_name"`
|
||||
Password string `json:"password"`
|
||||
// UserLoginType defaults to LoginTypePassword.
|
||||
UserLoginType LoginType `json:"login_type"`
|
||||
// OrganizationIDs is a list of organization IDs that the user should be a member of.
|
||||
OrganizationIDs []uuid.UUID `json:"organization_ids" validate:"" format:"uuid"`
|
||||
}
|
||||
|
||||
// UnmarshalJSON implements the unmarshal for the legacy param "organization_id".
|
||||
// To accommodate multiple organizations, the field has been switched to a slice.
|
||||
// The previous field will just be appended to the slice.
|
||||
// Note in the previous behavior, omitting the field would result in the
|
||||
// default org being applied, but that is no longer the case.
|
||||
// TODO: Remove this method in it's entirety after some period of time.
|
||||
// This will be released in v1.16.0, and is associated with the multiple orgs
|
||||
// feature.
|
||||
func (r *CreateUserRequestWithOrgs) UnmarshalJSON(data []byte) error {
|
||||
// By using a type alias, we prevent an infinite recursion when unmarshalling.
|
||||
// This allows us to use the default unmarshal behavior of the original type.
|
||||
type AliasedReq CreateUserRequestWithOrgs
|
||||
type DeprecatedCreateUserRequest struct {
|
||||
AliasedReq
|
||||
OrganizationID *uuid.UUID `json:"organization_id" format:"uuid"`
|
||||
}
|
||||
var dep DeprecatedCreateUserRequest
|
||||
err := json.Unmarshal(data, &dep)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
*r = CreateUserRequestWithOrgs(dep.AliasedReq)
|
||||
if dep.OrganizationID != nil {
|
||||
r.OrganizationIDs = append(r.OrganizationIDs, *dep.OrganizationID)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type UpdateUserProfileRequest struct {
|
||||
Username string `json:"username" validate:"required,username"`
|
||||
Name string `json:"name" validate:"user_real_name"`
|
||||
@@ -288,8 +332,26 @@ func (c *Client) CreateFirstUser(ctx context.Context, req CreateFirstUserRequest
|
||||
return resp, json.NewDecoder(res.Body).Decode(&resp)
|
||||
}
|
||||
|
||||
// CreateUser creates a new user.
|
||||
// CreateUser
|
||||
// Deprecated: Use CreateUserWithOrgs instead. This will be removed.
|
||||
// TODO: When removing, we should rename CreateUserWithOrgs -> CreateUser
|
||||
// with an alias of CreateUserWithOrgs.
|
||||
func (c *Client) CreateUser(ctx context.Context, req CreateUserRequest) (User, error) {
|
||||
if req.DisableLogin {
|
||||
req.UserLoginType = LoginTypeNone
|
||||
}
|
||||
return c.CreateUserWithOrgs(ctx, CreateUserRequestWithOrgs{
|
||||
Email: req.Email,
|
||||
Username: req.Username,
|
||||
Name: req.Name,
|
||||
Password: req.Password,
|
||||
UserLoginType: req.UserLoginType,
|
||||
OrganizationIDs: []uuid.UUID{req.OrganizationID},
|
||||
})
|
||||
}
|
||||
|
||||
// CreateUserWithOrgs creates a new user.
|
||||
func (c *Client) CreateUserWithOrgs(ctx context.Context, req CreateUserRequestWithOrgs) (User, error) {
|
||||
res, err := c.Request(ctx, http.MethodPost, "/api/v2/users", req)
|
||||
if err != nil {
|
||||
return User{}, err
|
||||
|
||||
Reference in New Issue
Block a user