defmodule Core.Posts do @moduledoc false alias Core.Posts.Post def get!(id) do Core.Repo.get!(Schema.Post, id) end def get_published_blog!(%Date{} = publish_date, slug) when is_binary(slug) do Post.Query.published() |> Post.Query.where_publish_date_and_slug(publish_date, slug) |> Core.Repo.one!() end def get_published_status!(id) do Post.Query.published() |> Post.Query.where_kind(:status) |> Core.Repo.get!(id) end @recent_posts_count 10 def get_all_recent_blogs do Post.Query.recent_blogs(@recent_posts_count) |> Core.Repo.all() end def get_all_recent_statuses do Post.Query.recent_statuses(@recent_posts_count) |> Core.Repo.all() end def get_published_recent_posts(kind) do Post.Query.recent_posts(kind, @recent_posts_count) |> Post.Query.published() |> Core.Repo.all() end def publish_date(%Schema.Post{published_at: nil}), do: nil def publish_date(%Schema.Post{published_at: published_at}) do published_at |> DateTime.shift_zone!("America/New_York") |> DateTime.to_date() end def change_post(%Schema.Post{} = post \\ %Schema.Post{}, attrs) do Post.content_changeset(post, attrs) end def create_post(attrs) do attrs |> change_post() |> Core.Repo.insert() end def update_post(%Schema.Post{} = post, attrs) do post |> change_post(attrs) |> Core.Repo.update() end def create_or_update_post(%Schema.Post{} = post, attrs) do post |> change_post(attrs) |> Core.Repo.insert_or_update() end def publish_post(%Schema.Post{} = post, published_at \\ DateTime.utc_now()) do post |> Post.publish_changeset(published_at) |> Core.Repo.update() end def delete_post(%Schema.Post{} = post, deleted_at \\ DateTime.utc_now()) do post |> Post.delete_changeset(deleted_at) |> Core.Repo.update() end def unpublish_post(%Schema.Post{} = post) do post |> Post.unpublish_changeset() |> Core.Repo.update() end def undelete_post(%Schema.Post{} = post) do post |> Post.undelete_changeset() |> Core.Repo.update() end end