Skip to content

Commit

Permalink
refresh raindrop token when it is expired
Browse files Browse the repository at this point in the history
  • Loading branch information
electronicbites committed Nov 10, 2024
1 parent cd1645f commit 40a0147
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 31 deletions.
80 changes: 80 additions & 0 deletions lib/radiator/accounts/raindrop_client.ex
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ defmodule Radiator.Accounts.RaindropClient do
@moduledoc """
Client for Raindrop API
"""
require Logger

alias Radiator.Accounts

def config, do: Application.fetch_env!(:radiator, :raindrop)
Expand Down Expand Up @@ -44,6 +46,7 @@ defmodule Radiator.Accounts.RaindropClient do
service =
user_id
|> Accounts.get_raindrop_tokens()
|> refresh_token_if()

if is_nil(service) do
{:error, :unauthorized}
Expand All @@ -60,6 +63,83 @@ defmodule Radiator.Accounts.RaindropClient do
end
end

@doc """
first time fetching access token and storing it as webservice entry
"""
def init_and_store_access_token(user_id, code) do
{:ok, response} =
[
method: :post,
url: "https://raindrop.io/oauth/access_token",
json: %{
client_id: config()[:client_id],
client_secret: config()[:client_secret],
grant_type: "authorization_code",
code: code,
redirect_uri: redirect_uri()
}
]
|> Keyword.merge(config()[:options])
|> Req.request()

Logger.error("Response from raindrop: #{inspect(response)}")

parse_access_token_response(response, user_id)
end

defp refresh_token_if(service) do
if DateTime.before?(service.data.expires_at, DateTime.utc_now()) do
{:ok, response} =
[
method: :post,
url: "https://raindrop.io/oauth/access_token",
headers: [
{"Content-Type", "application/json"}
],
json: %{
client_id: config()[:client_id],
client_secret: config()[:client_secret],
grant_type: "refresh_token",
refresh_token: refresh_token
}
]
|> Req.request()

parse_access_token_response(response, user_id)
else
service
end
end

defp parse_access_token_response(
{:ok,
%Req.Response{
body: %{
"access_token" => access_token,
"refresh_token" => refresh_token,
"expires_in" => expires_in
}
}},
user_id
) do
expires_at =
DateTime.now!("Etc/UTC")
|> DateTime.shift(second: response.body["expires_in"])
|> DateTime.truncate(:second)

Accounts.update_raindrop_tokens(
user_id,
response.body["access_token"],
response.body["refresh_token"],
expires_at
)
end

defp parse_access_token_response(response_tuple, _user_id) do
Logger.error("Error fetching access token: #{inspect(response_tuple)}")
{:error, :unauthorized}
end

defp parse_collection_response({:ok, %Req.Response{status: 401}}) do
{:error, :unauthorized}
end
Expand Down
32 changes: 1 addition & 31 deletions lib/radiator_web/controllers/api/raindrop_controller.ex
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
defmodule RadiatorWeb.Api.RaindropController do
use RadiatorWeb, :controller

alias Radiator.Accounts
alias Radiator.Accounts.RaindropClient
require Logger

Expand All @@ -10,36 +9,7 @@ defmodule RadiatorWeb.Api.RaindropController do
"Raindrop auth redirect code: #{code}, redirect_uri: #{RaindropClient.redirect_uri()}"
)

{:ok, response} =
[
method: :post,
url: "https://raindrop.io/oauth/access_token",
json: %{
client_id: RaindropClient.config()[:client_id],
client_secret: RaindropClient.config()[:client_secret],
grant_type: "authorization_code",
code: code,
redirect_uri: RaindropClient.redirect_uri()
}
]
|> Keyword.merge(RaindropClient.config()[:options])
|> Req.request()

Logger.error("Response from raindrop: #{inspect(response)}")

if response.body != "Unauthorized" && !is_nil(response.body["access_token"]) do
expires_at =
DateTime.now!("Etc/UTC")
|> DateTime.shift(second: response.body["expires_in"])
|> DateTime.truncate(:second)

Accounts.update_raindrop_tokens(
user_id,
response.body["access_token"],
response.body["refresh_token"],
expires_at
)
end
RaindropClient.init_and_store_access_token(user_id, code)

conn
|> put_resp_content_type("application/json")
Expand Down

0 comments on commit 40a0147

Please sign in to comment.