GoogleCalendar
Wrapper for google calendar API
Installation
The package can be installed by adding google_calendar
to your list of dependencies in mix.exs
:
def deps do
[{:google_calendar, "~> 0.1.0"}]
end
The docs can be found at https://hexdocs.pm/google_calendar.
Google Calendar API
Interact with Google CalendarList
, Calendar
and Event
Main function includes get list
, get instance
, insert
, update
, and delete
To access the authorize url, use redirect conn, external: Google.authorize_url!()
To retrieve token, define route and callback uri in google oauth redirect uri /auth/callback
Configuration
Add the following configuration in your *.exs
config :google_calendar, :base_url, "https://www.googleapis.com/calendar/v3"
config :google_calendar, :content_type, [{"content-type", "application/json"}]
config :google_calendar, Google,
client_id: GOOGLE_CLIENT_ID,
client_secret: GOOGLE_CLIENT_SECRET,
redirect_uri: "https://your_site.com/auth/callback"
Auth_controller
# To retrieve authorize_url, call function
Google.authorize_url!()
# Call back function
def callback(conn, %{"code" => code}) do
# Exchange an auth code for an access token
client = Google.get_token!(code: code)
# You might want to put access_token in session for latter use and redirect url
conn
|> put_session(:token, client.token)
|> redirect(to: "/")
end
# To recreate client
token = get_session(conn, :token)
client = Map.merge(Google.client(), %{token: token})
# To refresh token, save your refresh token in database
token = get_session(conn, :token)
if OAuth2.AccessToken.expired?(token) do
token = Map.merge(token, %{refresh_token: REFRESH_TOKEN})
Google.client()
|> Map.merge(%{token: token})
|> OAuth2.Client.refresh_token!()
end
Interact with google events
Check list of optons in https://developers.google.com/google-apps/calendar/v3/reference/events
# Access client which contains token from session if you have put it into session previously
client = get_session(conn, "client")
# Config your event variable. Event is [`Map`](https://hexdocs.pm/elixir/Map.html)/ `Nested Map` type
event = %{calendar_id: "YOUR CALENDAR ID", id: "YOUR EVENT ID"}
# Additional event information are included in event if you want to insert, update, or path
event = %{
calendar_id: "YOUR CALENDAR ID",
id: "YOUR EVENT ID",
start: %{
date_time: "2017-08-20T05:20:00Z",
timezone: "UTC"
}
}
# Add query parameter to opts.Opts is [`Keyword`](https://hexdocs.pm/elixir/Keyword.html) type
opts = [params: [maxResults: 5]]
GoogleCalendar.Event.get(client, event, opts)
# Return result will be either `{:ok, action, result}` or `{:error, code, error_message}`
Interact with google calendars
Differences between Calendar
and CalendarList
:
Calendar contains calendar specific data (such as timezone, name). You should call insert on Calendar
when creating a new calendar
CalendarList is a collection of all calendar entries and contain more general information of each calendar, which shows distinction among them such as color, access roles.
When you create a new calendar through calendars collection, it will be automatically added to your list
Check list of options in https://developers.google.com/google-apps/calendar/v3/reference/calendars
# Access client which contains token from session if you have put it into session previously
client = get_session(conn, "client")
# Config your calenar variable. Calendar is [`Map`](https://hexdocs.pm/elixir/Map.html)/ `Nested Map` type
calendar = %{id: "YOUR CALENDAR ID"}
# Additional calendar information are included in event if you want to insert, update, or path
calendar = %{
id: "YOUR CALENDAR ID",
defaultReminders: %{
method: "YOUR METHOD"
}
}