defmodule BlueskyEx.Client.Session do @moduledoc """ A struct representing a Bluesky session. """ alias BlueskyEx.Client.{Credentials, RequestUtils} alias HTTPoison @type t :: %__MODULE__{ pds: String.t(), access_token: String.t(), refresh_token: String.t(), did: String.t() } defstruct [:pds, :access_token, :refresh_token, :did] @spec create(Credentials.t(), String.t()) :: BlueskyEx.Client.Session.t() def create(%Credentials{username: identifier, password: password}, pds) do body = Jason.encode!(%{identifier: identifier, password: password}) uri = RequestUtils.URI.create_session(pds) response = RequestUtils.make_request(uri, body: body) %{"did" => did, "accessJwt" => access_token, "refreshJwt" => refresh_token} = Jason.decode!(response.body) %__MODULE__{ pds: pds, access_token: access_token, refresh_token: refresh_token, did: did } end end