53 lines
1.3 KiB
Elixir
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
|