sloanelybutsurely.com/lib/core/posts.ex
2025-05-09 16:08:35 -04:00

144 lines
3.2 KiB
Elixir

defmodule Core.Posts do
@moduledoc false
alias Core.Syndication
alias Core.Posts.Post
def get!(id) do
Post.Query.base()
|> Core.Repo.get!(id)
end
def get(id) do
Post.Query.base()
|> Core.Repo.get(id)
end
def get_published_post(id) do
Post.Query.published()
|> Core.Repo.get(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, count \\ @recent_posts_count) do
Post.Query.recent_posts(kind, count)
|> Post.Query.published()
|> Core.Repo.all()
end
def list_posts(kind, params \\ %{}) do
Post.Query.base()
|> Post.Query.where_kind(kind)
|> Flop.validate_and_run(params, for: Schema.Post)
end
def list_published_posts(kind, params \\ %{}) do
Post.Query.base()
|> Post.Query.published()
|> Post.Query.where_kind(kind)
|> Flop.validate_and_run(params, for: Schema.Post)
end
def publish_date_time(%Schema.Post{published_at: nil}), do: nil
def publish_date_time(%Schema.Post{published_at: published_at}) do
Core.DateTime.to_local_time(published_at)
end
def publish_date(%Schema.Post{} = post) do
post
|> publish_date_time()
|> 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()
|> do_syndication()
end
def update_post(%Schema.Post{} = post, attrs) do
post
|> change_post(attrs)
|> Core.Repo.update()
|> do_syndication()
end
def create_or_update_post(%Schema.Post{} = post, attrs) do
post
|> change_post(attrs)
|> Core.Repo.insert_or_update()
|> do_syndication()
end
def publish_post(%Schema.Post{} = post, published_at \\ DateTime.utc_now()) do
post
|> Post.publish_changeset(published_at)
|> Core.Repo.update()
|> do_syndication()
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()
|> do_syndication()
end
def undelete_post(%Schema.Post{} = post) do
post
|> Post.undelete_changeset()
|> Core.Repo.update()
|> do_syndication()
end
defp do_syndication(%Schema.Post{} = post) do
%{"post_id" => post.id}
|> Syndication.SyndicatePostWorker.new()
|> Oban.insert()
post
end
defp do_syndication({:ok, %Schema.Post{} = post}) do
do_syndication(post)
{:ok, post}
end
defp do_syndication(other), do: other
end