github.com/clerkinc/clerk-sdk-go@v1.49.1/clerk/users.go (about)

     1  package clerk
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"net/http"
     7  	"strconv"
     8  )
     9  
    10  type UsersService service
    11  
    12  type User struct {
    13  	ID                            string         `json:"id"`
    14  	Object                        string         `json:"object"`
    15  	Username                      *string        `json:"username"`
    16  	FirstName                     *string        `json:"first_name"`
    17  	LastName                      *string        `json:"last_name"`
    18  	Gender                        *string        `json:"gender"`
    19  	Birthday                      *string        `json:"birthday"`
    20  	ProfileImageURL               string         `json:"profile_image_url"`
    21  	ImageURL                      *string        `json:"image_url,omitempty"`
    22  	HasImage                      bool           `json:"has_image"`
    23  	PrimaryEmailAddressID         *string        `json:"primary_email_address_id"`
    24  	PrimaryPhoneNumberID          *string        `json:"primary_phone_number_id"`
    25  	PrimaryWeb3WalletID           *string        `json:"primary_web3_wallet_id"`
    26  	PasswordEnabled               bool           `json:"password_enabled"`
    27  	TwoFactorEnabled              bool           `json:"two_factor_enabled"`
    28  	TOTPEnabled                   bool           `json:"totp_enabled"`
    29  	BackupCodeEnabled             bool           `json:"backup_code_enabled"`
    30  	EmailAddresses                []EmailAddress `json:"email_addresses"`
    31  	PhoneNumbers                  []PhoneNumber  `json:"phone_numbers"`
    32  	Web3Wallets                   []Web3Wallet   `json:"web3_wallets"`
    33  	ExternalAccounts              []interface{}  `json:"external_accounts"`
    34  	SAMLAccounts                  []*SAMLAccount `json:"saml_accounts"`
    35  	PublicMetadata                interface{}    `json:"public_metadata"`
    36  	PrivateMetadata               interface{}    `json:"private_metadata"`
    37  	UnsafeMetadata                interface{}    `json:"unsafe_metadata"`
    38  	LastSignInAt                  *int64         `json:"last_sign_in_at"`
    39  	Banned                        bool           `json:"banned"`
    40  	Locked                        bool           `json:"locked"`
    41  	LockoutExpiresInSeconds       *int64         `json:"lockout_expires_in_seconds"`
    42  	VerificationAttemptsRemaining *int64         `json:"verification_attempts_remaining"`
    43  	ExternalID                    *string        `json:"external_id"`
    44  	CreatedAt                     int64          `json:"created_at"`
    45  	UpdatedAt                     int64          `json:"updated_at"`
    46  	LastActiveAt                  *int64         `json:"last_active_at"`
    47  }
    48  
    49  type UserOAuthAccessToken struct {
    50  	ExternalAccountID string          `json:"external_account_id"`
    51  	Object            string          `json:"object"`
    52  	Token             string          `json:"token"`
    53  	Provider          string          `json:"provider"`
    54  	PublicMetadata    json.RawMessage `json:"public_metadata"`
    55  	Label             *string         `json:"label"`
    56  	Scopes            []string        `json:"scopes"`
    57  	TokenSecret       *string         `json:"token_secret"`
    58  }
    59  
    60  type IdentificationLink struct {
    61  	IdentType string `json:"type"`
    62  	IdentID   string `json:"id"`
    63  }
    64  
    65  type SAMLAccount struct {
    66  	Object         string          `json:"object"`
    67  	ID             string          `json:"id"`
    68  	Provider       string          `json:"provider"`
    69  	Active         bool            `json:"active"`
    70  	EmailAddress   string          `json:"email_address"`
    71  	FirstName      *string         `json:"first_name"`
    72  	LastName       *string         `json:"last_name"`
    73  	ProviderUserID *string         `json:"provider_user_id"`
    74  	PublicMetadata json.RawMessage `json:"public_metadata"`
    75  	Verification   *Verification   `json:"verification"`
    76  }
    77  
    78  type CreateUserParams struct {
    79  	EmailAddresses          []string         `json:"email_address,omitempty"`
    80  	PhoneNumbers            []string         `json:"phone_number,omitempty"`
    81  	Web3Wallets             []string         `json:"web3_wallet,omitempty"`
    82  	Username                *string          `json:"username,omitempty"`
    83  	Password                *string          `json:"password,omitempty"`
    84  	FirstName               *string          `json:"first_name,omitempty"`
    85  	LastName                *string          `json:"last_name,omitempty"`
    86  	ExternalID              *string          `json:"external_id,omitempty"`
    87  	UnsafeMetadata          *json.RawMessage `json:"unsafe_metadata,omitempty"`
    88  	PublicMetadata          *json.RawMessage `json:"public_metadata,omitempty"`
    89  	PrivateMetadata         *json.RawMessage `json:"private_metadata,omitempty"`
    90  	PasswordDigest          *string          `json:"password_digest,omitempty"`
    91  	PasswordHasher          *string          `json:"password_hasher,omitempty"`
    92  	SkipPasswordRequirement *bool            `json:"skip_password_requirement,omitempty"`
    93  	SkipPasswordChecks      *bool            `json:"skip_password_checks,omitempty"`
    94  	TOTPSecret              *string          `json:"totp_secret,omitempty"`
    95  	BackupCodes             []string         `json:"backup_codes,omitempty"`
    96  	// Specified in RFC3339 format
    97  	CreatedAt *string `json:"created_at,omitempty"`
    98  }
    99  
   100  func (s *UsersService) Create(params CreateUserParams) (*User, error) {
   101  	req, _ := s.client.NewRequest("POST", UsersUrl, &params)
   102  	var user User
   103  	_, err := s.client.Do(req, &user)
   104  	if err != nil {
   105  		return nil, err
   106  	}
   107  	return &user, nil
   108  }
   109  
   110  type ListAllUsersParams struct {
   111  	Limit             *int
   112  	Offset            *int
   113  	EmailAddresses    []string
   114  	ExternalIDs       []string
   115  	PhoneNumbers      []string
   116  	Web3Wallets       []string
   117  	Usernames         []string
   118  	UserIDs           []string
   119  	Query             *string
   120  	LastActiveAtSince *int64
   121  	OrderBy           *string
   122  }
   123  
   124  func (s *UsersService) ListAll(params ListAllUsersParams) ([]User, error) {
   125  	req, _ := s.client.NewRequest("GET", UsersUrl)
   126  
   127  	s.addUserSearchParamsToRequest(req, params)
   128  
   129  	paginationParams := PaginationParams{Limit: params.Limit, Offset: params.Offset}
   130  	query := req.URL.Query()
   131  	addPaginationParams(query, paginationParams)
   132  	if params.OrderBy != nil {
   133  		query.Add("order_by", *params.OrderBy)
   134  	}
   135  	req.URL.RawQuery = query.Encode()
   136  
   137  	var users []User
   138  	_, err := s.client.Do(req, &users)
   139  	if err != nil {
   140  		return nil, err
   141  	}
   142  	return users, nil
   143  }
   144  
   145  type UserCount struct {
   146  	Object     string `json:"object"`
   147  	TotalCount int    `json:"total_count"`
   148  }
   149  
   150  func (s *UsersService) Count(params ListAllUsersParams) (*UserCount, error) {
   151  	req, _ := s.client.NewRequest("GET", UsersCountUrl)
   152  
   153  	s.addUserSearchParamsToRequest(req, params)
   154  
   155  	var userCount UserCount
   156  	_, err := s.client.Do(req, &userCount)
   157  	if err != nil {
   158  		return nil, err
   159  	}
   160  	return &userCount, nil
   161  }
   162  
   163  func (s *UsersService) addUserSearchParamsToRequest(r *http.Request, params ListAllUsersParams) {
   164  	query := r.URL.Query()
   165  	if params.EmailAddresses != nil {
   166  		for _, email := range params.EmailAddresses {
   167  			query.Add("email_address", email)
   168  		}
   169  	}
   170  	if params.PhoneNumbers != nil {
   171  		for _, phone := range params.PhoneNumbers {
   172  			query.Add("phone_number", phone)
   173  		}
   174  	}
   175  	if params.ExternalIDs != nil {
   176  		for _, externalID := range params.ExternalIDs {
   177  			query.Add("external_id", externalID)
   178  		}
   179  	}
   180  	if params.Web3Wallets != nil {
   181  		for _, web3Wallet := range params.Web3Wallets {
   182  			query.Add("web3_wallet", web3Wallet)
   183  		}
   184  	}
   185  	if params.Usernames != nil {
   186  		for _, username := range params.Usernames {
   187  			query.Add("username", username)
   188  		}
   189  	}
   190  	if params.UserIDs != nil {
   191  		for _, userID := range params.UserIDs {
   192  			query.Add("user_id", userID)
   193  		}
   194  	}
   195  	if params.Query != nil {
   196  		query.Add("query", *params.Query)
   197  	}
   198  	if params.LastActiveAtSince != nil {
   199  		query.Add("last_active_at_since", strconv.Itoa(int(*params.LastActiveAtSince)))
   200  	}
   201  	r.URL.RawQuery = query.Encode()
   202  }
   203  
   204  func (s *UsersService) Read(userId string) (*User, error) {
   205  	userUrl := fmt.Sprintf("%s/%s", UsersUrl, userId)
   206  	req, _ := s.client.NewRequest("GET", userUrl)
   207  
   208  	var user User
   209  	_, err := s.client.Do(req, &user)
   210  	if err != nil {
   211  		return nil, err
   212  	}
   213  	return &user, nil
   214  }
   215  
   216  func (s *UsersService) Delete(userId string) (*DeleteResponse, error) {
   217  	userUrl := fmt.Sprintf("%s/%s", UsersUrl, userId)
   218  	req, _ := s.client.NewRequest("DELETE", userUrl)
   219  
   220  	var delResponse DeleteResponse
   221  	if _, err := s.client.Do(req, &delResponse); err != nil {
   222  		return nil, err
   223  	}
   224  	return &delResponse, nil
   225  }
   226  
   227  type UpdateUser struct {
   228  	FirstName              *string     `json:"first_name,omitempty"`
   229  	LastName               *string     `json:"last_name,omitempty"`
   230  	PrimaryEmailAddressID  *string     `json:"primary_email_address_id,omitempty"`
   231  	PrimaryPhoneNumberID   *string     `json:"primary_phone_number_id,omitempty"`
   232  	PrimaryWeb3WalletID    *string     `json:"primary_web3_wallet_id,omitempty"`
   233  	Username               *string     `json:"username,omitempty"`
   234  	ProfileImageID         *string     `json:"profile_image_id,omitempty"`
   235  	ProfileImage           *string     `json:"profile_image,omitempty"`
   236  	Password               *string     `json:"password,omitempty"`
   237  	SkipPasswordChecks     *bool       `json:"skip_password_checks,omitempty"`
   238  	SignOutOfOtherSessions *bool       `json:"sign_out_of_other_sessions,omitempty"`
   239  	ExternalID             *string     `json:"external_id,omitempty"`
   240  	PublicMetadata         interface{} `json:"public_metadata,omitempty"`
   241  	PrivateMetadata        interface{} `json:"private_metadata,omitempty"`
   242  	UnsafeMetadata         interface{} `json:"unsafe_metadata,omitempty"`
   243  	TOTPSecret             *string     `json:"totp_secret,omitempty"`
   244  	BackupCodes            []string    `json:"backup_codes,omitempty"`
   245  	// Specified in RFC3339 format
   246  	CreatedAt *string `json:"created_at,omitempty"`
   247  }
   248  
   249  func (s *UsersService) Update(userId string, updateRequest *UpdateUser) (*User, error) {
   250  	userUrl := fmt.Sprintf("%s/%s", UsersUrl, userId)
   251  	req, _ := s.client.NewRequest("PATCH", userUrl, updateRequest)
   252  
   253  	var updatedUser User
   254  	_, err := s.client.Do(req, &updatedUser)
   255  	if err != nil {
   256  		return nil, err
   257  	}
   258  	return &updatedUser, nil
   259  }
   260  
   261  type UpdateUserMetadata struct {
   262  	PublicMetadata  json.RawMessage `json:"public_metadata"`
   263  	PrivateMetadata json.RawMessage `json:"private_metadata"`
   264  	UnsafeMetadata  json.RawMessage `json:"unsafe_metadata"`
   265  }
   266  
   267  func (s *UsersService) UpdateMetadata(userId string, updateMetadataRequest *UpdateUserMetadata) (*User, error) {
   268  	updateUserMetadataURL := fmt.Sprintf("%s/%s/metadata", UsersUrl, userId)
   269  	req, _ := s.client.NewRequest(http.MethodPatch, updateUserMetadataURL, updateMetadataRequest)
   270  
   271  	var updatedUser User
   272  	_, err := s.client.Do(req, &updatedUser)
   273  	if err != nil {
   274  		return nil, err
   275  	}
   276  	return &updatedUser, nil
   277  }
   278  
   279  func (s *UsersService) ListOAuthAccessTokens(userID, provider string) ([]*UserOAuthAccessToken, error) {
   280  	url := fmt.Sprintf("%s/%s/oauth_access_tokens/%s", UsersUrl, userID, provider)
   281  	req, _ := s.client.NewRequest(http.MethodGet, url)
   282  
   283  	response := make([]*UserOAuthAccessToken, 0)
   284  	_, err := s.client.Do(req, &response)
   285  	if err != nil {
   286  		return nil, err
   287  	}
   288  	return response, nil
   289  }
   290  
   291  type UserDisableMFAResponse struct {
   292  	UserID string `json:"user_id"`
   293  }
   294  
   295  func (s *UsersService) DisableMFA(userID string) (*UserDisableMFAResponse, error) {
   296  	url := fmt.Sprintf("%s/%s/mfa", UsersUrl, userID)
   297  	req, _ := s.client.NewRequest(http.MethodDelete, url)
   298  
   299  	var response UserDisableMFAResponse
   300  	if _, err := s.client.Do(req, &response); err != nil {
   301  		return nil, err
   302  	}
   303  
   304  	return &response, nil
   305  }
   306  
   307  func (s *UsersService) Ban(userID string) (*User, error) {
   308  	url := fmt.Sprintf("%s/%s/ban", UsersUrl, userID)
   309  	req, _ := s.client.NewRequest(http.MethodPost, url)
   310  
   311  	var response User
   312  	if _, err := s.client.Do(req, &response); err != nil {
   313  		return nil, err
   314  	}
   315  
   316  	return &response, nil
   317  }
   318  
   319  func (s *UsersService) Unban(userID string) (*User, error) {
   320  	url := fmt.Sprintf("%s/%s/unban", UsersUrl, userID)
   321  	req, _ := s.client.NewRequest(http.MethodPost, url)
   322  
   323  	var response User
   324  	if _, err := s.client.Do(req, &response); err != nil {
   325  		return nil, err
   326  	}
   327  
   328  	return &response, nil
   329  }
   330  
   331  func (s *UsersService) Lock(userID string) (*User, error) {
   332  	url := fmt.Sprintf("%s/%s/lock", UsersUrl, userID)
   333  	req, _ := s.client.NewRequest(http.MethodPost, url)
   334  
   335  	var response User
   336  	if _, err := s.client.Do(req, &response); err != nil {
   337  		return nil, err
   338  	}
   339  
   340  	return &response, nil
   341  }
   342  
   343  func (s *UsersService) Unlock(userID string) (*User, error) {
   344  	url := fmt.Sprintf("%s/%s/unlock", UsersUrl, userID)
   345  	req, _ := s.client.NewRequest(http.MethodPost, url)
   346  
   347  	var response User
   348  	if _, err := s.client.Do(req, &response); err != nil {
   349  		return nil, err
   350  	}
   351  
   352  	return &response, nil
   353  }
   354  
   355  type ListMembershipsParams struct {
   356  	Limit  *int
   357  	Offset *int
   358  	UserID string
   359  }
   360  
   361  func (s *UsersService) ListMemberships(params ListMembershipsParams) (*ListOrganizationMembershipsResponse, error) {
   362  	req, _ := s.client.NewRequest(http.MethodGet, fmt.Sprintf("%s/%s/organization_memberships", UsersUrl, params.UserID))
   363  
   364  	paginationParams := PaginationParams{Limit: params.Limit, Offset: params.Offset}
   365  	query := req.URL.Query()
   366  	addPaginationParams(query, paginationParams)
   367  	req.URL.RawQuery = query.Encode()
   368  
   369  	var response ListOrganizationMembershipsResponse
   370  	if _, err := s.client.Do(req, &response); err != nil {
   371  		return nil, err
   372  	}
   373  
   374  	return &response, nil
   375  }