defmodule PresenceEx do @moduledoc false # credo:disable-for-this-file Credo.Check.Refactor.PipeChainStart import Ecto.Query alias PresenceEx.Repo alias PresenceEx.Schemas.Status alias PresenceEx.Utils alias PresenceEx.Schemas.Subscribe def insert(account, resource, node, status, features) do %Status{} |> Status.changeset(%{ account: account, resource: resource, node: node, status: status, features: features }) |> Repo.insert(prefix: Utils.prefix(account)) end def update(account, resource, t) do from(Status, where: [account: ^account, resource: ^resource]) |> Repo.update_all([set: t], prefix: Utils.prefix(account)) end @spec upsert(binary | integer, any, any, any, any) :: any def upsert(account, resource, node, status, features) do %Status{} |> Status.changeset(%{ account: account, resource: resource, node: node, status: status, features: features }) |> Repo.insert( prefix: Utils.prefix(account), on_conflict: {:replace, [:node, :status, :features]}, conflict_target: [:account, :resource] ) end def get(account, resource) do from(Status, where: [account: ^account, resource: ^resource]) |> Repo.replica().all(prefix: Utils.prefix(account)) end def get(account, resource, statuses) do case length(statuses) > 2 do true -> [] false -> case statuses do [] -> [] [s] -> from(Status, where: [account: ^account, resource: ^resource, status: ^s]) |> Repo.replica().all(prefix: Utils.prefix(account)) sl -> [s_exclude] = ["online", "away", "offline"] -- sl from(s in Status, where: s.account == ^account and s.resource == ^resource and s.status != ^s_exclude ) |> Repo.replica().all(prefix: Utils.prefix(account)) end end end def get_by_user(account) do from(Status, where: [account: ^account]) |> Repo.replica().all(prefix: Utils.prefix(account)) end def get_by_user(account, statuses) do case length(statuses) > 2 do true -> [] false -> case statuses do [] -> [] [s] -> from(Status, where: [account: ^account, status: ^s]) |> Repo.replica().all(prefix: Utils.prefix(account)) sl -> [s_exclude] = ["online", "away", "offline"] -- sl from(s in Status, where: s.account == ^account and s.status != ^s_exclude) |> Repo.replica().all(prefix: Utils.prefix(account)) end end end def get_by_node(node) do query = from(Status, where: [node: ^node]) Utils.all_schema_ids() |> Enum.flat_map(&Repo.replica().all(query, prefix: Utils.prefix(&1))) end def delete(account, resource) do from(Status, where: [account: ^account, resource: ^resource]) |> Repo.delete_all(prefix: Utils.prefix(account)) end def delete_by_user(account) do from(Status, where: [account: ^account]) |> Repo.delete_all(prefix: Utils.prefix(account)) end def delete_by_node(node) do query = from(Status, where: [node: ^node]) Utils.all_schema_ids() |> Enum.map(&Repo.delete_all(query, prefix: Utils.prefix(&1))) end def upsert_subscribe(account, subscribe) do %Subscribe{} |> Subscribe.changeset(%{ account: account, subscribe_list: subscribe }) |> Repo.insert( prefix: Utils.prefix(account), on_conflict: {:replace, [:subscribe_list]}, conflict_target: [:account] ) end def get_subscribe_list(account) do from(Subscribe, where: [account: ^account]) |> Repo.replica().all(prefix: Utils.prefix(account)) end def delete_subscribe(account) do from(Subscribe, where: [account: ^account]) |> Repo.delete_all(prefix: Utils.prefix(account)) end def start(_, _) do :ok end end