From 7cc14905c1d742d888c80b1bac3f4d05c96ad2d0 Mon Sep 17 00:00:00 2001 From: mexcool Date: Thu, 26 Mar 2026 22:22:35 +0100 Subject: [PATCH] feat: add --mode uuid|word flag to random alias creation --- cmd/alias/create.go | 14 +++++++++++++- internal/api/client.go | 13 +++++++++++-- internal/api/client_test.go | 33 ++++++++++++++++++++++++++++++++- 3 files changed, 56 insertions(+), 4 deletions(-) diff --git a/cmd/alias/create.go b/cmd/alias/create.go index 0257f52..26464b8 100644 --- a/cmd/alias/create.go +++ b/cmd/alias/create.go @@ -28,6 +28,12 @@ Optionally attach a note, display name, or assign to specific mailboxes.`, Example: ` # Create a random alias sl alias create --random + # Create a word-based random alias + sl alias create --random --mode word + + # Create a UUID-based random alias + sl alias create --random --mode uuid + # Create a random alias with a note sl alias create --random --note "Used for newsletters" @@ -52,6 +58,7 @@ var ( createMailbox []int createNote string createName string + createMode string createJSON bool createJQ string ) @@ -63,6 +70,7 @@ func init() { createCmd.Flags().IntSliceVar(&createMailbox, "mailbox", nil, "Mailbox IDs to assign") createCmd.Flags().StringVar(&createNote, "note", "", "Note for the alias") createCmd.Flags().StringVar(&createName, "name", "", "Display name for the alias") + createCmd.Flags().StringVar(&createMode, "mode", "", "Random alias generation mode: uuid or word") createCmd.Flags().BoolVar(&createJSON, "json", false, "Output as JSON") createCmd.Flags().StringVar(&createJQ, "jq", "", "Apply jq expression to JSON output") } @@ -75,8 +83,12 @@ func runCreate(cmd *cobra.Command, args []string) error { client := api.NewClient(key) + if createMode != "" && createMode != "uuid" && createMode != "word" { + return fmt.Errorf("--mode must be 'uuid' or 'word'") + } + if createRandom { - alias, rawJSON, err := client.CreateRandomAlias(createNote) + alias, rawJSON, err := client.CreateRandomAlias(createNote, createMode) if err != nil { return err } diff --git a/internal/api/client.go b/internal/api/client.go index f39098f..0bcba9f 100644 --- a/internal/api/client.go +++ b/internal/api/client.go @@ -439,12 +439,21 @@ type CreateRandomAliasRequest struct { } // CreateRandomAlias creates a random alias. -func (c *Client) CreateRandomAlias(note string) (*Alias, []byte, error) { +// mode can be "uuid" or "word" (empty string uses server default). +func (c *Client) CreateRandomAlias(note, mode string) (*Alias, []byte, error) { var reqBody interface{} if note != "" { reqBody = &CreateRandomAliasRequest{Note: note} } - body, status, err := c.do("POST", "/api/alias/random/new", reqBody) + path := "/api/alias/random/new" + params := url.Values{} + if mode != "" { + params.Set("mode", mode) + } + if len(params) > 0 { + path += "?" + params.Encode() + } + body, status, err := c.do("POST", path, reqBody) if err != nil { return nil, nil, fmt.Errorf("failed to create random alias: %w", err) } diff --git a/internal/api/client_test.go b/internal/api/client_test.go index 9b0ad64..ebf2da5 100644 --- a/internal/api/client_test.go +++ b/internal/api/client_test.go @@ -340,7 +340,7 @@ func TestClient_CreateRandomAlias(t *testing.T) { defer srv.Close() c := newTestClient(t, srv) - alias, _, err := c.CreateRandomAlias("test note") + alias, _, err := c.CreateRandomAlias("test note", "") if err != nil { t.Fatalf("CreateRandomAlias: %v", err) } @@ -352,6 +352,37 @@ func TestClient_CreateRandomAlias(t *testing.T) { } } +func TestClient_CreateRandomAlias_WithMode(t *testing.T) { + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Errorf("expected POST, got %s", r.Method) + } + if r.URL.Path != "/api/alias/random/new" { + t.Errorf("unexpected path: %s", r.URL.Path) + } + mode := r.URL.Query().Get("mode") + if mode != "word" { + t.Errorf("expected mode=word, got %q", mode) + } + w.WriteHeader(201) + alias := Alias{ID: 101, Email: "word-random@sl.local"} + _ = json.NewEncoder(w).Encode(alias) + })) + defer srv.Close() + + c := newTestClient(t, srv) + alias, _, err := c.CreateRandomAlias("", "word") + if err != nil { + t.Fatalf("CreateRandomAlias with mode: %v", err) + } + if alias.ID != 101 { + t.Errorf("expected ID 101, got %d", alias.ID) + } + if alias.Email != "word-random@sl.local" { + t.Errorf("expected email word-random@sl.local, got %q", alias.Email) + } +} + func TestClient_GetStats(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.URL.Path != "/api/stats" {