defmodule ArcadiaCloudWeb.CatalogController do @moduledoc """ Read-only pricing catalog. Available to any authenticated tenant — the catalog is what they pick a plan from. Pricing changes are operator actions; no write endpoints here for MVP (seed/CLI only). """ use ArcadiaCloudWeb, :controller alias ArcadiaCloud.Catalog def plans(conn, _params) do plans = Catalog.list_plans() |> Enum.map(fn plan -> version = Catalog.active_version(plan) shape_plan(plan, version) end) json(conn, %{plans: plans}) end def addons(conn, _params) do addons = Catalog.list_addons() |> Enum.map(fn a -> %{ code: a.code, name: a.name, resource_kind: a.resource_kind, qty: a.qty, price_cents: a.price_cents, currency: a.currency } end) json(conn, %{addons: addons}) end defp shape_plan(plan, nil) do %{code: plan.code, name: plan.name, description: plan.description, active_version: nil} end defp shape_plan(plan, version) do %{ code: plan.code, name: plan.name, description: plan.description, active_version: %{ id: version.id, version: version.version, base_price_cents: version.base_price_cents, currency: version.currency, items: Enum.map(version.items, fn i -> %{ resource_kind: i.resource_kind, included_qty: i.included_qty, overage_unit: i.overage_unit, overage_price_cents: i.overage_price_cents, hard_cap_qty: i.hard_cap_qty } end) } } end end