braintree_lyre 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,24 @@
1
+ module BraintreeLyre
2
+
3
+ module Helpers
4
+
5
+ def camelize(str)
6
+ segments = str.split('_')
7
+
8
+ segments.inject("") { |acc, s| acc << s.capitalize }
9
+ end
10
+
11
+ def constantize(camel_cased_word)
12
+ names = camel_cased_word.split('::')
13
+ names.shift if names.empty? || names.first.empty?
14
+
15
+ constant = Object
16
+ names.each do |name|
17
+ constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
18
+ end
19
+ constant
20
+ end
21
+
22
+ end
23
+
24
+ end
@@ -9,6 +9,8 @@ module BraintreeLyre
9
9
  PUBLIC_KEY = "pubkey"
10
10
  PRIVATE_KEY = "prikey"
11
11
 
12
+ attr_accessor :last_thing
13
+
12
14
  setup do |lyre|
13
15
  Braintree::Configuration.environment = BraintreeLyre::Lyre::ENVIRONMENT
14
16
  Braintree::Configuration.merchant_id = BraintreeLyre::Lyre::MERCHANT_ID
@@ -19,8 +21,12 @@ module BraintreeLyre
19
21
 
20
22
  # Braintree::TransparentRedirect.url
21
23
  post "/merchants/:merchant_id/transparent_redirect_requests" do
22
- debugger
23
- "REDIRECT REQUEST"
24
+ if params[:tr_data]
25
+ transaction = TransparentRedirect.create(params)
26
+ redirect to(transaction.return_url), 303
27
+ else
28
+ [422, { "Content-Type" => "text/html" }, ["Invalid submission"]]
29
+ end
24
30
  end
25
31
 
26
32
  # Braintree::TransparentRedirect.confirm
@@ -0,0 +1,41 @@
1
+ require 'digest/md5'
2
+
3
+ module BraintreeLyre::TransparentRedirect
4
+
5
+ class CreateTransaction
6
+
7
+ attr_reader :merchant_id, :redirect_url
8
+
9
+ def initialize(params)
10
+ _, query = *params['tr_data'].split("|", 2)
11
+ tr_data = Rack::Utils.parse_query(query)
12
+
13
+ @merchant_id = params['merchant_id']
14
+ @redirect_url = tr_data['redirect_url']
15
+ end
16
+
17
+ def return_url
18
+ id = create_id(merchant_id)
19
+ query = base_query(id)
20
+ URI.parse(redirect_url).merge("?#{query}&hash=#{hash(query)}")
21
+ end
22
+
23
+ private
24
+
25
+ #MOVE TO HELPER?
26
+ def base_query(id)
27
+ "http_status=200&id=#{id}"
28
+ end
29
+
30
+ #MOVE TO HELPER?
31
+ def hash(string)
32
+ Braintree::Digest.hexdigest(Braintree::Configuration.private_key, string)
33
+ end
34
+
35
+ #MOVE TO HELPER?
36
+ def create_id(merchant_id)
37
+ Digest::MD5.hexdigest("#{merchant_id}#{Time.now.to_f}")
38
+ end
39
+ end
40
+
41
+ end
@@ -0,0 +1,35 @@
1
+ require 'braintree_lyre/transparent_redirect/create_transaction'
2
+ require 'braintree_lyre/helpers'
3
+
4
+ module BraintreeLyre
5
+
6
+ module TransparentRedirect
7
+
8
+ extend BraintreeLyre::Helpers
9
+
10
+ def self.create(params)
11
+ matches = params['tr_data'].match(/
12
+ ^ #start at the beginning
13
+ .* #match anything
14
+ &kind= #match the key we are looking for
15
+ (?<kind>[^&]+) #match the value and name it type
16
+ & #match the terminating ampersand
17
+ .* #match anything
18
+ $ #match to the end
19
+ /x)
20
+
21
+ kind = matches['kind']
22
+ klass = kind_to_class(kind)
23
+
24
+ klass.new(params)
25
+ end
26
+
27
+ private
28
+
29
+ def self.kind_to_class(kind)
30
+ constantize("BraintreeLyre::TransparentRedirect::#{camelize(kind)}")
31
+ end
32
+
33
+ end
34
+
35
+ end
@@ -1,3 +1,3 @@
1
1
  module BraintreeLyre
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -1,2 +1,5 @@
1
1
  require 'braintree_lyre/version'
2
- require 'braintree_lyre/lyre'
2
+ require 'braintree_lyre/helpers'
3
+ require 'braintree_lyre/lyre'
4
+ require 'braintree_lyre/transparent_redirect'
5
+ require 'braintree_lyre/transparent_redirect/create_transaction'
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+ require 'braintree_lyre'
3
+
4
+ describe "CreateTransaction" do
5
+
6
+ subject(:tr) do
7
+ BraintreeLyre::TransparentRedirect.create(
8
+ {
9
+ #"utf8"=>"✓",
10
+ "tr_data"=>"f1fdad882a1b3e55fbb9d1efea9c2b6b31a1400e|api_version=2&kind=create_transaction&public_key=pubkey&redirect_url=http%3A%2F%2F127.0.0.1%3A51576%2Fsignup%2Fpro%2Fpublish&time=20130218050006&transaction%5Bamount%5D=99&transaction%5Boptions%5D%5Badd_billing_address_to_payment_method%5D=true&transaction%5Boptions%5D%5Bstore_in_vault_on_success%5D=true&transaction%5Boptions%5D%5Bsubmit_for_settlement%5D=true&transaction%5Btype%5D=sale",
11
+ "transaction"=> {
12
+ "credit_card" => {
13
+ "number"=>"4111-1111-1111-1111",
14
+ "expiration_month"=>"1",
15
+ "expiration_year" => "2015"
16
+ },
17
+ "billing" => {
18
+ "postal_code"=>"02446"
19
+ }
20
+ },
21
+ "x"=>"122",
22
+ "y"=>"19",
23
+ "splat"=>[],
24
+ "captures"=>["0000"],
25
+ "merchant_id"=>"0000"
26
+ }
27
+ )
28
+ end
29
+
30
+ specify { tr.should be_a(BraintreeLyre::TransparentRedirect::CreateTransaction) }
31
+ specify { tr.merchant_id.should == '0000' }
32
+
33
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: braintree_lyre
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -105,10 +105,14 @@ files:
105
105
  - Rakefile
106
106
  - braintree_lyre.gemspec
107
107
  - lib/braintree_lyre.rb
108
+ - lib/braintree_lyre/helpers.rb
108
109
  - lib/braintree_lyre/lyre.rb
110
+ - lib/braintree_lyre/transparent_redirect.rb
111
+ - lib/braintree_lyre/transparent_redirect/create_transaction.rb
109
112
  - lib/braintree_lyre/version.rb
110
113
  - spec/setup_spec.rb
111
114
  - spec/spec_helper.rb
115
+ - spec/transparent_redirect/create_transaction_spec.rb
112
116
  homepage: https://github.com/Sortfolio/braintree_lyre
113
117
  licenses: []
114
118
  post_install_message:
@@ -136,3 +140,4 @@ summary: A Lyre for Braintree's payment gateway
136
140
  test_files:
137
141
  - spec/setup_spec.rb
138
142
  - spec/spec_helper.rb
143
+ - spec/transparent_redirect/create_transaction_spec.rb