pkg/client/sonar/user.go (125 lines of code) (raw):

package sonar import ( "context" "fmt" "net/http" ) type User struct { Login string `json:"login"` Name string `json:"name"` Password string `json:"password"` Email string `json:"email,omitempty"` } type UserToken struct { Login string `json:"login"` Name string `json:"name,omitempty"` Token string `json:"token,omitempty"` } type userSearchResponse struct { Users []User `json:"users"` } type createUserResponse struct { User User `json:"user"` } type userTokenSearchResponse struct { UserTokens []UserToken `json:"usertokens"` } // SearchUsers searches for users by login, name, and email. // The parameter userQuery can either be case-sensitive and perform an exact match or case-insensitive and perform a partial match (contains), depending on the scenario: // - If the search query is less or equal to 15 characters, then the query is case-insensitive and will match any login, name, or email that contains the search query. // - If the search query is greater than 15 characters, then the query becomes case-sensitive and will match any login, name, or email that exactly matches the search query. func (sc *Client) SearchUsers(ctx context.Context, userQuery string) ([]User, error) { var userResponse userSearchResponse rsp, err := sc.startRequest(ctx).SetResult(&userResponse). SetQueryParams(map[string]string{ "q": userQuery, "ps": "500", }). Get("/users/search") if err = sc.checkError(rsp, err); err != nil { return nil, fmt.Errorf("failed to search for users: %w", err) } return userResponse.Users, nil } func (sc Client) GetUserByLogin(ctx context.Context, userLogin string) (*User, error) { users, err := sc.SearchUsers(ctx, userLogin) if err != nil { return nil, fmt.Errorf("failed to search for users: %w", err) } for _, u := range users { if u.Login == userLogin { return &u, nil } } return nil, NewHTTPError(http.StatusNotFound, fmt.Sprintf("user %s not found", userLogin)) } func (sc *Client) CreateUser(ctx context.Context, user *User) error { var createUserRsp createUserResponse rsp, err := sc.startRequest(ctx). SetResult(&createUserRsp). SetFormData(map[string]string{ "login": user.Login, "name": user.Name, "password": user.Password, }). Post("/users/create") if err = sc.checkError(rsp, err); err != nil { return fmt.Errorf("failed to create user user: %w", err) } return nil } // UpdateUser updates the user with the given login. func (sc *Client) UpdateUser(ctx context.Context, user *User) error { rsp, err := sc.startRequest(ctx). SetFormData(map[string]string{ "login": user.Login, "name": user.Name, "email": user.Email, }). Post("/users/update") if err = sc.checkError(rsp, err); err != nil { return fmt.Errorf("failed to update user: %w", err) } return nil } func (sc *Client) SearchUserTokens(ctx context.Context, userLogin string) ([]UserToken, error) { var userTokenResponse userTokenSearchResponse rsp, err := sc.startRequest(ctx).SetResult(&userTokenResponse). Get(fmt.Sprintf("/user_tokens/search?login=%s", userLogin)) if err = sc.checkError(rsp, err); err != nil { return nil, fmt.Errorf("failed to search for user tokens: %w", err) } return userTokenResponse.UserTokens, nil } func (sc Client) GetUserToken(ctx context.Context, userLogin, tokenName string) (*UserToken, error) { userTokens, err := sc.SearchUserTokens(ctx, userLogin) if err != nil { return nil, fmt.Errorf("failed to search for user tokens: %w", err) } for _, ut := range userTokens { if ut.Name == tokenName { return &ut, nil } } return nil, NewHTTPError(http.StatusNotFound, "user token not found") } // GetUserGroups returns all groups that the user is a member of. func (sc *Client) GetUserGroups(ctx context.Context, userLogin string) ([]Group, error) { groups := &groupSearchResponse{} rsp, err := sc.startRequest(ctx). SetResult(groups). SetQueryParams(map[string]string{ "login": userLogin, "ps": "500", }). Get("/users/groups") if err = sc.checkError(rsp, err); err != nil { return nil, fmt.Errorf("failed to get user groups: %w", err) } return groups.Groups, nil } func (sc *Client) DeactivateUser(ctx context.Context, userLogin string) error { rsp, err := sc.startRequest(ctx). SetFormData(map[string]string{ "login": userLogin, }). Post("/users/deactivate") if err = sc.checkError(rsp, err); err != nil { return fmt.Errorf("failed to deactivate user: %w", err) } return nil }