Current section
Files
Jump to
Current section
Files
lib/vtex_ws/categories.ex
defmodule VtexWs.Categories do
@moduledoc "Categories tem a responsabilidade de lidar com o cache de categorias a serem consolidadas, bem como a consolidação das categorias no App Manager."
import Redix, only: [command: 2]
alias VtexWs.Services.{AppManager, Vtex}
alias VtexWs.Categories.AppManagerCategory, as: Category
@doc "Verifica se a categoria foi processada recentemente (cacheada)."
def cached?(id, app) do
command(:redix, ["EXISTS", redis_route(id, app)])
|> case do
{:ok, 1} -> :true
{:ok, 0} -> :false
_ -> :false
end
end
@doc "Cacheia uma categoria por id e app (cliente)."
def persist!(id, app) do
command(:redix, ["SETEX", redis_route(id, app), 600_000, :ok])
end
@doc "Deleta a categoria do cache."
def delete!(id, app) do
command(:redix, ["DEL", redis_route(id, app)])
end
defp redis_route(id, app) do
"app_" <> to_string(app.id) <> "_category_id_" <> to_string(id)
end
@doc "Retorna uma categoria por id e app (cliente)."
def get_by_app!(id, app) do
%{body: body, status_code: 200} = Vtex.get_category_by_app!(id, app)
%{
"id" => client_id,
"name" => title,
"parentId" => parent_id
} = Poison.decode!(body)
is_trash = title
|> String.downcase
|> String.contains?("inativo")
%Category{
title: title,
is_trash: is_trash,
client_id: client_id,
client_parent_id: parent_id
}
end
@doc "Cria/atualiza categoria no App Manager."
def create_or_update_by_app!(category, app) do
%{body: "", status_code: 200}
# TODO: AppManager.create_or_update_category_by_app!(category, app)
end
@doc "Consolida todas as categorias, criando-as/atualizando no App Manager e tratando o cache delas no VtexWs."
def consolidate_all_by_app!(ids, app) when is_list(ids) do
Enum.each(ids, fn id -> consolidate_by_app!(id, app)end)
end
defp consolidate_by_app!(id, app) do
case cached?(id, app) do
true -> :ok
_ ->
%{body: _body, status_code: 200} = id
|> get_by_app!(app)
|> create_or_update_by_app!(app)
persist!(id, app)
|> elem(0)
end
end
end