This is a spree extension to enable downloadable products (ebooks, MP3s, videos, etc).
The idea is simple. You attach a file to a Product (or a Variant of this Product) and when people buy it, they will receive a link via email where they can download it once. There are a few assumptions that spree_digital (currently) makes and it's important to be aware of them.
OrdersController#show
is easy, check out this gist.views/order_mailer/confirm_email.text.erb
needs to be customized by you.
If you are looking for HTML emails, this branch of spree-html-email supports spree_digital.RAILS_ROOT/private
.
Make sure it's symlinked in case you're using Capistrano.
If you want to change the upload path, check out this gist.views/spree/digitals/unauthorized.html.erb
file to customize an error message to the user if they exceed the download / days limitAdd this extension to your Gemfile with this line:
gem 'spree_digital', github: 'spree-contrib/spree_digital'
gem 'spree_digital', github: 'spree-contrib/spree_digital', branch: 'X-X-stable'
The branch
option is important: it must match the version of Spree you're using.
For example, use 3-0-stable
if you're using Spree 3-0-stable
or any 3.0.x
version.
Install the gem using Bundler:
bundle install
Copy & run migrations
bundle exec rails g spree_digital:install
Restart your server
If your server was running, restart it so that it can find the assets properly.
Then set any preferences in the web interface.
You should create a ShippingMethod based on the Digital Delivery calculator type.
It will be detected by spree_digital
.
Otherwise your customer will be forced to choose something like "UPS" even if they purchase only downloadable products.
send_file
+ nginxWithout customization, all file downloading will route through the rails stack. This means that if you have two workers, and two customers are downloading files, your server is maxed out and will be unresponsive until the downloads have finished.
Luckily there is an easy way around this: pass off file downloading to nginx (or apache, etc). Take a look at this article for a good explanation.
# in your app's source
# config/environments/production.rb
# Specifies the header that your server uses for sending files
# config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
# on your server
# e.g. /etc/nginx/sites-available/spree-secure
upstream unicorn_spree_secure {
server unix:/data/spree/shared/sockets/unicorn.sock fail_timeout=0;
}
server {
listen 443;
...
location / {
proxy_set_header X_FORWARDED_PROTO https;
...
proxy_set_header X-Sendfile-Type X-Accel-Redirect;
proxy_set_header X-Accel-Mapping /data/spree/shared/uploaded-files/digitals/=/digitals/;
...
}
location /digitals/ {
internal;
root /data/spree/shared/uploaded-files/;
}
...
}
References:
rake test_app
rake rspec
See https://github.com/halo/spree_digital/graphs/contributors
MIT © 2011-2015 halo, see LICENSE