Current section

Files

Jump to
google_sheets lib google_sheets.ex
Raw

lib/google_sheets.ex

defmodule GoogleSheets do
use Application
require Logger
@moduledoc """
Main starting point of the application and provides functions defining the public client API for the library.
"""
@doc false
def start(_type, _args) do
GoogleSheets.Supervisor.start_link
end
#
# Public client API
#
@doc ~S"""
Returns true, if there is an version for for the given spreadsheet_id stored, false otherwise.
"""
def has_version?(spreadsheet_id) when is_atom(spreadsheet_id) do
case :ets.lookup :google_sheets, {spreadsheet_id, :latest} do
[] -> false
_ -> true
end
end
@doc ~S"""
Returns {:ok, version_key, data} where version_key and data are the latest ones found.
If no entry is found, :not_found is returned.
"""
def latest(spreadsheet_id) when is_atom(spreadsheet_id) do
case latest_key spreadsheet_id do
:not_found ->
:not_found
{:ok, version_key} ->
case fetch version_key do
:not_found ->
Logger.error "No data found for spreadsheet_id #{inspect spreadsheet_id} version #{inspect version_key}"
:not_found
{:ok, data} ->
{:ok, version_key, data}
end
end
end
@doc ~S"""
Returns {version_key, data} for the latest one stored in ETS table.
If no entry is found, an KeyError exception is raised.
"""
def latest!(spreadsheet_id) when is_atom(spreadsheet_id) do
case latest spreadsheet_id do
{:ok, version_key, data} -> {version_key, data}
:not_found -> raise KeyError, key: spreadsheet_id
end
end
@doc ~S"""
Returns {:ok, data} where data is the latest one found.
If no entry is found, :not_found is returned.
"""
def latest_data(spreadsheet_id) when is_atom(spreadsheet_id) do
case latest spreadsheet_id do
{:ok, _version_key, data} -> {:ok, data}
:not_found -> :not_found
end
end
@doc ~S"""
Returns data where data is the latest one found.
If no entry is found, an KeyError exception is raised.
"""
def latest_data!(spreadsheet_id) when is_atom(spreadsheet_id) do
case latest_data(spreadsheet_id) do
{:ok, data} -> data
:not_found -> raise KeyError, key: spreadsheet_id
end
end
@doc ~S"""
Returns {:ok, version_key} where version_key is the one for latest version stored in ETS table.
If no entry is found, :not_found is returned.
"""
def latest_key(spreadsheet_id) when is_atom(spreadsheet_id) do
case :ets.lookup :google_sheets, {spreadsheet_id, :latest} do
[] ->
Logger.error "No version key found for spreadsheet_id #{inspect spreadsheet_id}"
:not_found
[{{^spreadsheet_id, :latest}, key}] -> {:ok, key}
end
end
@doc ~S"""
Returns version_key where version_key is the one for latest version stored in ETS table.
If no entry is found, an KeyError exception is raised.
"""
def latest_key!(spreadsheet_id) when is_atom(spreadsheet_id) do
case latest_key spreadsheet_id do
:not_found -> raise KeyError, key: spreadsheet_id
{:ok, key} -> key
end
end
@doc ~S"""
Returns {:ok, version_key, data} tuple matching an entry in ETS table for the passed spreadsheet_id, version_key pair.
If no version_key is given, the latest stored version is returned.
If no entry is found, :not_found is returned.
"""
def fetch(version_key) do
case :ets.lookup :google_sheets, version_key do
[] -> :not_found
[{^version_key, data}] -> {:ok, data}
end
end
@doc ~S"""
Returns data stored for the given version_key. If no entry is found, an KeyError exception is raised.
"""
def fetch!(version_key) do
case fetch version_key do
:not_found -> raise KeyError, key: version_key
{:ok, data} -> data
end
end
@doc ~S"""
Requests the updater process monitoring the given spreadsheet to check for changes immediately.
Return values:
{:updated, version_key} - Spreadsheet was updated and stored with the version_key
:unchanged - Spreadsheet contents haven't been changed since last update.
{:error, reason} - The update failed because of reason.
"""
def update(spreadsheet_id, timeout \\ 60_000) do
GoogleSheets.Updater.update spreadsheet_id, timeout
end
end