defmodule Frenzy.Feed do use Ecto.Schema import Ecto.Changeset alias FrenzyWeb.Router.Helpers, as: Routes alias FrenzyWeb.Endpoint def to_fever(feed) do %{ id: feed.id, favicon_id: feed.id, title: feed.title, url: feed.feed_url, site_url: feed.site_url, last_updated_on_time: if(is_nil(feed.last_updated), do: 0, else: Timex.to_unix(feed.last_updated)), is_spark: false } end def to_fervor(feed) do %{ id: feed.id |> Integer.to_string(), title: feed.title, url: feed.site_url, feed_url: feed.feed_url, service_url: Application.get_env(:frenzy, :base_url) <> Routes.feed_path(Endpoint, :show, feed.id), last_updated: DateTime.to_iso8601(feed.last_updated), group_ids: [feed.group_id |> Integer.to_string()] } end schema "feeds" do field :feed_url, :string field :last_updated, :utc_datetime field :site_url, :string field :title, :string field :favicon, :string field :favicon_url, :string field :last_refreshed_at, :utc_datetime field :refresh_frequency, :integer, default: 30 belongs_to :group, Frenzy.Group belongs_to :pipeline, Frenzy.Pipeline has_many :items, Frenzy.Item, on_delete: :delete_all timestamps() end @type t() :: %__MODULE__{ __meta__: Ecto.Schema.Metadata.t(), id: integer() | nil, feed_url: String.t(), last_updated: DateTime.t() | nil, site_url: String.t() | nil, title: String.t() | nil, favicon: String.t() | nil, favicon_url: String.t() | nil, last_refreshed_at: DateTime.t() | nil, refresh_frequency: integer(), group: Frenzy.Group.t() | Ecto.Association.NotLoaded.t(), pipeline: Frenzy.Pipeline.t() | nil | Ecto.Association.NotLoaded.t(), items: [Frenzy.Item.t()] | Ecto.Association.NotLoaded.t(), inserted_at: NaiveDateTime.t(), updated_at: NaiveDateTime.t() } @doc false def changeset(feed, attrs) do feed |> cast(attrs, [ :title, :feed_url, :site_url, :last_updated, :pipeline_id, :favicon, :favicon_url, :last_refreshed_at, :refresh_frequency ]) |> validate_required([:feed_url]) |> validate_inclusion(:refresh_frequency, [30 * 60, 60 * 60, 6 * 60 * 60, 24 * 60 * 60]) end end