fix format
[akkoma] / lib / pleroma / web / oauth / token / strategy / refresh_token.ex
1 defmodule Pleroma.Web.OAuth.Token.Strategy.RefreshToken do
2 @moduledoc """
3 Functions for dealing with refresh token strategy.
4 """
5
6 alias Pleroma.Config
7 alias Pleroma.Repo
8 alias Pleroma.Web.OAuth.Token
9 alias Pleroma.Web.OAuth.Token.Strategy.Revoke
10
11 @doc """
12 Will grant access token by refresh token.
13 """
14 @spec grant(Token.t()) :: {:ok, Token.t()} | {:error, any()}
15 def grant(token) do
16 access_token = Repo.preload(token, [:user, :app])
17
18 result =
19 Repo.transaction(fn ->
20 token_params = %{
21 app: access_token.app,
22 user: access_token.user,
23 scopes: access_token.scopes
24 }
25
26 access_token
27 |> revoke_access_token()
28 |> create_access_token(token_params)
29 end)
30
31 case result do
32 {:ok, {:error, reason}} -> {:error, reason}
33 {:ok, {:ok, token}} -> {:ok, token}
34 {:error, reason} -> {:error, reason}
35 end
36 end
37
38 defp revoke_access_token(token) do
39 Revoke.revoke(token)
40 end
41
42 defp create_access_token({:error, error}, _), do: {:error, error}
43
44 defp create_access_token({:ok, token}, %{app: app, user: user} = token_params) do
45 Token.create_token(app, user, add_refresh_token(token_params, token.refresh_token))
46 end
47
48 defp add_refresh_token(params, token) do
49 case Config.get([:oauth2, :issue_new_refresh_token], false) do
50 true -> Map.put(params, :refresh_token, token)
51 false -> params
52 end
53 end
54 end