defmodule ScalesCmsWeb.Api.Public.PagesJSON do def index(%{pages: pages, api_version: api_version, pagination: pagination}) do %{ api_version: api_version, pagination: pagination, pages: Enum.map( pages, &ScalesCmsWeb.Api.Public.PagesJSON.show(%{ page: &1.latest_published_page, api_version: api_version }) ) } end def show(%{page: page, api_version: api_version}) do %{ id: page.id, api_version: api_version, title: page.title, slug: page.page.slug, directory_id: page.page.cms_directory_id, locale: page.locale, blocks: for( block <- page.blocks, do: block(%{block: block, api_version: api_version, locale: page.locale}) ) } end def block(%{block: block, api_version: api_version, locale: locale}) do with {:ok, resolved_block} <- ScalesCms.Helpers.BlockResolver.resolve_block(block, locale), component when not is_nil(component) <- ScalesCmsWeb.Components.CmsComponents.get_component(resolved_block.component_type) do component.serialize(api_version, resolved_block) end end end