From 0c0f8b89941471e484e38acc041cc67d0041e33a Mon Sep 17 00:00:00 2001 From: Nishad Musthafa Date: Sun, 12 Oct 2025 22:54:54 +0530 Subject: [PATCH 1/4] Adding the phone number apis --- cmd/lk/main.go | 1 + cmd/lk/phone_number.go | 443 +++++++++++++++++++++++++++++++++++++++++ go.mod | 4 +- go.sum | 8 +- 4 files changed, 450 insertions(+), 6 deletions(-) create mode 100644 cmd/lk/phone_number.go diff --git a/cmd/lk/main.go b/cmd/lk/main.go index 3e300fca..faf899ec 100644 --- a/cmd/lk/main.go +++ b/cmd/lk/main.go @@ -68,6 +68,7 @@ func main() { app.Commands = append(app.Commands, EgressCommands...) app.Commands = append(app.Commands, IngressCommands...) app.Commands = append(app.Commands, SIPCommands...) + app.Commands = append(app.Commands, PhoneNumberCommands...) app.Commands = append(app.Commands, ReplayCommands...) app.Commands = append(app.Commands, PerfCommands...) diff --git a/cmd/lk/phone_number.go b/cmd/lk/phone_number.go new file mode 100644 index 00000000..6941b9ba --- /dev/null +++ b/cmd/lk/phone_number.go @@ -0,0 +1,443 @@ +// Copyright 2024 LiveKit, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "context" + "fmt" + "strings" + + "github.com/livekit/livekit-cli/v2/pkg/util" + "github.com/livekit/protocol/livekit" + lksdk "github.com/livekit/server-sdk-go/v2" + "github.com/urfave/cli/v3" +) + +var ( + PhoneNumberCommands = []*cli.Command{ + { + Name: "phonenumber", + Usage: "Manage phone numbers", + Hidden: true, + Commands: []*cli.Command{ + { + Name: "search", + Usage: "Search available phone numbers in inventory", + Action: searchPhoneNumbers, + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "country-code", + Usage: "Filter by country code (e.g., \"US\", \"CA\")", + }, + &cli.StringFlag{ + Name: "area-code", + Usage: "Filter by area code (e.g., \"415\")", + }, + &cli.IntFlag{ + Name: "limit", + Usage: "Maximum number of results (default: 50)", + Value: 50, + }, + &cli.StringFlag{ + Name: "page-token", + Usage: "Token for pagination (empty for first page)", + }, + jsonFlag, + }, + }, + { + Name: "purchase", + Usage: "Purchase phone numbers from inventory", + Action: purchasePhoneNumbers, + Flags: []cli.Flag{ + &cli.StringSliceFlag{ + Name: "phonenumbers", + Usage: "Phone numbers to purchase (e.g., \"+1234567890\", \"+1234567891\")", + Required: true, + }, + &cli.StringFlag{ + Name: "sip-dispatch-rule-id", + Usage: "SIP dispatch rule ID to apply to all purchased numbers", + }, + }, + }, + { + Name: "list", + Usage: "List phone numbers for a project", + Action: listPhoneNumbers, + Flags: []cli.Flag{ + &cli.IntFlag{ + Name: "limit", + Usage: "Maximum number of results (default: 50)", + Value: 50, + }, + &cli.StringFlag{ + Name: "status", + Usage: "Filter by status (active, pending, released)", + }, + &cli.StringFlag{ + Name: "page-token", + Usage: "Token for pagination (empty for first page)", + }, + &cli.StringFlag{ + Name: "sip-dispatch-rule-id", + Usage: "Filter by SIP dispatch rule ID", + }, + jsonFlag, + }, + }, + { + Name: "get", + Usage: "Get a phone number from a project", + Action: getPhoneNumber, + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "id", + Usage: "Use phone number ID for direct lookup", + }, + &cli.StringFlag{ + Name: "phonenumber", + Usage: "Use phone number string for lookup", + }, + }, + ArgsUsage: "Either --id or --phonenumber must be provided", + }, + { + Name: "update", + Usage: "Update a phone number in a project", + Action: updatePhoneNumber, + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "id", + Usage: "Use phone number ID for direct lookup", + }, + &cli.StringFlag{ + Name: "phonenumber", + Usage: "Use phone number string for lookup", + }, + &cli.StringFlag{ + Name: "sip-dispatch-rule-id", + Usage: "SIP dispatch rule ID to assign to the phone number", + }, + }, + ArgsUsage: "Either --id or --phonenumber must be provided", + }, + { + Name: "release", + Usage: "Release phone numbers", + Action: releasePhoneNumbers, + Flags: []cli.Flag{ + &cli.StringSliceFlag{ + Name: "ids", + Usage: "Use phone number IDs for direct lookup", + }, + &cli.StringSliceFlag{ + Name: "phonenumbers", + Usage: "Use phone number strings for lookup", + }, + }, + ArgsUsage: "Either --ids or --phonenumbers must be provided", + }, + }, + }, + } +) + +func createPhoneNumberClient(ctx context.Context, cmd *cli.Command) (*lksdk.PhoneNumberClient, error) { + _, err := requireProject(ctx, cmd) + if err != nil { + return nil, err + } + + // Debug: Print the URL being used + if cmd.Bool("verbose") { + fmt.Printf("Using phone number service URL: %s\n", project.URL) + } + + return lksdk.NewPhoneNumberClient(project.URL, project.APIKey, project.APISecret, withDefaultClientOpts(project)...), nil +} + +func searchPhoneNumbers(ctx context.Context, cmd *cli.Command) error { + client, err := createPhoneNumberClient(ctx, cmd) + if err != nil { + return err + } + + req := &livekit.SearchPhoneNumbersRequest{} + if val := cmd.String("country-code"); val != "" { + req.CountryCode = val + } + if val := cmd.String("area-code"); val != "" { + req.AreaCode = val + } + if val := cmd.Int("limit"); val != 0 { + req.Limit = int32(val) + } + if val := cmd.String("page-token"); val != "" { + req.PageToken = &livekit.TokenPagination{Token: val} + } + + resp, err := client.SearchPhoneNumbers(ctx, req) + if err != nil { + return err + } + + if cmd.Bool("json") { + util.PrintJSON(resp) + return nil + } + + return listAndPrint(ctx, cmd, func(ctx context.Context, req *livekit.SearchPhoneNumbersRequest) (*livekit.SearchPhoneNumbersResponse, error) { + return client.SearchPhoneNumbers(ctx, req) + }, req, []string{ + "E164", "Country", "Area Code", "Type", "Locality", "Region", "Capabilities", + }, func(item *livekit.PhoneNumber) []string { + return []string{ + item.E164Format, + item.CountryCode, + item.AreaCode, + strings.TrimPrefix(item.NumberType.String(), "PHONE_NUMBER_TYPE_"), + item.Locality, + item.Region, + strings.Join(item.Capabilities, ","), + } + }) +} + +func purchasePhoneNumbers(ctx context.Context, cmd *cli.Command) error { + client, err := createPhoneNumberClient(ctx, cmd) + if err != nil { + return err + } + + phoneNumbers := cmd.StringSlice("phonenumbers") + if len(phoneNumbers) == 0 { + return fmt.Errorf("at least one phone number must be provided") + } + + req := &livekit.PurchasePhoneNumberRequest{ + PhoneNumbers: phoneNumbers, + } + if val := cmd.String("sip-dispatch-rule-id"); val != "" { + req.SipDispatchRuleId = val + } + + resp, err := client.PurchasePhoneNumber(ctx, req) + if err != nil { + return err + } + + if cmd.Bool("json") { + util.PrintJSON(resp) + return nil + } + + fmt.Printf("Successfully purchased %d phone numbers:\n", len(resp.PhoneNumbers)) + for _, phoneNumber := range resp.PhoneNumbers { + fmt.Printf(" %s (%s) - %s\n", phoneNumber.E164Format, phoneNumber.Id, strings.TrimPrefix(phoneNumber.Status.String(), "PHONE_NUMBER_STATUS_")) + } + + return nil +} + +func listPhoneNumbers(ctx context.Context, cmd *cli.Command) error { + client, err := createPhoneNumberClient(ctx, cmd) + if err != nil { + return err + } + + req := &livekit.ListPhoneNumbersRequest{} + if val := cmd.Int("limit"); val != 0 { + req.Limit = int32(val) + } + if val := cmd.String("status"); val != "" { + status, ok := livekit.PhoneNumberStatus_value["PHONE_NUMBER_STATUS_"+strings.ToUpper(val)] + if !ok { + return fmt.Errorf("invalid status: %s", val) + } + req.Status = livekit.PhoneNumberStatus(status) + } + if val := cmd.String("page-token"); val != "" { + req.PageToken = &livekit.TokenPagination{Token: val} + } + if val := cmd.String("sip-dispatch-rule-id"); val != "" { + req.SipDispatchRuleId = val + } + + resp, err := client.ListPhoneNumbers(ctx, req) + if err != nil { + return err + } + + if cmd.Bool("json") { + util.PrintJSON(resp) + return nil + } + + fmt.Printf("Total phone numbers: %d\n", resp.TotalCount) + return listAndPrint(ctx, cmd, func(ctx context.Context, req *livekit.ListPhoneNumbersRequest) (*livekit.ListPhoneNumbersResponse, error) { + return client.ListPhoneNumbers(ctx, req) + }, req, []string{ + "ID", "E164", "Country", "Area Code", "Type", "Locality", "Region", "Capabilities", "Status", "SIP Dispatch Rule", + }, func(item *livekit.PhoneNumber) []string { + return []string{ + item.Id, + item.E164Format, + item.CountryCode, + item.AreaCode, + strings.TrimPrefix(item.NumberType.String(), "PHONE_NUMBER_TYPE_"), + item.Locality, + item.Region, + strings.Join(item.Capabilities, ","), + strings.TrimPrefix(item.Status.String(), "PHONE_NUMBER_STATUS_"), + item.SipDispatchRuleId, + } + }) +} + +func getPhoneNumber(ctx context.Context, cmd *cli.Command) error { + client, err := createPhoneNumberClient(ctx, cmd) + if err != nil { + return err + } + + id := cmd.String("id") + phoneNumber := cmd.String("phonenumber") + + if id == "" && phoneNumber == "" { + return fmt.Errorf("either --id or --phonenumber must be provided") + } + if id != "" && phoneNumber != "" { + return fmt.Errorf("only one of --id or --phonenumber can be provided") + } + + req := &livekit.GetPhoneNumberRequest{} + if id != "" { + req.Id = id + } else { + req.PhoneNumber = phoneNumber + } + + resp, err := client.GetPhoneNumber(ctx, req) + if err != nil { + return err + } + + if cmd.Bool("json") { + util.PrintJSON(resp) + return nil + } + + item := resp.PhoneNumber + fmt.Printf("Phone Number Details:\n") + fmt.Printf(" ID: %s\n", item.Id) + fmt.Printf(" E164 Format: %s\n", item.E164Format) + fmt.Printf(" Country: %s\n", item.CountryCode) + fmt.Printf(" Area Code: %s\n", item.AreaCode) + fmt.Printf(" Type: %s\n", strings.TrimPrefix(item.NumberType.String(), "PHONE_NUMBER_TYPE_")) + fmt.Printf(" Locality: %s\n", item.Locality) + fmt.Printf(" Region: %s\n", item.Region) + fmt.Printf(" Capabilities: %s\n", strings.Join(item.Capabilities, ",")) + fmt.Printf(" Status: %s\n", strings.TrimPrefix(item.Status.String(), "PHONE_NUMBER_STATUS_")) + fmt.Printf(" SIP Dispatch Rule: %s\n", item.SipDispatchRuleId) + if item.ReleasedAt != nil { + fmt.Printf(" Released At: %s\n", item.ReleasedAt.AsTime().Format("2006-01-02 15:04:05")) + } + + return nil +} + +func updatePhoneNumber(ctx context.Context, cmd *cli.Command) error { + client, err := createPhoneNumberClient(ctx, cmd) + if err != nil { + return err + } + + id := cmd.String("id") + phoneNumber := cmd.String("phonenumber") + + if id == "" && phoneNumber == "" { + return fmt.Errorf("either --id or --phonenumber must be provided") + } + if id != "" && phoneNumber != "" { + return fmt.Errorf("only one of --id or --phonenumber can be provided") + } + + req := &livekit.UpdatePhoneNumberRequest{} + if id != "" { + req.Id = id + } else { + req.PhoneNumber = phoneNumber + } + if val := cmd.String("sip-dispatch-rule-id"); val != "" { + req.SipDispatchRuleId = val + } + + resp, err := client.UpdatePhoneNumber(ctx, req) + if err != nil { + return err + } + + if cmd.Bool("json") { + util.PrintJSON(resp) + return nil + } + + item := resp.PhoneNumber + fmt.Printf("Successfully updated phone number:\n") + fmt.Printf(" ID: %s\n", item.Id) + fmt.Printf(" E164 Format: %s\n", item.E164Format) + fmt.Printf(" Status: %s\n", strings.TrimPrefix(item.Status.String(), "PHONE_NUMBER_STATUS_")) + fmt.Printf(" SIP Dispatch Rule: %s\n", item.SipDispatchRuleId) + + return nil +} + +func releasePhoneNumbers(ctx context.Context, cmd *cli.Command) error { + client, err := createPhoneNumberClient(ctx, cmd) + if err != nil { + return err + } + + ids := cmd.StringSlice("ids") + phoneNumbers := cmd.StringSlice("phonenumbers") + + if len(ids) == 0 && len(phoneNumbers) == 0 { + return fmt.Errorf("either --ids or --phonenumbers must be provided") + } + if len(ids) > 0 && len(phoneNumbers) > 0 { + return fmt.Errorf("only one of --ids or --phonenumbers can be provided") + } + + req := &livekit.ReleasePhoneNumbersRequest{} + if len(ids) > 0 { + req.Ids = ids + } else { + req.PhoneNumbers = phoneNumbers + } + + _, err = client.ReleasePhoneNumbers(ctx, req) + if err != nil { + return err + } + + if len(ids) > 0 { + fmt.Printf("Successfully released %d phone numbers by ID: %s\n", len(ids), strings.Join(ids, ", ")) + } else { + fmt.Printf("Successfully released %d phone numbers: %s\n", len(phoneNumbers), strings.Join(phoneNumbers, ", ")) + } + + return nil +} diff --git a/go.mod b/go.mod index 82823539..27cff718 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/go-task/task/v3 v3.44.1 github.com/joho/godotenv v1.5.1 github.com/livekit/protocol v1.42.1-0.20251008181454-49a136864c2d - github.com/livekit/server-sdk-go/v2 v2.11.3 + github.com/livekit/server-sdk-go/v2 v2.11.4-0.20251009161714-f90dc6f3d8bb github.com/moby/buildkit v0.23.2 github.com/moby/patternmatcher v0.6.0 github.com/pion/rtcp v1.2.15 @@ -145,7 +145,7 @@ require ( github.com/pion/datachannel v1.5.10 // indirect github.com/pion/dtls/v3 v3.0.7 // indirect github.com/pion/ice/v4 v4.0.10 // indirect - github.com/pion/interceptor v0.1.40 // indirect + github.com/pion/interceptor v0.1.41 // indirect github.com/pion/logging v0.2.4 // indirect github.com/pion/mdns/v2 v2.0.7 // indirect github.com/pion/randutil v0.1.0 // indirect diff --git a/go.sum b/go.sum index 3b088e0a..e24a6c3d 100644 --- a/go.sum +++ b/go.sum @@ -280,8 +280,8 @@ github.com/livekit/protocol v1.42.1-0.20251008181454-49a136864c2d h1:ofC+CPiYDZ4 github.com/livekit/protocol v1.42.1-0.20251008181454-49a136864c2d/go.mod h1:vhMS30QoEyH2p34vi6X1eWkC4EMV72ZGZwQb74ajY7A= github.com/livekit/psrpc v0.7.0 h1:rtfqfjYN06WJYloE/S0nmkJ/Y04x4pxLQLe8kQ4FVHU= github.com/livekit/psrpc v0.7.0/go.mod h1:AuDC5uOoEjQJEc69v4Li3t77Ocz0e0NdjQEuFfO+vfk= -github.com/livekit/server-sdk-go/v2 v2.11.3 h1:k+YDxo8wPCixRrS9fJHcbtlurlXhVLfyPva5Ne4tVH0= -github.com/livekit/server-sdk-go/v2 v2.11.3/go.mod h1:ZRI95+32aJIC4BI0hV0h/XfHcX9Vrk7zcT2mKG1Q758= +github.com/livekit/server-sdk-go/v2 v2.11.4-0.20251009161714-f90dc6f3d8bb h1:dhhNdVePPaoVOCu/84NIvHFW7zmwqK14Sddc+/n0ykw= +github.com/livekit/server-sdk-go/v2 v2.11.4-0.20251009161714-f90dc6f3d8bb/go.mod h1:g02aP512k++aokArVafcaIzq4zu0OwxGlJFR5+zifAQ= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= @@ -356,8 +356,8 @@ github.com/pion/dtls/v3 v3.0.7 h1:bItXtTYYhZwkPFk4t1n3Kkf5TDrfj6+4wG+CZR8uI9Q= github.com/pion/dtls/v3 v3.0.7/go.mod h1:uDlH5VPrgOQIw59irKYkMudSFprY9IEFCqz/eTz16f8= github.com/pion/ice/v4 v4.0.10 h1:P59w1iauC/wPk9PdY8Vjl4fOFL5B+USq1+xbDcN6gT4= github.com/pion/ice/v4 v4.0.10/go.mod h1:y3M18aPhIxLlcO/4dn9X8LzLLSma84cx6emMSu14FGw= -github.com/pion/interceptor v0.1.40 h1:e0BjnPcGpr2CFQgKhrQisBU7V3GXK6wrfYrGYaU6Jq4= -github.com/pion/interceptor v0.1.40/go.mod h1:Z6kqH7M/FYirg3frjGJ21VLSRJGBXB/KqaTIrdqnOic= +github.com/pion/interceptor v0.1.41 h1:NpvX3HgWIukTf2yTBVjVGFXtpSpWgXjqz7IIpu7NsOw= +github.com/pion/interceptor v0.1.41/go.mod h1:nEt4187unvRXJFyjiw00GKo+kIuXMWQI9K89fsosDLY= github.com/pion/logging v0.2.4 h1:tTew+7cmQ+Mc1pTBLKH2puKsOvhm32dROumOZ655zB8= github.com/pion/logging v0.2.4/go.mod h1:DffhXTKYdNZU+KtJ5pyQDjvOAh/GsNSyv1lbkFbe3so= github.com/pion/mdns/v2 v2.0.7 h1:c9kM8ewCgjslaAmicYMFQIde2H9/lrZpjBkN8VwoVtM= From b63e2711f98a997954a1ed973dca94050c80291e Mon Sep 17 00:00:00 2001 From: Nishad Musthafa Date: Mon, 13 Oct 2025 14:35:16 +0530 Subject: [PATCH 2/4] Changing phonenumber to number for command and making search result rendering block more readable --- cmd/lk/phone_number.go | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/cmd/lk/phone_number.go b/cmd/lk/phone_number.go index 6941b9ba..5be5dfcf 100644 --- a/cmd/lk/phone_number.go +++ b/cmd/lk/phone_number.go @@ -28,7 +28,7 @@ import ( var ( PhoneNumberCommands = []*cli.Command{ { - Name: "phonenumber", + Name: "number", Usage: "Manage phone numbers", Hidden: true, Commands: []*cli.Command{ @@ -199,11 +199,18 @@ func searchPhoneNumbers(ctx context.Context, cmd *cli.Command) error { return nil } - return listAndPrint(ctx, cmd, func(ctx context.Context, req *livekit.SearchPhoneNumbersRequest) (*livekit.SearchPhoneNumbersResponse, error) { + // Define the search function + searchFunc := func(ctx context.Context, req *livekit.SearchPhoneNumbersRequest) (*livekit.SearchPhoneNumbersResponse, error) { return client.SearchPhoneNumbers(ctx, req) - }, req, []string{ + } + + // Define the column headers + headers := []string{ "E164", "Country", "Area Code", "Type", "Locality", "Region", "Capabilities", - }, func(item *livekit.PhoneNumber) []string { + } + + // Define the row formatter + rowFormatter := func(item *livekit.PhoneNumber) []string { return []string{ item.E164Format, item.CountryCode, @@ -213,7 +220,9 @@ func searchPhoneNumbers(ctx context.Context, cmd *cli.Command) error { item.Region, strings.Join(item.Capabilities, ","), } - }) + } + + return listAndPrint(ctx, cmd, searchFunc, req, headers, rowFormatter) } func purchasePhoneNumbers(ctx context.Context, cmd *cli.Command) error { From 66546e8fb66a5d9592f722392a4e9ef6a8e140bd Mon Sep 17 00:00:00 2001 From: Nishad Musthafa Date: Mon, 13 Oct 2025 17:44:03 +0530 Subject: [PATCH 3/4] tidy --- go.sum | 2 -- 1 file changed, 2 deletions(-) diff --git a/go.sum b/go.sum index e24a6c3d..1601fbcd 100644 --- a/go.sum +++ b/go.sum @@ -274,8 +274,6 @@ github.com/livekit/mageutil v0.0.0-20250511045019-0f1ff63f7731 h1:9x+U2HGLrSw5AT github.com/livekit/mageutil v0.0.0-20250511045019-0f1ff63f7731/go.mod h1:Rs3MhFwutWhGwmY1VQsygw28z5bWcnEYmS1OG9OxjOQ= github.com/livekit/mediatransportutil v0.0.0-20250825135402-7bc31f107ade h1:lpxPcglwzUWNB4J0S2qZuyMehzmR7vW9whzSwV4IGoI= github.com/livekit/mediatransportutil v0.0.0-20250825135402-7bc31f107ade/go.mod h1:mSNtYzSf6iY9xM3UX42VEI+STHvMgHmrYzEHPcdhB8A= -github.com/livekit/protocol v1.42.1-0.20250929175250-2ddfb3ee7f7e h1:yytr+uwFXtJ8UxBV2q3j55jVKg7zslECuGeE4F56NoU= -github.com/livekit/protocol v1.42.1-0.20250929175250-2ddfb3ee7f7e/go.mod h1:vhMS30QoEyH2p34vi6X1eWkC4EMV72ZGZwQb74ajY7A= github.com/livekit/protocol v1.42.1-0.20251008181454-49a136864c2d h1:ofC+CPiYDZ4LD+RgIJg4rUFLvKnWJqg66bn00FALKLI= github.com/livekit/protocol v1.42.1-0.20251008181454-49a136864c2d/go.mod h1:vhMS30QoEyH2p34vi6X1eWkC4EMV72ZGZwQb74ajY7A= github.com/livekit/psrpc v0.7.0 h1:rtfqfjYN06WJYloE/S0nmkJ/Y04x4pxLQLe8kQ4FVHU= From d21eca3e125befd373f0bb0ee993678f44cf7cd3 Mon Sep 17 00:00:00 2001 From: Nishad Musthafa Date: Tue, 14 Oct 2025 16:14:01 +0530 Subject: [PATCH 4/4] Removed the page token for now and updating some more params from phonenumber(s) to number(s) --- cmd/lk/phone_number.go | 48 +++++++++++++++--------------------------- 1 file changed, 17 insertions(+), 31 deletions(-) diff --git a/cmd/lk/phone_number.go b/cmd/lk/phone_number.go index 5be5dfcf..a8570c38 100644 --- a/cmd/lk/phone_number.go +++ b/cmd/lk/phone_number.go @@ -50,10 +50,6 @@ var ( Usage: "Maximum number of results (default: 50)", Value: 50, }, - &cli.StringFlag{ - Name: "page-token", - Usage: "Token for pagination (empty for first page)", - }, jsonFlag, }, }, @@ -63,7 +59,7 @@ var ( Action: purchasePhoneNumbers, Flags: []cli.Flag{ &cli.StringSliceFlag{ - Name: "phonenumbers", + Name: "numbers", Usage: "Phone numbers to purchase (e.g., \"+1234567890\", \"+1234567891\")", Required: true, }, @@ -87,10 +83,6 @@ var ( Name: "status", Usage: "Filter by status (active, pending, released)", }, - &cli.StringFlag{ - Name: "page-token", - Usage: "Token for pagination (empty for first page)", - }, &cli.StringFlag{ Name: "sip-dispatch-rule-id", Usage: "Filter by SIP dispatch rule ID", @@ -108,11 +100,11 @@ var ( Usage: "Use phone number ID for direct lookup", }, &cli.StringFlag{ - Name: "phonenumber", + Name: "number", Usage: "Use phone number string for lookup", }, }, - ArgsUsage: "Either --id or --phonenumber must be provided", + ArgsUsage: "Either --id or --number must be provided", }, { Name: "update", @@ -124,7 +116,7 @@ var ( Usage: "Use phone number ID for direct lookup", }, &cli.StringFlag{ - Name: "phonenumber", + Name: "number", Usage: "Use phone number string for lookup", }, &cli.StringFlag{ @@ -132,7 +124,7 @@ var ( Usage: "SIP dispatch rule ID to assign to the phone number", }, }, - ArgsUsage: "Either --id or --phonenumber must be provided", + ArgsUsage: "Either --id or --number must be provided", }, { Name: "release", @@ -144,11 +136,11 @@ var ( Usage: "Use phone number IDs for direct lookup", }, &cli.StringSliceFlag{ - Name: "phonenumbers", + Name: "numbers", Usage: "Use phone number strings for lookup", }, }, - ArgsUsage: "Either --ids or --phonenumbers must be provided", + ArgsUsage: "Either --ids or --numbers must be provided", }, }, }, @@ -185,9 +177,6 @@ func searchPhoneNumbers(ctx context.Context, cmd *cli.Command) error { if val := cmd.Int("limit"); val != 0 { req.Limit = int32(val) } - if val := cmd.String("page-token"); val != "" { - req.PageToken = &livekit.TokenPagination{Token: val} - } resp, err := client.SearchPhoneNumbers(ctx, req) if err != nil { @@ -231,7 +220,7 @@ func purchasePhoneNumbers(ctx context.Context, cmd *cli.Command) error { return err } - phoneNumbers := cmd.StringSlice("phonenumbers") + phoneNumbers := cmd.StringSlice("numbers") if len(phoneNumbers) == 0 { return fmt.Errorf("at least one phone number must be provided") } @@ -278,9 +267,6 @@ func listPhoneNumbers(ctx context.Context, cmd *cli.Command) error { } req.Status = livekit.PhoneNumberStatus(status) } - if val := cmd.String("page-token"); val != "" { - req.PageToken = &livekit.TokenPagination{Token: val} - } if val := cmd.String("sip-dispatch-rule-id"); val != "" { req.SipDispatchRuleId = val } @@ -323,13 +309,13 @@ func getPhoneNumber(ctx context.Context, cmd *cli.Command) error { } id := cmd.String("id") - phoneNumber := cmd.String("phonenumber") + phoneNumber := cmd.String("number") if id == "" && phoneNumber == "" { - return fmt.Errorf("either --id or --phonenumber must be provided") + return fmt.Errorf("either --id or --number must be provided") } if id != "" && phoneNumber != "" { - return fmt.Errorf("only one of --id or --phonenumber can be provided") + return fmt.Errorf("only one of --id or --number can be provided") } req := &livekit.GetPhoneNumberRequest{} @@ -375,13 +361,13 @@ func updatePhoneNumber(ctx context.Context, cmd *cli.Command) error { } id := cmd.String("id") - phoneNumber := cmd.String("phonenumber") + phoneNumber := cmd.String("number") if id == "" && phoneNumber == "" { - return fmt.Errorf("either --id or --phonenumber must be provided") + return fmt.Errorf("either --id or --number must be provided") } if id != "" && phoneNumber != "" { - return fmt.Errorf("only one of --id or --phonenumber can be provided") + return fmt.Errorf("only one of --id or --number can be provided") } req := &livekit.UpdatePhoneNumberRequest{} @@ -421,13 +407,13 @@ func releasePhoneNumbers(ctx context.Context, cmd *cli.Command) error { } ids := cmd.StringSlice("ids") - phoneNumbers := cmd.StringSlice("phonenumbers") + phoneNumbers := cmd.StringSlice("numbers") if len(ids) == 0 && len(phoneNumbers) == 0 { - return fmt.Errorf("either --ids or --phonenumbers must be provided") + return fmt.Errorf("either --ids or --numbers must be provided") } if len(ids) > 0 && len(phoneNumbers) > 0 { - return fmt.Errorf("only one of --ids or --phonenumbers can be provided") + return fmt.Errorf("only one of --ids or --numbers can be provided") } req := &livekit.ReleasePhoneNumbersRequest{}