• Stars
    star
    116
  • Rank 303,894 (Top 6 %)
  • Language
    Ruby
  • License
    MIT License
  • Created over 13 years ago
  • Updated almost 3 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A Spree extension to enable downloadable products

Build Status License

Spree Digital

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.

  • The table structure of spree_core is not touched. Spree digital lives parallel to spree_core and does change the existing database, except adding two new tables.
  • The download links will be sent via email in the order confirmation (or "resend" from the admin section). The links do not appear in the order "overview" that the customer sees. Adding download buttons to OrdersController#show is easy, check out this gist.
  • Once the order is checked-out, the download links will immediately be sent (i.e. in the order confirmation). You'll have to modify the system to support 'delayed' payments (like a billable account).
  • You should create a ShippingMethod based on the Digital Delivery calculator type. The default cost for digital delivery is 0, but you can define a flat rate (creating a per-item digital delivery fee would be possible as well). Checkout the source code for the Digital Delivery calculator for more information.
  • One may buy several items of the same digital product in one cart. The customer will simply receive several links by doing so. This allows customer's to legally purchase multiple copies of the same product and maybe give one away to a friend.
  • You can set how many times (clicks) the users downloads will work. You can also set how long the users links will work (expiration). For more information, check out the preferences object
  • The file 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.
  • A purchased product can be downloaded even if you disable the product immediately. You would have to remove the attached file in your admin section to prevent people from downloading purchased products.
  • File are uploaded to 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.
  • You must add a views/spree/digitals/unauthorized.html.erb file to customize an error message to the user if they exceed the download / days limit
  • We use send_file to send the files on download. See below for instructions on how to push file downloading off to nginx.

Installation

  1. Add this extension to your Gemfile with this line:

Spree >= 3.1

gem 'spree_digital', github: 'spree-contrib/spree_digital'

Spree 3.0 and Spree 2.x

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.

  1. Install the gem using Bundler:
bundle install
  1. Copy & run migrations
bundle exec rails g spree_digital:install
  1. 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.

Shipping Configuration

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.

Improving File Downloading: send_file + nginx

Without 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:

Development

Table Diagram

Testing

rake test_app
rake rspec

Contributors

See https://github.com/halo/spree_digital/graphs/contributors

License

MIT © 2011-2015 halo, see LICENSE

More Repositories

1

spree_i18n

I18n translation files for Spree Commerce.
Ruby
346
star
2

spree_social

Building block for spree social networking features (provides authentication and account linkage)
Ruby
213
star
3

spree_related_products

Related products extension for Spree Commerce.
Ruby
149
star
4

spree_active_shipping

Spree integration for Shopify's active_shipping gem.
Ruby
135
star
5

spree_multi_vendor

Spree marketplace extension. Create your own marketplace on top of Spree Commerce
Ruby
130
star
6

spree_reviews

Straightforward review/rating functionality.
Ruby
125
star
7

better_spree_paypal_express

A better Spree PayPal Express Extension.
Ruby
109
star
8

spree_wishlist

Wishlist extension for Spree Commerce.
Ruby
106
star
9

spree_drop_ship

Spree Drop Shipping Extension
Ruby
102
star
10

spree_address_book

Adds address book for users to Spree
Ruby
94
star
11

spree_print_invoice

Create a PDF invoice for Spree orders.
Ruby
90
star
12

spree_fancy

SpreeFancy is a responsive theme for Spree Commerce.
CSS
86
star
13

spree_marketplace

Turn Spree into a marketplace by extending spree drop ship.
Ruby
77
star
14

spree_store_credits

This Spree extension allows admins to issue arbitrary amounts of store credit to users.
Ruby
70
star
15

spree_blue_theme

Original Spree Blue theme (0.60.x)
Ruby
65
star
16

spree_shared

Multi-tenancy for Spree using Apartment (per tenant databases).
Ruby
61
star
17

spree_rdr_theme

WIP - everything might change.
Ruby
52
star
18

spree_email_to_friend

Email a friend functionality for Spree Commerce.
Ruby
49
star
19

spree_sitemap

Sitemap Generator for Spree Commerce.
Ruby
47
star
20

spree_affiliate

Affiliate support for Spree Commerce.
Ruby
46
star
21

spree_braintree_vzero

Official Braintree + PayPal integration gem for Spree Commerce
Ruby
45
star
22

spree_multi_currency

Provides UI to allow configuring multiple currencies in Spree.
Ruby
41
star
23

spree_contact_us

Adds Contact Us form to your Spree Commerce store
Ruby
40
star
24

spree_product_zoom

Lightbox zoom functionality to show original product image
Ruby
32
star
25

spree_social_products

Add social sharing buttons for your Spree products
Ruby
28
star
26

spree_mail_settings

Mail setting functionality extracted from Spree.
Ruby
28
star
27

spree_slider

Ruby
26
star
28

spree_api_examples

Ruby
26
star
29

spree_globalize

Adds support for model translations (multi-language stores) using Globalize gem
Ruby
24
star
30

spree_simple_dash

Alternative dashboard overview for Spree
Ruby
23
star
31

spree_price_books

Price book functionality for running sales, role based, country based pricing etc...
Ruby
21
star
32

spree_analytics_trackers

Integrate your Spree application with Google Analytics and Segment.com
Ruby
19
star
33

spree_product_groups

Extension to Spree featuring Product Groups that were originally part of core prior to 1.1 release.
Ruby
19
star
34

spree_skrill

Add support for Skrill / MoneyBookers Quick checkout as a payment method.
Ruby
18
star
35

spree_analytics

Ruby
18
star
36

spree_store_credit_payment_method

Adds store credit functionality as a payment method.
Ruby
17
star
37

spree_tax_cloud

US sales tax extension for Spree using the Tax Cloud service.
Ruby
15
star
38

spree_page_cache

Minor tweaks to make Spree pages suitable for page caching
Ruby
15
star
39

spree_blue_sass_theme

spree_blue_theme using sass
Ruby
14
star
40

spree-adyen

Adyen payment gateway integration for Spree.
Ruby
12
star
41

spree_mailchimp_ecommerce

Connect your Spree application to Mailchimp eCommerce API for full email automation
Ruby
12
star
42

spree_shopify_importer

Migrate your Shopify store to Spree
Ruby
9
star
43

spree_handling_fees

Adds Handling Fee functionality to Spree.
Ruby
9
star
44

spree_clean

Admin UI to allow the removal of sample / test data.
Ruby
9
star
45

spree_vouchers

A WIP for Gift Vouchers
Ruby
7
star
46

spree_avatax_official

The new officially certified Spree Avatax (Avalara) extension
Ruby
7
star
47

spree_favorites

Add Spree::Favorite model to track favorite products or anything else you would like.
Ruby
7
star
48

spree_claim_order

Claim guest orders associated with an email address
Ruby
5
star
49

rfcs

A Request for Comments on Spree.
5
star
50

spree_videos

Spree extension to allow linking of youtube reference IDs to products
Ruby
5
star
51

spree_jirafe

Front-end integration for Jirafe.
Ruby
5
star
52

spree_usa_epay

Ruby
4
star
53

spree_multicode_promotions

Ruby
2
star
54

spree_jmeter

Contains https://github.com/flood-io/ruby-jmeter scripts for benchmarking & load testing Spree.
Ruby
1
star
55

spree_automation_interfaces

Ruby
1
star
56

spree_legacy_return_authorizations

Spree 2.3.x Legacy Returns
Ruby
1
star