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