defmodule Glific.Conversations.Conversation do @moduledoc """ The Glific Abstraction to represent the conversation with a user. This unifies a vast majority of the glific data types including: message, contact, and tag """ alias __MODULE__ use Ecto.Schema alias Glific.{ Contacts.Contact, Groups.Group, Messages.Message } @type t() :: %__MODULE__{ contact: Contact.t(), messages: [Message.t()] } # structure to hold a contact and the conversations with the contact # the messages should be in descending order, i.e. most recent ones first embedded_schema do embeds_one(:contact, Contact) embeds_one(:group, Group) embeds_many(:messages, Message) end @doc """ Create a new conversation. A contact or a group is required for the conversation. Messages can be added later on """ @spec new(Contact.t() | nil, Group.t() | nil, [Message.t()]) :: Conversation.t() def new(contact, group, messages \\ []) do %Conversation{contact: contact, group: group, messages: messages} end end