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