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, ¶ms) 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 }