module Sinatra::Shopify::Methods

Public Instance Methods

after_shopify_auth() click to toggle source

designed to be overridden

# File lib/sinatra/shopify-sinatra-app.rb, line 15
def after_shopify_auth
end
shopify_session() { |shop_name| ... } click to toggle source
# File lib/sinatra/shopify-sinatra-app.rb, line 18
def shopify_session(&blk)
  return_to = request.path
  return_params = request.params

  if no_session?
    authenticate(return_to, return_params)

  elsif different_shop?
    clear_session
    authenticate(return_to, return_params)

  else
    shop_name = session[:shopify][:shop]
    token = session[:shopify][:token]
    activate_shopify_api(shop_name, token)
    yield shop_name
  end

rescue ActiveResource::UnauthorizedAccess
  clear_session

  if shop = Shop.find_by(name: shop_name)
    shop.token = nil
    shop.save
  end

  redirect request.path
end

Private Instance Methods

activate_shopify_api(shop_name, token) click to toggle source
# File lib/sinatra/shopify-sinatra-app.rb, line 77
def activate_shopify_api(shop_name, token)
  api_session = ShopifyAPI::Session.new(domain: shop_name, token: token, api_version: settings.api_version)
  ShopifyAPI::Base.activate_session(api_session)
end
authenticate(return_to = '/', return_params = nil) click to toggle source
# File lib/sinatra/shopify-sinatra-app.rb, line 49
def authenticate(return_to = '/', return_params = nil)
  session[:return_params] = return_params if return_params

  if shop_name = sanitized_shop_param(params)
    redirect "/login?shop=#{shop_name}"
  else
    redirect '/login'
  end
end
base_url() click to toggle source
# File lib/sinatra/shopify-sinatra-app.rb, line 59
def base_url
  request_protocol = request.secure? ? 'https' : 'http'
  "#{request_protocol}://#{request.env['HTTP_HOST']}"
end
clear_session() click to toggle source
# File lib/sinatra/shopify-sinatra-app.rb, line 72
def clear_session
  session.delete(:shopify)
  session.clear
end
different_shop?() click to toggle source
# File lib/sinatra/shopify-sinatra-app.rb, line 68
def different_shop?
  params[:shop].present? && session[:shopify][:shop] != sanitized_shop_param(params)
end
no_session?() click to toggle source
# File lib/sinatra/shopify-sinatra-app.rb, line 64
def no_session?
  !session.key?(:shopify)
end
receive_webhook() { |shop_name, webhook_body| ... } click to toggle source
# File lib/sinatra/shopify-sinatra-app.rb, line 82
def receive_webhook(&blk)
  return unless verify_shopify_webhook
  shop_name = request.env['HTTP_X_SHOPIFY_SHOP_DOMAIN']
  webhook_body = ActiveSupport::JSON.decode(request.body.read.to_s)
  yield shop_name, webhook_body
  status 200
end
sanitized_shop_param(params) click to toggle source
# File lib/sinatra/shopify-sinatra-app.rb, line 90
def sanitized_shop_param(params)
  return unless params[:shop].present?
  name = params[:shop].to_s.strip
  name += '.myshopify.com' if !name.include?('myshopify.com') && !name.include?('.')
  name.gsub!('https://', '')
  name.gsub!('http://', '')

  u = URI("http://#{name}")
  u.host.ends_with?('.myshopify.com') ? u.host : nil
end
verify_shopify_webhook() click to toggle source
# File lib/sinatra/shopify-sinatra-app.rb, line 101
def verify_shopify_webhook
  data = request.body.read.to_s
  digest = OpenSSL::Digest.new('sha256')
  calculated_hmac = Base64.encode64(OpenSSL::HMAC.digest(digest, settings.shared_secret, data)).strip
  request.body.rewind

  if calculated_hmac == request.env['HTTP_X_SHOPIFY_HMAC_SHA256']
    true
  else
    puts 'Shopify Webhook verification failed!'
    false
  end
end