diff --git a/phone_number.go b/phone_number.go new file mode 100644 index 00000000..fb5a8fdf --- /dev/null +++ b/phone_number.go @@ -0,0 +1,26 @@ +package clerk + +type PhoneNumber struct { + APIResource + + Object string `json:"object"` + ID string `json:"id"` + PhoneNumber string `json:"phone_number"` + ReservedForSecondFactor bool `json:"reserved_for_second_factor"` + DefaultSecondFactor bool `json:"default_second_factor"` + Reserved bool `json:"reserved"` + + Verification *struct { + Status string `json:"status"` + Strategy string `json:"strategy"` + Attempts int `json:"attempts"` + ExpireAt int `json:"expire_at"` + } `json:"verification"` + + LinkedTo []struct { + Type string `json:"type"` + ID string `json:"id"` + } `json:"linked_to"` + + BackupCodes []string `json:"backup_codes"` +} diff --git a/phonenumber/api.go b/phonenumber/api.go new file mode 100644 index 00000000..7754c470 --- /dev/null +++ b/phonenumber/api.go @@ -0,0 +1,36 @@ +// Code generated by "gen"; DO NOT EDIT. +// This file is meant to be re-generated in place and/or deleted at any time. +// Last generated at 2024-02-08 11:09:40.255100719 +0000 UTC +package phonenumber + +import ( + "context" + + "github.com/clerk/clerk-sdk-go/v2" +) + +// Create creates a new phone number. +func Create(ctx context.Context, params *CreateParams) (*clerk.PhoneNumber, error) { + return getClient().Create(ctx, params) +} + +// Get returns details about a phone number. +func Get(ctx context.Context, id string) (*clerk.PhoneNumber, error) { + return getClient().Get(ctx, id) +} + +// Update updates the phone number specified by id. +func Update(ctx context.Context, id string, params *UpdateParams) (*clerk.PhoneNumber, error) { + return getClient().Update(ctx, id, params) +} + +// Delete deletes a phone number. +func Delete(ctx context.Context, id string) (*clerk.DeletedResource, error) { + return getClient().Delete(ctx, id) +} + +func getClient() *Client { + return &Client{ + Backend: clerk.GetBackend(), + } +} diff --git a/phonenumber/client.go b/phonenumber/client.go new file mode 100644 index 00000000..6f7f97eb --- /dev/null +++ b/phonenumber/client.go @@ -0,0 +1,92 @@ +// Package phonenumber provides the Phone Numbers API. +// +// https://clerk.com/docs/reference/backend-api/tag/Phone-Numbers +package phonenumber + +import ( + "context" + "net/http" + + "github.com/clerk/clerk-sdk-go/v2" +) + +//go:generate go run ../cmd/gen/main.go + +const path = "/phone_numbers" + +// Client is used to invoke the Phone Numbers API. +type Client struct { + Backend clerk.Backend +} + +type ClientConfig struct { + clerk.BackendConfig +} + +func NewClient(config *ClientConfig) *Client { + return &Client{ + Backend: clerk.NewBackend(&config.BackendConfig), + } +} + +type CreateParams struct { + clerk.APIParams + + UserID *string `json:"user_id,omitempty"` + PhoneNumber *string `json:"phone_number,omitempty"` + Verified *bool `json:"verified,omitempty"` + Primary *bool `json:"primary,omitempty"` +} + +// Create creates a new phone number. +func (c *Client) Create(ctx context.Context, params *CreateParams) (*clerk.PhoneNumber, error) { + req := clerk.NewAPIRequest(http.MethodPost, path) + req.SetParams(params) + template := &clerk.PhoneNumber{} + err := c.Backend.Call(ctx, req, template) + return template, err +} + +// Get returns details about a phone number. +func (c *Client) Get(ctx context.Context, id string) (*clerk.PhoneNumber, error) { + path, err := clerk.JoinPath(path, id) + if err != nil { + return nil, err + } + req := clerk.NewAPIRequest(http.MethodGet, path) + template := &clerk.PhoneNumber{} + err = c.Backend.Call(ctx, req, template) + return template, err +} + +type UpdateParams struct { + clerk.APIParams + + Verified *bool `json:"verified,omitempty"` + Primary *bool `json:"primary,omitempty"` +} + +// Update updates the phone number specified by id. +func (c *Client) Update(ctx context.Context, id string, params *UpdateParams) (*clerk.PhoneNumber, error) { + path, err := clerk.JoinPath(path, id) + if err != nil { + return nil, err + } + req := clerk.NewAPIRequest(http.MethodPatch, path) + req.SetParams(params) + template := &clerk.PhoneNumber{} + err = c.Backend.Call(ctx, req, template) + return template, err +} + +// Delete deletes a phone number. +func (c *Client) Delete(ctx context.Context, id string) (*clerk.DeletedResource, error) { + path, err := clerk.JoinPath(path, id) + if err != nil { + return nil, err + } + req := clerk.NewAPIRequest(http.MethodDelete, path) + template := &clerk.DeletedResource{} + err = c.Backend.Call(ctx, req, template) + return template, err +} diff --git a/phonenumber/client_test.go b/phonenumber/client_test.go new file mode 100644 index 00000000..41214dfe --- /dev/null +++ b/phonenumber/client_test.go @@ -0,0 +1,48 @@ +package phonenumber + +import ( + "context" + "encoding/json" + "fmt" + "net/http" + "testing" + + "github.com/clerk/clerk-sdk-go/v2/clerktest" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestPhoneNumberClientCreate(t *testing.T) { + t.Parallel() + + id := "idn_123" + userID := "usr_123" + verified := true + phone := "+30210555555" + + config := &ClientConfig{} + config.HTTPClient = &http.Client{ + Transport: &clerktest.RoundTripper{ + T: t, + In: json.RawMessage(fmt.Sprintf(` +{"phone_number":"+30210555555", "user_id":"%s", "verified": true} + `, userID)), + Out: json.RawMessage(fmt.Sprintf(` +{"object": "phone_number", "id":"%s", "phone_number":"%s", "reserved": false, "verification": null}`, id, userID)), + Method: http.MethodPost, + Path: "/v1/phone_numbers", + }, + } + client := NewClient(config) + + phoneNumber, err := client.Create(context.Background(), &CreateParams{ + UserID: &userID, + PhoneNumber: &phone, + Verified: &verified, + }) + require.NoError(t, err) + assert.Equal(t, id, phoneNumber.ID) + assert.Equal(t, "phone_number", phoneNumber.Object) + assert.Equal(t, false, phoneNumber.Reserved) + assert.Nil(t, phoneNumber.Verification) +}