defmodule ToweropsWeb.ScopedResource do @moduledoc """ Shared helpers for loading organization-scoped resources. """ alias Towerops.Repo @spec fetch(module(), Ecto.UUID.t(), Ecto.UUID.t()) :: {:ok, struct()} | {:error, :not_found | :forbidden} def fetch(schema, id, organization_id) do case Repo.get(schema, id) do nil -> {:error, :not_found} %{organization_id: ^organization_id} = resource -> {:ok, resource} %{organization_id: _other_org_id} -> {:error, :forbidden} end end @spec fetch_preload(module(), Ecto.UUID.t(), Ecto.UUID.t(), atom() | list() | keyword()) :: {:ok, struct()} | {:error, :not_found | :forbidden} def fetch_preload(schema, id, organization_id, preloads) do with {:ok, resource} <- fetch(schema, id, organization_id) do {:ok, Repo.preload(resource, preloads)} end end end