defmodule Glific.Tags.MessageTag do
@moduledoc """
A file for managing the join table message tags
"""
alias __MODULE__
alias Glific.{
Messages.Message,
Partners.Organization,
Tags.Tag
}
use Ecto.Schema
import Ecto.Changeset
@required_fields [:message_id, :tag_id, :organization_id]
@optional_fields [:value]
@type t() :: %__MODULE__{
__meta__: Ecto.Schema.Metadata.t(),
id: non_neg_integer | nil,
value: String.t() | nil,
message: Message.t() | Ecto.Association.NotLoaded.t() | nil,
tag: Tag.t() | Ecto.Association.NotLoaded.t() | nil,
organization_id: non_neg_integer | nil,
organization: Organization.t() | Ecto.Association.NotLoaded.t() | nil
}
schema "messages_tags" do
field :value, :string, default: nil
belongs_to :message, Message
belongs_to :tag, Tag
belongs_to :organization, Organization
end
@doc """
Standard changeset pattern we use for all data types
"""
@spec changeset(MessageTag.t(), map()) :: Ecto.Changeset.t()
def changeset(message, attrs) do
message
|> cast(attrs, @required_fields ++ @optional_fields)
|> validate_required(@required_fields)
|> unique_constraint([:message_id, :tag_id])
|> foreign_key_constraint(:message_id)
|> foreign_key_constraint(:tag_id)
end
end