defmodule Core.Syndication.BlueskyClient do @middleware [ Tesla.Middleware.Logger, {Tesla.Middleware.BaseUrl, "https://bsky.social/xrpc"}, Tesla.Middleware.JSON ] def new(opts \\ []) do middleware = @middleware middleware = case Keyword.fetch(opts, :token) do {:ok, token} -> middleware ++ [{Tesla.Middleware.BearerAuth, token: token}] :error -> middleware end Tesla.client(middleware) end def create_session(identifier, password) do client = new() Tesla.post(client, "/com.atproto.server.createSession", %{ identifier: identifier, password: password }) end def refresh_session(%Schema.BlueskyAccount{refresh_jwt: token}) do client = new(token: token) Tesla.post(client, "/com.atproto.server.refreshSession", nil) end def post_status(%Schema.BlueskyAccount{} = bluesky_account, text) do client = new(token: bluesky_account.access_jwt) Tesla.post(client, "/com.atproto.repo.createRecord", %{ repo: bluesky_account.did, collection: "app.bsky.feed.post", record: %{ text: text, createdAt: DateTime.utc_now() |> DateTime.to_iso8601() } }) end end