forked from OpenNeo/impress
charge and record donations
This commit is contained in:
parent
2a1a3c61fa
commit
595b1c2fc5
17 changed files with 93 additions and 16 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -3,3 +3,4 @@ db/*.sqlite3
|
||||||
log/*.log
|
log/*.log
|
||||||
tmp/**/*
|
tmp/**/*
|
||||||
Capfile
|
Capfile
|
||||||
|
.env
|
||||||
|
|
6
Gemfile
6
Gemfile
|
@ -1,11 +1,13 @@
|
||||||
source 'http://rubygems.org'
|
source 'http://rubygems.org'
|
||||||
|
|
||||||
|
gem 'dotenv-rails', :groups => [:development, :test]
|
||||||
|
|
||||||
gem 'rails', '= 3.2.18'
|
gem 'rails', '= 3.2.18'
|
||||||
#gem 'sqlite3-ruby', '~> 1.3.1', :require => 'sqlite3'
|
#gem 'sqlite3-ruby', '~> 1.3.1', :require => 'sqlite3'
|
||||||
gem 'mysql2', '>= 0.3.11'
|
gem 'mysql2', '>= 0.3.11'
|
||||||
|
|
||||||
# https://groups.google.com/d/topic/rubyonrails-security/4_YvCpLzL58/discussion
|
# https://groups.google.com/d/topic/rubyonrails-security/4_YvCpLzL58/discussion
|
||||||
gem 'json', '~> 1.7.7'
|
gem 'json', '~> 1.8.1'
|
||||||
|
|
||||||
gem 'haml', '~> 4.0.0'
|
gem 'haml', '~> 4.0.0'
|
||||||
gem 'rdiscount', '~> 1.6.5'
|
gem 'rdiscount', '~> 1.6.5'
|
||||||
|
@ -66,6 +68,8 @@ gem 'rack-attack', '~> 2.2.0'
|
||||||
|
|
||||||
gem 'react-rails', '~> 0.8.0.0'
|
gem 'react-rails', '~> 0.8.0.0'
|
||||||
|
|
||||||
|
gem 'stripe', :git => 'https://github.com/stripe/stripe-ruby'
|
||||||
|
|
||||||
# Needed for the new asset pipeline
|
# Needed for the new asset pipeline
|
||||||
group :assets do
|
group :assets do
|
||||||
|
|
||||||
|
|
20
Gemfile.lock
20
Gemfile.lock
|
@ -72,6 +72,15 @@ GIT
|
||||||
specs:
|
specs:
|
||||||
RocketAMF (1.0.0)
|
RocketAMF (1.0.0)
|
||||||
|
|
||||||
|
GIT
|
||||||
|
remote: https://github.com/stripe/stripe-ruby
|
||||||
|
revision: 2c6f4caa99916c33d3f9af57f66422ff5ea913cf
|
||||||
|
specs:
|
||||||
|
stripe (1.15.0)
|
||||||
|
json (~> 1.8.1)
|
||||||
|
mime-types (>= 1.25, < 3.0)
|
||||||
|
rest-client (~> 1.4)
|
||||||
|
|
||||||
GEM
|
GEM
|
||||||
remote: http://rubygems.org/
|
remote: http://rubygems.org/
|
||||||
specs:
|
specs:
|
||||||
|
@ -129,6 +138,11 @@ GEM
|
||||||
railties (~> 3.1)
|
railties (~> 3.1)
|
||||||
warden (~> 1.2.1)
|
warden (~> 1.2.1)
|
||||||
diff-lcs (1.2.1)
|
diff-lcs (1.2.1)
|
||||||
|
dotenv (0.11.1)
|
||||||
|
dotenv-deployment (~> 0.0.2)
|
||||||
|
dotenv-deployment (0.0.2)
|
||||||
|
dotenv-rails (0.11.1)
|
||||||
|
dotenv (= 0.11.1)
|
||||||
dye (0.1.4)
|
dye (0.1.4)
|
||||||
em-socksify (0.2.1)
|
em-socksify (0.2.1)
|
||||||
eventmachine (>= 1.0.0.beta.4)
|
eventmachine (>= 1.0.0.beta.4)
|
||||||
|
@ -159,7 +173,7 @@ GEM
|
||||||
http_parser.rb (0.5.3)
|
http_parser.rb (0.5.3)
|
||||||
i18n (0.6.9)
|
i18n (0.6.9)
|
||||||
journey (1.0.4)
|
journey (1.0.4)
|
||||||
json (1.7.7)
|
json (1.8.1)
|
||||||
mail (2.5.4)
|
mail (2.5.4)
|
||||||
mime-types (~> 1.16)
|
mime-types (~> 1.16)
|
||||||
treetop (~> 1.4.8)
|
treetop (~> 1.4.8)
|
||||||
|
@ -310,6 +324,7 @@ DEPENDENCIES
|
||||||
character-encodings (~> 0.4.1)
|
character-encodings (~> 0.4.1)
|
||||||
compass-rails (~> 1.0.3)
|
compass-rails (~> 1.0.3)
|
||||||
devise (~> 2.2.3)
|
devise (~> 2.2.3)
|
||||||
|
dotenv-rails
|
||||||
em-http-request!
|
em-http-request!
|
||||||
em-mysqlplus!
|
em-mysqlplus!
|
||||||
em-synchrony!
|
em-synchrony!
|
||||||
|
@ -320,7 +335,7 @@ DEPENDENCIES
|
||||||
globalize3!
|
globalize3!
|
||||||
haml (~> 4.0.0)
|
haml (~> 4.0.0)
|
||||||
http_accept_language!
|
http_accept_language!
|
||||||
json (~> 1.7.7)
|
json (~> 1.8.1)
|
||||||
memcache-client (~> 1.8.5)
|
memcache-client (~> 1.8.5)
|
||||||
mini_magick (~> 3.4)
|
mini_magick (~> 3.4)
|
||||||
msgpack (~> 0.5.3)
|
msgpack (~> 0.5.3)
|
||||||
|
@ -347,6 +362,7 @@ DEPENDENCIES
|
||||||
rspec-rails (~> 2.0.0.beta.22)
|
rspec-rails (~> 2.0.0.beta.22)
|
||||||
sanitize (~> 2.0.3)
|
sanitize (~> 2.0.3)
|
||||||
sass-rails (~> 3.2.6)
|
sass-rails (~> 3.2.6)
|
||||||
|
stripe!
|
||||||
swf_converter (~> 0.0.3)
|
swf_converter (~> 0.0.3)
|
||||||
uglifier (>= 1.0.3)
|
uglifier (>= 1.0.3)
|
||||||
whenever (~> 0.7.3)
|
whenever (~> 0.7.3)
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
(function() {
|
(function() {
|
||||||
var donationForm = document.getElementById('donation-form');
|
var donationForm = document.getElementById('donation-form');
|
||||||
var amountField = donationForm.amount;
|
var amountField = donationForm.querySelector(
|
||||||
|
'[name=donation\\[amount\\]]');
|
||||||
var tokenField = donationForm.querySelector(
|
var tokenField = donationForm.querySelector(
|
||||||
'[name=donation\\[stripe_token\\]]');
|
'[name=donation\\[stripe_token\\]]');
|
||||||
|
|
||||||
var checkout = StripeCheckout.configure({
|
var checkout = StripeCheckout.configure({
|
||||||
key: 'pk_test_wEvgn4baD9W5ld5C9JCS9Ahf', // TODO
|
key: donationForm.getAttribute('data-checkout-publishable-key'),
|
||||||
image: donationForm.getAttribute('data-checkout-image'),
|
image: donationForm.getAttribute('data-checkout-image'),
|
||||||
token: function(token) {
|
token: function(token) {
|
||||||
tokenField.value = token.id;
|
tokenField.value = token.id;
|
||||||
|
|
6
app/controllers/donations_controller.rb
Normal file
6
app/controllers/donations_controller.rb
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
class DonationsController < ApplicationController
|
||||||
|
def create
|
||||||
|
@donation = Donation.create_from_charge(current_user, params[:donation])
|
||||||
|
render text: @donation.inspect
|
||||||
|
end
|
||||||
|
end
|
26
app/models/donation.rb
Normal file
26
app/models/donation.rb
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
class Donation < ActiveRecord::Base
|
||||||
|
belongs_to :user
|
||||||
|
|
||||||
|
def self.create_from_charge(user, params)
|
||||||
|
amount = (BigDecimal.new(params[:amount]) * 100).floor
|
||||||
|
|
||||||
|
customer = Stripe::Customer.create(
|
||||||
|
card: params[:stripe_token]
|
||||||
|
)
|
||||||
|
|
||||||
|
charge = Stripe::Charge.create(
|
||||||
|
:customer => customer.id,
|
||||||
|
:amount => amount,
|
||||||
|
:description => 'Donation (thank you!)',
|
||||||
|
:currency => 'usd'
|
||||||
|
)
|
||||||
|
|
||||||
|
donation = Donation.new
|
||||||
|
donation.amount = amount
|
||||||
|
donation.charge_id = charge.id
|
||||||
|
donation.user_id = user.try(:id)
|
||||||
|
donation.save!
|
||||||
|
|
||||||
|
donation
|
||||||
|
end
|
||||||
|
end
|
|
@ -7,7 +7,8 @@
|
||||||
toward our hosting costs this year. Thanks so much!
|
toward our hosting costs this year. Thanks so much!
|
||||||
|
|
||||||
= form_tag donations_path, method: 'POST', id: 'donation-form',
|
= form_tag donations_path, method: 'POST', id: 'donation-form',
|
||||||
'data-checkout-image' => image_path('default-preview.png') do
|
'data-checkout-image' => image_path('default-preview.png'),
|
||||||
|
'data-checkout-publishable-key' => Rails.configuration.stripe[:publishable_key] do
|
||||||
= hidden_field_tag 'donation[stripe_token]'
|
= hidden_field_tag 'donation[stripe_token]'
|
||||||
%header
|
%header
|
||||||
%p#donation-form-title
|
%p#donation-form-title
|
||||||
|
@ -16,7 +17,7 @@
|
||||||
All donations go directly to our hosting costs. Thanks for your help!
|
All donations go directly to our hosting costs. Thanks for your help!
|
||||||
%div
|
%div
|
||||||
= precede '$' do
|
= precede '$' do
|
||||||
= text_field_tag 'amount', '10.00'
|
= text_field_tag 'donation[amount]', '10.00'
|
||||||
%button{:type => 'submit'} Donate now!
|
%button{:type => 'submit'} Donate now!
|
||||||
|
|
||||||
#description
|
#description
|
||||||
|
|
6
config/initializers/stripe.rb
Normal file
6
config/initializers/stripe.rb
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
Rails.configuration.stripe = {
|
||||||
|
:publishable_key => ENV['STRIPE_PUBLISHABLE_KEY'],
|
||||||
|
:secret_key => ENV['STRIPE_SECRET_KEY']
|
||||||
|
}
|
||||||
|
|
||||||
|
Stripe.api_key = Rails.configuration.stripe[:secret_key]
|
|
@ -78,6 +78,8 @@ OpenneoImpressItems::Application.routes.draw do
|
||||||
only: [:create, :destroy]
|
only: [:create, :destroy]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
resources :donations, only: [:create]
|
||||||
|
|
||||||
match 'users/current-user/closet' => 'closet_hangers#index', :as => :your_items
|
match 'users/current-user/closet' => 'closet_hangers#index', :as => :your_items
|
||||||
|
|
||||||
match 'users/top-contributors' => 'users#top_contributors', :as => :top_contributors
|
match 'users/top-contributors' => 'users#top_contributors', :as => :top_contributors
|
||||||
|
|
12
db/migrate/20140910014231_create_donations.rb
Normal file
12
db/migrate/20140910014231_create_donations.rb
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
class CreateDonations < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
create_table :donations do |t|
|
||||||
|
t.integer :amount, null: false
|
||||||
|
t.string :charge_id, null: false
|
||||||
|
t.integer :user_id
|
||||||
|
t.string :donor_name
|
||||||
|
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
15
db/schema.rb
15
db/schema.rb
|
@ -11,7 +11,7 @@
|
||||||
#
|
#
|
||||||
# It's strongly recommended to check this file into your version control system.
|
# It's strongly recommended to check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema.define(:version => 20140403034558) do
|
ActiveRecord::Schema.define(:version => 20140910014231) do
|
||||||
|
|
||||||
create_table "auth_servers", :force => true do |t|
|
create_table "auth_servers", :force => true do |t|
|
||||||
t.string "short_name", :limit => 10, :null => false
|
t.string "short_name", :limit => 10, :null => false
|
||||||
|
@ -100,15 +100,12 @@ ActiveRecord::Schema.define(:version => 20140403034558) do
|
||||||
add_index "contributions", ["user_id"], :name => "index_contributions_on_user_id"
|
add_index "contributions", ["user_id"], :name => "index_contributions_on_user_id"
|
||||||
|
|
||||||
create_table "donations", :force => true do |t|
|
create_table "donations", :force => true do |t|
|
||||||
t.integer "amount_cents"
|
t.integer "amount", :null => false
|
||||||
t.boolean "processed"
|
t.string "charge_id", :null => false
|
||||||
t.datetime "created_at"
|
t.integer "user_id"
|
||||||
t.datetime "updated_at"
|
|
||||||
t.string "transaction_id"
|
|
||||||
t.string "access_token"
|
|
||||||
t.integer "campaign_id"
|
|
||||||
t.integer "outfit_features_count", :default => 0, :null => false
|
|
||||||
t.string "donor_name"
|
t.string "donor_name"
|
||||||
|
t.datetime "created_at", :null => false
|
||||||
|
t.datetime "updated_at", :null => false
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "donations_old", :force => true do |t|
|
create_table "donations_old", :force => true do |t|
|
||||||
|
|
5
spec/models/donation_spec.rb
Normal file
5
spec/models/donation_spec.rb
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe Donation do
|
||||||
|
pending "add some examples to (or delete) #{__FILE__}"
|
||||||
|
end
|
BIN
vendor/cache/dotenv-0.11.1.gem
vendored
Normal file
BIN
vendor/cache/dotenv-0.11.1.gem
vendored
Normal file
Binary file not shown.
BIN
vendor/cache/dotenv-deployment-0.0.2.gem
vendored
Normal file
BIN
vendor/cache/dotenv-deployment-0.0.2.gem
vendored
Normal file
Binary file not shown.
BIN
vendor/cache/dotenv-rails-0.11.1.gem
vendored
Normal file
BIN
vendor/cache/dotenv-rails-0.11.1.gem
vendored
Normal file
Binary file not shown.
BIN
vendor/cache/json-1.7.7.gem
vendored
BIN
vendor/cache/json-1.7.7.gem
vendored
Binary file not shown.
BIN
vendor/cache/json-1.8.1.gem
vendored
Normal file
BIN
vendor/cache/json-1.8.1.gem
vendored
Normal file
Binary file not shown.
Loading…
Reference in a new issue