require 'googleauth' require 'google/apis/calendar_v3' class GoogleCalendar def initialize(config, logger) @config = config if @config['google']['key'].present? # https://github.com/google/google-auth-library-ruby/issues/65 # https://github.com/google/google-api-ruby-client/issues/370 ENV['GOOGLE_PRIVATE_KEY'] = @config['google']['key'] ENV['GOOGLE_CLIENT_EMAIL'] = @config['google']['service_account_email'] ENV['GOOGLE_ACCOUNT_TYPE'] = 'service_account' elsif @config['google']['key_file'].present? ENV['GOOGLE_APPLICATION_CREDENTIALS'] = @config['google']['key_file'] end @logger ||= logger # https://github.com/google/google-api-ruby-client/blob/master/MIGRATING.md @calendar = Google::Apis::CalendarV3::CalendarService.new # https://developers.google.com/api-client-library/ruby/auth/service-accounts # https://developers.google.com/identity/protocols/application-default-credentials scopes = [Google::Apis::CalendarV3::AUTH_CALENDAR] @authorization = Google::Auth.get_application_default(scopes) @logger.info("Setup") @logger.debug @calendar.inspect end def self.open(*args, &block) instance = new(*args) block.call(instance) ensure instance.cleanup! end def auth_as @authorization.fetch_access_token! @calendar.authorization = @authorization end # who - String: email of user to add event # details - JSON String: see https://developers.google.com/google-apps/calendar/v3/reference/events/insert def publish_as(who, details) auth_as @logger.info("Attempting to create event for " + who) @logger.debug details.to_yaml event = Google::Apis::CalendarV3::Event.new(details.deep_symbolize_keys) ret = @calendar.insert_event( who, event, send_notifications: true ) @logger.debug ret.to_yaml ret.to_h end def events_as(who, date) auth_as date ||= Date.today @logger.info("Attempting to receive events for "+who) @logger.debug details.to_yaml ret = @calendar.list_events( who ) @logger.debug ret.to_yaml ret.to_h end def cleanup! ENV.delete('GOOGLE_PRIVATE_KEY') ENV.delete('GOOGLE_CLIENT_EMAIL') ENV.delete('GOOGLE_ACCOUNT_TYPE') ENV.delete('GOOGLE_APPLICATION_CREDENTIALS') end end