caclawphony/elixir/lib/symphony_elixir/tracker/memory.ex
Alex Kotliarskyi fa75ec68c2 🎼
2026-03-04 09:29:11 -08:00

73 lines
1.9 KiB
Elixir

defmodule SymphonyElixir.Tracker.Memory do
@moduledoc """
In-memory tracker adapter used for tests and local development.
"""
@behaviour SymphonyElixir.Tracker
alias SymphonyElixir.Linear.Issue
@spec fetch_candidate_issues() :: {:ok, [Issue.t()]} | {:error, term()}
def fetch_candidate_issues do
{:ok, issue_entries()}
end
@spec fetch_issues_by_states([String.t()]) :: {:ok, [Issue.t()]} | {:error, term()}
def fetch_issues_by_states(state_names) do
normalized_states =
state_names
|> Enum.map(&normalize_state/1)
|> MapSet.new()
{:ok,
Enum.filter(issue_entries(), fn %Issue{state: state} ->
MapSet.member?(normalized_states, normalize_state(state))
end)}
end
@spec fetch_issue_states_by_ids([String.t()]) :: {:ok, [Issue.t()]} | {:error, term()}
def fetch_issue_states_by_ids(issue_ids) do
wanted_ids = MapSet.new(issue_ids)
{:ok,
Enum.filter(issue_entries(), fn %Issue{id: id} ->
MapSet.member?(wanted_ids, id)
end)}
end
@spec create_comment(String.t(), String.t()) :: :ok | {:error, term()}
def create_comment(issue_id, body) do
send_event({:memory_tracker_comment, issue_id, body})
:ok
end
@spec update_issue_state(String.t(), String.t()) :: :ok | {:error, term()}
def update_issue_state(issue_id, state_name) do
send_event({:memory_tracker_state_update, issue_id, state_name})
:ok
end
defp configured_issues do
Application.get_env(:symphony_elixir, :memory_tracker_issues, [])
end
defp issue_entries do
Enum.filter(configured_issues(), &match?(%Issue{}, &1))
end
defp send_event(message) do
case Application.get_env(:symphony_elixir, :memory_tracker_recipient) do
pid when is_pid(pid) -> send(pid, message)
_ -> :ok
end
end
defp normalize_state(state) when is_binary(state) do
state
|> String.trim()
|> String.downcase()
end
defp normalize_state(_state), do: ""
end