defmodule ExCatalog do
@moduledoc """
Documentation for `ExCatalog`.
"""
@repo ExCatalog.Config.repo()
alias ExCatalog.Category
@doc """
List version.
## Examples
iex> ExCatalog.version()
"""
@version Mix.Project.config()[:version]
def version, do: @version
@doc """
List all the categories (the index).
## Examples
iex> ExCatalog.index(25)
"""
def index(limit \\ 25, metadata \\ nil, cursor \\ nil) do
import Ecto.Query
query =
from(ExCatalog.Category,
preload: [:parent_category],
preload: [:image]
)
case cursor do
:before ->
@repo.paginate(
query,
before: metadata.before,
include_total_count: true,
cursor_fields: [:inserted_at, :id],
limit: limit
)
:after ->
@repo.paginate(
query,
after: metadata.after,
include_total_count: true,
cursor_fields: [:inserted_at, :id],
limit: limit
)
_ ->
@repo.paginate(
query,
include_total_count: true,
cursor_fields: [:inserted_at, :id],
limit: limit
)
end
end
@doc """
List all products with preloads and optional currency conversion..
## Examples
iex> ExCatalog.products(25)
iex> ExCatalog.products(25,:USD)
"""
def products(limit \\ 25, currency \\ :USD) do
products(limit, nil, nil, currency)
end
def products(limit \\ 25, metadata, cursor, currency) do
import Ecto.Query
query =
from(ExCatalog.Product,
preload: [:variations],
preload: [:categories],
preload: [:metas],
preload: [:primary_image],
preload: [:images],
preload: [:videos]
)
reply =
case cursor do
:before ->
@repo.paginate(
query,
before: metadata.before,
include_total_count: true,
cursor_fields: [:inserted_at, :id],
limit: limit
)
:after ->
@repo.paginate(
query,
after: metadata.after,
include_total_count: true,
cursor_fields: [:inserted_at, :id],
limit: limit
)
_ ->
@repo.paginate(
query,
include_total_count: true,
cursor_fields: [:inserted_at, :id],
limit: limit
)
end
case currency do
nil ->
reply
_ ->
{p, metadata} = reply
modified =
Enum.map(p, fn x ->
{:ok, price} = ExCatalog.Currencies.convert(x.price, currency)
%{x | price: price}
end)
{modified, metadata}
end
end
@doc """
List product with preloads by sku and optional currency conversion.
## Examples
iex> ExCatalog.product("2242", :USD)
"""
def product(sku, currency \\ nil) do
import Ecto.Query
query =
from(ExCatalog.Product,
where: [sku: ^sku],
preload: [:variations],
preload: [:categories],
preload: [:metas],
preload: [:primary_image],
preload: [:images],
preload: [:videos]
)
[reply] = @repo.all(query)
case currency do
nil ->
reply
_ ->
{:ok, price} = ExCatalog.Currencies.convert(reply.price, currency)
%{reply | price: price}
end
end
@doc """
List product with preloads by category and optional currency conversion.
## Examples
iex> ExCatalog.products_by_category("test_category", "2242", :USD)
"""
def products_by_category(slug, limit \\ 25, currency \\ :USD) do
products_by_category(slug, limit, nil, nil, currency)
end
def products_by_category(slug, limit, metadata, cursor, currency) do
category = @repo.get_by(%Category{}, slug: slug)
import Ecto.Query
query =
from(ExCatalog.Product,
where: [category_id: ^category.id],
preload: [:variations],
preload: [:categories],
preload: [:metas],
preload: [:primary_image],
preload: [:images],
preload: [:videos]
)
reply =
case cursor do
:before ->
@repo.paginate(
query,
before: metadata.before,
include_total_count: true,
cursor_fields: [:inserted_at, :id],
limit: limit
)
:after ->
@repo.paginate(
query,
after: metadata.after,
include_total_count: true,
cursor_fields: [:inserted_at, :id],
limit: limit
)
_ ->
@repo.paginate(
query,
include_total_count: true,
cursor_fields: [:inserted_at, :id],
limit: limit
)
end
case currency do
nil ->
reply
_ ->
{p, metadata} = reply
modified =
Enum.map(p, fn x ->
{:ok, price} = ExCatalog.Currencies.convert(x.price, currency)
%{x | price: price}
end)
{modified, metadata}
end
end
end