51 lines
1.5 KiB
Ruby
51 lines
1.5 KiB
Ruby
|
|
# frozen_string_literal: true
|
||
|
|
|
||
|
|
class ZohoAuthClient
|
||
|
|
ACCESS_TOKEN_REQUEST_ENDPOINT = "https://accounts.zoho.com/oauth/v2/token"
|
||
|
|
ACCESS_TOKEN_CACHE_KEY = "/v3/zoho_access_token"
|
||
|
|
|
||
|
|
SCOPE = [
|
||
|
|
# - Find and create contacts before submitting tickets
|
||
|
|
# - Create tickets
|
||
|
|
# - Find tickets to justify admin actions
|
||
|
|
"Desk.contacts.CREATE",
|
||
|
|
"Desk.contacts.READ",
|
||
|
|
"Desk.search.READ",
|
||
|
|
"Desk.tickets.CREATE",
|
||
|
|
"Desk.tickets.READ",
|
||
|
|
"Desk.tickets.UPDATE"
|
||
|
|
].join(",").freeze
|
||
|
|
|
||
|
|
def access_token
|
||
|
|
if (cached_token = Rails.cache.read(ACCESS_TOKEN_CACHE_KEY)).present?
|
||
|
|
return cached_token
|
||
|
|
end
|
||
|
|
|
||
|
|
response = HTTParty.post(ACCESS_TOKEN_REQUEST_ENDPOINT, query: access_token_params).parsed_response
|
||
|
|
access_token = response["access_token"]
|
||
|
|
|
||
|
|
if (expires_in = response["expires_in_sec"]).present?
|
||
|
|
# We don't want the token to expire while we're in the middle of a sequence
|
||
|
|
# of requests, so we take the stated expiration time and subtract a little.
|
||
|
|
Rails.cache.write(ACCESS_TOKEN_CACHE_KEY, access_token,
|
||
|
|
expires_in: expires_in - 1.minute)
|
||
|
|
end
|
||
|
|
|
||
|
|
# Return the access token:
|
||
|
|
access_token
|
||
|
|
end
|
||
|
|
|
||
|
|
private
|
||
|
|
|
||
|
|
def access_token_params
|
||
|
|
{
|
||
|
|
client_id: ArchiveConfig.ZOHO_CLIENT_ID,
|
||
|
|
client_secret: ArchiveConfig.ZOHO_CLIENT_SECRET,
|
||
|
|
redirect_uri: ArchiveConfig.ZOHO_REDIRECT_URI,
|
||
|
|
scope: SCOPE,
|
||
|
|
grant_type: "refresh_token",
|
||
|
|
refresh_token: ArchiveConfig.ZOHO_REFRESH_TOKEN
|
||
|
|
}
|
||
|
|
end
|
||
|
|
end
|