View Source ExPipedrive.ProductVariations (ex_pipedrive v0.2.0)

Pipedrive product variations resource — nested under a product id.

Variations are a separate v2 API from ExPipedrive.Products: /api/v2/products/:id/variations. Because every call is scoped to a product_id (unlike the single flat top-level path assumed by ExPipedrive.Resource), this module builds its own Request calls rather than implementing the Resource behaviour.

Pipedrive does not expose a "get one variation" endpoint — only list/create/update/delete. get/3 is a client-side convenience that scans stream/3 pages for a matching id.

Example

{:ok, variation} =
  ExPipedrive.ProductVariations.create(client, product_id, %{
    name: "Large",
    prices: [%{currency: "USD", price: 24.99}]
  })

{:ok, page} = ExPipedrive.ProductVariations.list_page(client, product_id)
variations = ExPipedrive.ProductVariations.stream(client, product_id) |> Enum.to_list()

{:ok, updated} =
  ExPipedrive.ProductVariations.update(client, product_id, variation.id, %{name: "XL"})

{:ok, _} = ExPipedrive.ProductVariations.delete(client, product_id, variation.id)

Summary

Functions

Creates a product variation via POST /api/v2/products/:id/variations.

Deletes a product variation via DELETE /api/v2/products/:id/variations/:product_variation_id.

Fetches a single product variation by id.

Lists one page of a product's variations via GET /api/v2/products/:id/variations.

Lazily streams a product's variations across all v2 cursor pages until next_cursor is nil.

Updates a product variation via PATCH /api/v2/products/:id/variations/:product_variation_id.

Functions

Link to this function

create(client, product_id, attrs)

View Source
@spec create(Tesla.Client.t(), term(), term()) ::
  {:ok, ExPipedrive.ProductVariation.t()} | {:error, ExPipedrive.Error.t()}

Creates a product variation via POST /api/v2/products/:id/variations.

Accepts a map (preferred) or %ProductVariation{}. Required: :name. Optional: :prices (array of %{currency:, price:, cost:, direct_cost:, notes:}).

Link to this function

delete(client, product_id, variation_id)

View Source
@spec delete(Tesla.Client.t(), term(), term()) ::
  {:ok, term()} | {:error, ExPipedrive.Error.t()}

Deletes a product variation via DELETE /api/v2/products/:id/variations/:product_variation_id.

Link to this function

get(client, product_id, variation_id)

View Source
@spec get(Tesla.Client.t(), term(), term()) ::
  {:ok, ExPipedrive.ProductVariation.t()} | {:error, ExPipedrive.Error.t()}

Fetches a single product variation by id.

Pipedrive has no dedicated "get one variation" endpoint, so this scans stream/3 pages for a matching id and returns a structured :not_found error (mirroring a 404 API response) when it isn't present.

Link to this function

list_page(client, product_id, opts \\ [])

View Source
@spec list_page(Tesla.Client.t(), term(), keyword()) ::
  {:ok, ExPipedrive.Page.t()} | {:error, ExPipedrive.Error.t()}

Lists one page of a product's variations via GET /api/v2/products/:id/variations.

Options: :cursor, :limit (clamped to 500). Returns {:ok, %ExPipedrive.Page{}}.

Link to this function

stream(client, product_id, opts \\ [])

View Source
@spec stream(Tesla.Client.t(), term(), keyword()) :: Enumerable.t()

Lazily streams a product's variations across all v2 cursor pages until next_cursor is nil.

Link to this function

update(client, product_id, variation_id, attrs)

View Source
@spec update(Tesla.Client.t(), term(), term(), term()) ::
  {:ok, ExPipedrive.ProductVariation.t()} | {:error, ExPipedrive.Error.t()}

Updates a product variation via PATCH /api/v2/products/:id/variations/:product_variation_id.