module Sinatra::Shopify

Public Class Methods

registered(app) click to toggle source
# File lib/sinatra/shopify-sinatra-app.rb, line 157
def self.registered(app)
  app.helpers Shopify::Methods
  app.register Sinatra::ActiveRecordExtension

  app.set :database_file, File.expand_path('config/database.yml')
  app.set :views, File.expand_path('views')
  app.set :public_folder, File.expand_path('public')
  app.set :erb, layout: :'layouts/application'
  app.set :protection, except: :frame_options

  app.enable :sessions
  app.enable :inline_templates

  app.set :scope, 'read_products, read_orders'

  app.set :api_key, ENV['SHOPIFY_API_KEY']
  app.set :shared_secret, ENV['SHOPIFY_SHARED_SECRET']
  app.set :secret, ENV['SECRET']

  app.use Rack::Flash, sweep: true
  app.use Rack::MethodOverride
  app.use Rack::Session::Cookie, key: 'rack.session',
                                 path: '/',
                                 secret: app.settings.secret,
                                 expire_after: 60 * 30 # half an hour in seconds

  app.use OmniAuth::Builder do
    provider :shopify,
             app.settings.api_key,
             app.settings.shared_secret,

             scope: app.settings.scope,

             setup: lambda { |env|
               params = Rack::Utils.parse_query(env['QUERY_STRING'])
               site_url = "https://#{params['shop']}"
               env['omniauth.strategy'].options[:client_options][:site] = site_url
             }
  end

  ShopifyAPI::Session.setup(
    api_key: app.settings.api_key,
    secret: app.settings.shared_secret
  )

  app.get '/install' do
    if params[:shop].present?
      authenticate
    else
      erb :install, layout: false
    end
  end

  app.post '/login' do
    authenticate
  end

  app.get '/logout' do
    logout
    redirect '/install'
  end

  app.get '/auth/shopify/callback' do
    shop_name = params['shop']
    token = request.env['omniauth.auth']['credentials']['token']

    shop = Shop.find_or_initialize_by(name: shop_name)
    shop.token = token
    shop.save!

    session[:shopify] = {
      shop: shop_name,
      token: token
    }

    after_shopify_auth()

    return_to = env['omniauth.params']['return_to']
    return_params = session[:return_params]
    session.delete(:return_params)

    return_to += "?#{return_params.to_query}" if return_params.present?

    redirect return_to
  end

  app.get '/auth/failure' do
    erb "<h1>Authentication Failed:</h1>
         <h3>message:<h3> <pre>#{params}</pre>", layout: false
  end
end