lib/unsplash/connection.rb in unsplash-1.4.3 vs lib/unsplash/connection.rb in unsplash-1.5.0

- old
+ new

@@ -20,12 +20,12 @@ def initialize(version: DEFAULT_VERSION, api_base_uri: DEFAULT_API_BASE_URI, oauth_base_uri: DEFAULT_OAUTH_BASE_URI) @application_id = Unsplash.configuration.application_id @application_secret = Unsplash.configuration.application_secret @api_version = version @api_base_uri = api_base_uri - - oauth_base_uri = oauth_base_uri + + oauth_base_uri = oauth_base_uri @oauth = ::OAuth2::Client.new(@application_id, @application_secret, site: oauth_base_uri) do |http| http.request :multipart http.request :url_encoded http.adapter :net_http end @@ -47,10 +47,28 @@ def authorize!(auth_code) @oauth_token = @oauth.auth_code.get_token(auth_code, redirect_uri: Unsplash.configuration.application_redirect_uri) # TODO check if it succeeded end + # Extract hash with OAuth token attributes. Extracted token attributes can + # be used with create_and_assign_token to prevent the need for + # reauthorization. + # @return [Hash, nil] @oauth_token converted to a hash. + def extract_token + @oauth_token.to_hash if @oauth_token + end + + # Create and assign new access token from extracted token. To be used with + # extract_token to reauthorize app without api call. + # @param token_extract [Hash] OAuth token hash from #extract_token. + # @return [OAuth2::AccessToken, nil] New access token object. + def create_and_assign_token(token_extract) + unless token_extract.nil? + @oauth_token = OAuth2::AccessToken.from_hash(@oauth, token_extract) + end + end + # Perform a GET request. # @param path [String] The path at which to make ther request. # @param params [Hash] A hash of request parameters. def get(path, params = {}) request :get, path, params @@ -80,21 +98,27 @@ private def request(verb, path, params = {}) raise ArgumentError.new "Invalid http verb #{verb}" if ![:get, :post, :put, :delete].include?(verb) + params.merge!(utm_params) + + if !Unsplash.configuration.utm_source + url = "https://community.unsplash.com/developersblog/unsplash-api-guidelines" + Unsplash.configuration.logger.warn "utm_source is required as part of API Terms: #{url}" + end + headers = { "Accept-Version" => @api_version # Anything else? User agent? } response = if @oauth_token refresh_token! param_key = verb == :post ? :body : :params @oauth_token.public_send(verb, @api_base_uri + path, param_key => params, headers: headers) - else self.class.public_send verb, path, query: params, headers: public_auth_header end if response.headers["Warning"] @@ -114,13 +138,20 @@ def public_auth_header { "Authorization" => "Client-ID #{@application_id}" } end + def utm_params + { + utm_source: Unsplash.configuration.utm_source || "api_app", + utm_medium: "referral", + utm_campaign: "api-credit" + } + end + def refresh_token! return if !@oauth_token.expired? @oauth_token = @oauth_token.refresh_token end end - end