lib/smart_city/user_access_group_relation.ex

defmodule SmartCity.UserAccessGroupRelation do
  @moduledoc """
  Defines a user access group relation.
  """
  alias SmartCity.BaseStruct

  @type subject_id :: String.t()
  @type access_group_id :: SmartCity.AccessGroup.id()
  @type t :: %SmartCity.UserAccessGroupRelation{
          :subject_id => subject_id(),
          :access_group_id => access_group_id()
        }

  @derive Jason.Encoder
  defstruct subject_id: nil,
            access_group_id: nil

  @doc """
  Instantiates an instance of a user access group relation event struct.
  """
  @spec new(String.t() | map()) :: {:ok, map()} | {:error, String.t()}
  def new(msg) do
    BaseStruct.new(msg)
    |> create()
  end

  defp create(%{subject_id: _, access_group_id: _} = msg) do
    user_access_group_relation = struct(%__MODULE__{}, msg)

    {:ok, user_access_group_relation}
  end

  defp create(msg) do
    {:error, "Invalid user:access_group:relation: #{inspect(msg)}"}
  end
end