sloanelybutsurely.com/lib/core/syndication.ex

53 lines
1.3 KiB
Elixir

defmodule Core.Syndication do
alias __MODULE__
@mastodon_instance Application.compile_env!(:sloanely_but_surely, [
Core.Syndication,
:mastodon_instance
])
def get_mastodon_account(user) do
Core.Repo.get_by(Schema.MastodonAccount, user_id: user.id)
end
def save_mastodon_account(user, attrs) do
user
|> Ecto.build_assoc(:mastodon_account)
|> Syndication.MastodonAccount.changeset(attrs)
|> Core.Repo.insert()
end
def syndicate_to_mastodon(%Schema.Post{} = post) do
post = Core.Repo.preload(post, [:mastodon_post])
if post.syndicate_to_mastodon and is_nil(post.mastodon_post) do
conn = build_mastodon_client_conn()
{:ok, resp} = MastodonClient.post(conn, "/api/v1/statuses", %{status: post.body})
post
|> Ecto.build_assoc(:mastodon_post)
|> Syndication.MastodonPost.changeset(%{
status_id: resp.body["id"],
url: resp.body["url"]
})
|> Core.Repo.insert()
post
else
post
end
end
defp get_mastodon_access_token do
mastodon_account = Core.Repo.one!(Schema.MastodonAccount)
mastodon_account.access_token
end
defp build_mastodon_client_conn do
%MastodonClient.Conn{
instance: @mastodon_instance,
access_token: get_mastodon_access_token()
}
end
end