| defmodule Plausible.CustomerSupport.Resource do | |
| @moduledoc """ | |
| Generic behaviour for CS resources | |
| """ | |
| defstruct [:id, :type, :module, :object, :path] | |
| @type schema() :: map() | |
| @type t() :: %__MODULE__{ | |
| id: pos_integer(), | |
| module: atom(), | |
| object: schema(), | |
| type: String.t() | |
| } | |
| @callback search(String.t(), Keyword.t()) :: list(schema()) | |
| @callback get(pos_integer()) :: schema() | |
| @callback path(any()) :: String.t() | |
| @callback dump(schema()) :: t() | |
| defmacro __using__(type: type) do | |
| quote do | |
| @behaviour Plausible.CustomerSupport.Resource | |
| alias Plausible.CustomerSupport.Resource | |
| alias PlausibleWeb.Router.Helpers, as: Routes | |
| import Ecto.Query | |
| alias Plausible.Repo | |
| @impl true | |
| def dump(schema) do | |
| new(__MODULE__, schema) | |
| end | |
| defoverridable dump: 1 | |
| def new(module, schema) do | |
| %Resource{ | |
| id: schema.id, | |
| type: unquote(type), | |
| path: module.path(schema.id), | |
| module: module, | |
| object: schema | |
| } | |
| end | |
| end | |
| end | |
| end | |