From 97040ab60316b3a6bbd0d7fe489e1f953e863a7f Mon Sep 17 00:00:00 2001 From: Andy Zhao Date: Tue, 7 May 2019 11:37:21 -0400 Subject: [PATCH] Remove membership and stripe subscription routes (#2741) --- app/controllers/pages_controller.rb | 13 +- app/views/pages/_wall_of_patrons.html.erb | 17 - app/views/pages/membership.html.erb | 374 --------------------- app/views/pages/membership_form.html.erb | 29 -- app/views/pages/scholarships.html.erb | 66 ---- config/routes.rb | 8 +- spec/requests/pages_spec.rb | 7 - spec/requests/stripe_active_cards_spec.rb | 37 -- spec/requests/stripe_subscriptions_spec.rb | 171 ---------- spec/requests/user_settings_spec.rb | 13 +- 10 files changed, 3 insertions(+), 732 deletions(-) delete mode 100644 app/views/pages/_wall_of_patrons.html.erb delete mode 100644 app/views/pages/membership.html.erb delete mode 100644 app/views/pages/membership_form.html.erb delete mode 100644 app/views/pages/scholarships.html.erb delete mode 100644 spec/requests/stripe_subscriptions_spec.rb diff --git a/app/controllers/pages_controller.rb b/app/controllers/pages_controller.rb index 9e1dc490b..edccfba3e 100644 --- a/app/controllers/pages_controller.rb +++ b/app/controllers/pages_controller.rb @@ -1,6 +1,6 @@ class PagesController < ApplicationController # No authorization required for entirely public controller - before_action :set_cache_control_headers, only: %i[show rlyweb now membership survey badge shecoded] + before_action :set_cache_control_headers, only: %i[show rlyweb now survey badge shecoded] def show @page = Page.find_by!(slug: params[:slug]) @@ -27,17 +27,6 @@ class PagesController < ApplicationController set_surrogate_key_header "badge_page" end - def membership - flash[:notice] = "" - flash[:error] = "" - @members = members_for_display - set_surrogate_key_header "membership_page" - end - - def membership_form - render "membership_form", layout: false - end - def report_abuse reported_url = params[:reported_url] || params[:url] || request.referer @feedback_message = FeedbackMessage.new( diff --git a/app/views/pages/_wall_of_patrons.html.erb b/app/views/pages/_wall_of_patrons.html.erb deleted file mode 100644 index 3c6ea2c9e..000000000 --- a/app/views/pages/_wall_of_patrons.html.erb +++ /dev/null @@ -1,17 +0,0 @@ -<% cache("wall-of-patrons", expires_in: 3.hours) do %> - - -
-

Wall of Patrons and Scholars

- <% @members.each do |member| %> - - <% end %> -

Thank you for being a dev.to sustaining member!

-
-<% end %> diff --git a/app/views/pages/membership.html.erb b/app/views/pages/membership.html.erb deleted file mode 100644 index ccbf23057..000000000 --- a/app/views/pages/membership.html.erb +++ /dev/null @@ -1,374 +0,0 @@ -<% title "The DEV Sustaining Membership" %> - -<%= content_for :page_meta do %> - - - - - - - - - - - - - - - - - -<% end %> - -
- - -
-
- <% if flash[:error].present? %> -
- ERROR: <%= sanitize(flash[:error]) %> -
- <% end %> -
-
- <% cache("membership-shared-area", expires_in: 1.hour) do %> - " style="height:180px;margin-top:30px;" /> -

- The DEV Community
Sustaining Membership -

-

- Our community is special because of each and every one of you.
-

-

- By contributing at - any level, your support will help us continue our work of building a community that is open, kind, and constructive for programmers everywhere. -

-

- We’ve put together some goodies that are described below and we’ll be expanding these perks over time, so you can expect even more in the long run. -

-

- Thanks for (at least thinking about) becoming a dev.to sustaining member. The fact that you’re reading this means a lot to us. -

-
-
-
-
Level 1
-
- Your support is appreciated. For $1 a month, you'll get: -
    -
  • Access to beta features
  • -
  • Added to our "Wall of Patrons and Scholars" with a link to your profile
  • -
-
- " /> -
-
-
-
-
Level 2
-
- Double digits! For $10 a month, you'll get: -
    -
  • An exclusive sticker pack mailed to your door
  • -
  • 25% off The DEV Shop (forever!)
  • -
  • Added to our "Wall of Patrons and Scholars" with a link to your profile
  • -
  • Access to beta features
  • -
-
- " /> -
-
-
-
-
Level 3
-
- Woohooo! For $25 a month, you'll get: -
    -
  • Stickers + t-shirt combo pack
  • -
  • 25% off The DEV Shop (forever!)
  • -
  • Added to our "Wall of Patrons and Scholars" with a link to your profile
  • -
  • Access to beta features
  • -
-
- " /> -
-
-
-
-
Level 4
-
- When you contribute - over $25 a month, your additional support goes toward our diversity/need-based scholarship fund, providing workshop passes to members who cannot afford it. Plus, all the perks from above. -
- " /> -
-
-
-
-
Level Triple-Unicorn -
-
- For - $1000 a month, your name will get the featured position on the Wall of Patrons and Scholars, everything described above, monthly private conversations with the DEV leadership, and an actual unicorn. Provided we can find one. -
- " /> - " /> - " /> -
-
-
-

Perks will update according to your membership status and tier.

-
-
- <% end %> -
-
-
- -
-
-
-
-
-
- <%= render partial: "wall_of_patrons" %> -
-
- - - - diff --git a/app/views/pages/membership_form.html.erb b/app/views/pages/membership_form.html.erb deleted file mode 100644 index b9b1d20b8..000000000 --- a/app/views/pages/membership_form.html.erb +++ /dev/null @@ -1,29 +0,0 @@ -<% if user_signed_in? && current_user.monthly_dues == 0 %> -
- <%= form_tag "/membership-action", id: "credit-card-form", class: "enroll-form" do %> -
- <%= number_field_tag :input_amount, 25, class: "amount-input", step: "any", min: "1", id: "amount-input" %> -
$
-
-
- -
- <% end %> -<% elsif user_signed_in? %> -
-

Manage your membership here ✌️

-
-<% else %> -
- " /> - " /> - " /> -

Sign in to get your membership

- <%= ApplicationConfig["APP_DOMAIN"] %>/users/auth/twitter/callback" class="cta cta-button" data-no-instant> - TWITTER - - - GITHUB - -
-<% end %> diff --git a/app/views/pages/scholarships.html.erb b/app/views/pages/scholarships.html.erb deleted file mode 100644 index 8d6cd71f8..000000000 --- a/app/views/pages/scholarships.html.erb +++ /dev/null @@ -1,66 +0,0 @@ -<% title "DEV Scholarships" %> - -<%= content_for :page_meta do %> - - - - - - - - - - - - - - - - -<% end %> - - -
-
-
-
-

- The DEV Scholarship -

-
-

- This scholarship is for anyone interested in attending DEV workshops but does not have the means to be a level 3 - sustaining member. -

-

- Scholarship recipients will receive full access to all DEV workshops for one year. These workshops are taught by experts from the community and range from beginner to advanced topics. - Check out our upcoming sessions. -

- <% if current_user && current_user.scholar %> -

- Congratulations on your DEV scholarship! - <% if current_user.workshop_expiration %> - Your scholarship will end on - <%= current_user.workshop_expiration.strftime("%b %d, %Y") %>. - <% end %> -

- <% else %> -

- We encourage you to apply below and if within your means, to become a level 1 or 2 sustaining member. -

-
- -
- <% end %> -
-
diff --git a/config/routes.rb b/config/routes.rb index 90f9ad85a..512a60b1f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -126,7 +126,6 @@ Rails.application.routes.draw do resources :blocks resources :notifications, only: [:index] resources :tags, only: [:index] - resources :stripe_subscriptions, only: %i[create update destroy] resources :stripe_active_cards, only: %i[create update destroy] resources :stripe_cancellations, only: [:create] resources :live_articles, only: [:index] @@ -173,9 +172,6 @@ Rails.application.routes.draw do get "/social_previews/organization/:id" => "social_previews#organization", as: :organization_social_preview get "/social_previews/tag/:id" => "social_previews#tag", as: :tag_social_preview - ### Subscription vanity url - post "membership-action" => "stripe_subscriptions#create" - get "/async_info/base_data", controller: "async_info#base_data", defaults: { format: :json } get "/hello-goodbye-to-the-go-go-go", @@ -245,7 +241,6 @@ Rails.application.routes.draw do get "/security", to: "pages#bounty" get "/survey", to: redirect("https://dev.to/ben/final-thoughts-on-the-state-of-the-web-survey-44nn") get "/now" => "pages#now" - get "/membership" => "pages#membership" get "/events" => "events#index" get "/workshops", to: redirect("events") get "/sponsorship-info" => "pages#sponsorship_faq" @@ -259,7 +254,6 @@ Rails.application.routes.draw do get "/freestickers/edit" => "giveaways#edit" get "/scholarship", to: redirect("/p/scholarships") get "/scholarships", to: redirect("/p/scholarships") - get "/memberships", to: redirect("/membership") get "/shop", to: redirect("https://shop.dev.to/") get "/tag-moderation" => "pages#tag_moderation" get "/community-moderation" => "pages#community_moderation" @@ -271,7 +265,7 @@ Rails.application.routes.draw do scope "p" do pages_actions = %w[rly rlyweb welcome twitter_moniter editor_guide publishing_from_rss_guide information - markdown_basics scholarships wall_of_patrons membership_form badges] + markdown_basics scholarships wall_of_patrons badges] pages_actions.each do |action| get action, action: action, controller: "pages" end diff --git a/spec/requests/pages_spec.rb b/spec/requests/pages_spec.rb index 3fc4dce4c..e38bff7ce 100644 --- a/spec/requests/pages_spec.rb +++ b/spec/requests/pages_spec.rb @@ -58,13 +58,6 @@ RSpec.describe "Pages", type: :request do end end - describe "GET /membership" do - it "has proper headline" do - get "/membership" - expect(response.body).to include("Sustaining Membership") - end - end - describe "GET /welcome" do it "has proper headline" do get "/welcome" diff --git a/spec/requests/stripe_active_cards_spec.rb b/spec/requests/stripe_active_cards_spec.rb index 5856c9ee9..33319ce42 100644 --- a/spec/requests/stripe_active_cards_spec.rb +++ b/spec/requests/stripe_active_cards_spec.rb @@ -29,20 +29,6 @@ RSpec.describe "StripeSubscriptions", type: :request do end end - describe "PATCH StripeActiveCards#update" do - before do - post "/stripe_subscriptions", params: { amount: "12", - stripe_token: stripe_helper.generate_card_token } - end - - it "properly updates the default card" do - first_card = Stripe::Customer.retrieve(user.stripe_id_code).sources.first - put "/stripe_active_cards/#{first_card.id}" - source = Stripe::Customer.retrieve(user.stripe_id_code).default_source - expect(source).to eq(first_card.id) - end - end - describe "DESTROY StripeActiveCards#destroy" do context "when a valid request is made" do before do @@ -65,28 +51,5 @@ RSpec.describe "StripeSubscriptions", type: :request do expect(customer.sources.all.count).to eq(0) end end - - context "when a user only has one card and one subscription" do - before do - valid_instance(user) - post "/stripe_subscriptions", params: { amount: 12 } - customer = Stripe::Customer.retrieve(user.stripe_id_code) - original_card_id = customer.sources.all(object: "card").first.id - delete "/stripe_active_cards/#{original_card_id}" - end - - it "provides the proper flash error" do - expect(flash[:error]).to include("Can't remove card if you have an active membership.") - end - - it "redirects to billing page" do - expect(response).to redirect_to("/settings/billing") - end - - it "does not delete the card" do - customer = Stripe::Customer.retrieve(user.stripe_id_code) - expect(customer.sources.all.count).to eq(1) - end - end end end diff --git a/spec/requests/stripe_subscriptions_spec.rb b/spec/requests/stripe_subscriptions_spec.rb deleted file mode 100644 index fd902ff04..000000000 --- a/spec/requests/stripe_subscriptions_spec.rb +++ /dev/null @@ -1,171 +0,0 @@ -require "rails_helper" - -RSpec.describe "StripeSubscriptions", type: :request do - let(:user) { create(:user, :super_admin) } - let(:mock_instance) { instance_double(MembershipService) } - let(:stripe_helper) { StripeMock.create_test_helper } - - before do - StripeMock.start - sign_in user - end - - after { StripeMock.stop } - - describe "POST StripeSubscriptions#create" do - context "when a valid request is made" do - # Amount is a string here because Stripe returns a string when form is submitted - before do - post "/stripe_subscriptions", params: { - amount: "12", - stripe_token: stripe_helper.generate_card_token - } - end - - it "creates a customer in Stripe and assigns it to the correct user" do - customer = Stripe::Customer.retrieve(user.stripe_id_code) - expect(customer.is_a?(Stripe::Customer)).to eq(true) - end - - it "assigns the proper role based on the amount" do - expect(user.roles.last.name).to eq("level_2_member") - end - - it "updates the user's monthly_dues with the proper amount" do - expect(user.monthly_dues).to eq(1200) - end - - it "redirects to /settings/membership" do - expect(response.body).to include("Thank you so much") - end - end - - it "can't accept anything less than $1" do - post "/stripe_subscriptions", params: { - amount: rand(100) / 100, - stripe_token: stripe_helper.generate_card_token - } - expect(response).to redirect_to("/membership") - user.reload - expect(user.stripe_id_code).to eq(nil) - expect(user.roles.count).to eq(1) - end - - # only one type of invalid request right now - context "when an invalid request is made" do - it "redirects to /enter if there's no current_user" do - sign_out user - post "/stripe_subscriptions", params: { amount: "1" } - expect(response).to redirect_to("/enter") - end - - it "errors if amount is less than 0" do - post "/stripe_subscriptions", params: { amount: "-1" } - expect(response).to redirect_to("/membership") - end - - it "errors if amount is 0" do - post "/stripe_subscriptions", params: { amount: "0" } - expect(response).to redirect_to("/membership") - end - - it "denies requests without credit card" do - post "/stripe_subscriptions", params: { amount: "25" } - expect(response).to redirect_to("/membership") - # user.reload - # expect(user.stripe_id_code).to be(nil) - end - end - - it "handles errors if MembershipService#subscribe_customer fails" do - allow(MembershipService).to receive(:new).and_return(mock_instance) - allow(mock_instance).to receive(:subscribe_customer).and_return(nil) - post "/stripe_subscriptions", params: { amount: "1" } - expect(response).to redirect_to("/membership") - end - end - - describe "PUT StripeSubscriptions#update" do - before do - user.add_role(:level_2_member) - end - - context "when there's a subscription for update" do - before do - post "/stripe_subscriptions", params: { - amount: "12", - stripe_token: stripe_helper.generate_card_token - } - end - - it "assigns the proper role with a new subscription" do - put "/stripe_subscriptions/current_user", params: { - amount: "30", - stripe_token: stripe_helper.generate_card_token - } - expect(user.has_role?("level_4_member")).to eq(true) - end - - it "updates the user's monthly_dues with the proper amount" do - put "/stripe_subscriptions/current_user", params: { - amount: "30", - stripe_token: stripe_helper.generate_card_token - } - user.reload - expect(user.monthly_dues).to eq(3000) - end - - it "handles errors if MembershipService#update_subscription fails" do - allow(MembershipService).to receive(:new).and_return(mock_instance) - allow(mock_instance).to receive(:update_subscription).and_return(nil) - put "/stripe_subscriptions/current_user", params: { - amount: "30", - stripe_token: stripe_helper.generate_card_token - } - expect(response).to redirect_to("/settings/membership") - end - - it "can't accept anything less than $1" do - put "/stripe_subscriptions/current_user", params: { amount: rand(100) / 100 } - expect(response).to redirect_to("/settings/billing") - user.reload - expect(user.stripe_id_code).not_to eq(nil) - expect(user.has_role?(:level_1_member)).to eq(false) - end - end - end - - describe "DESTROY StripeSubscriptions#destroy" do - before do - user.add_role(:level_2_member) - post "/stripe_subscriptions", params: { - amount: "12", - stripe_token: stripe_helper.generate_card_token - } - end - - context "when a valid request is made" do - it "deletes membership" do - delete "/stripe_subscriptions/current_user", params: { - stripe_token: stripe_helper.generate_card_token - } - expect(user.has_role?("level_2_member")).to eq(false) - end - - it "returns user monthly dues to zero" do - delete "/stripe_subscriptions/current_user", params: { - stripe_token: stripe_helper.generate_card_token - } - user.reload - expect(user.monthly_dues).to eq(0) - end - - it "handles errors if MembershipService#unsubscribe_customer fails" do - allow(MembershipService).to receive(:new).and_return(mock_instance) - allow(mock_instance).to receive(:unsubscribe_customer).and_return(nil) - delete "/stripe_subscriptions/current_user" - expect(response).to redirect_to("/settings") - end - end - end -end diff --git a/spec/requests/user_settings_spec.rb b/spec/requests/user_settings_spec.rb index c2187bc02..502fd4cc5 100644 --- a/spec/requests/user_settings_spec.rb +++ b/spec/requests/user_settings_spec.rb @@ -15,7 +15,7 @@ RSpec.describe "UserSettings", type: :request do before { login_as user } it "renders various settings tabs properly" do - %w[organization switch-organizations billing misc account].each do |tab| + %w[organization switch-organizations misc account].each do |tab| get "/settings/#{tab}" expect(response.body).to include("Settings for") end @@ -26,17 +26,6 @@ RSpec.describe "UserSettings", type: :request do to raise_error(ActiveRecord::RecordNotFound) end - it "doesn't let user access membership if user has no monthly_dues" do - get "/settings/membership" - expect(response.body).not_to include("Settings for") - end - - it "allows user with monthly_dues to access membership" do - user.update_column(:monthly_dues, 5) - get "/settings/membership" - expect(response.body).to include("Settings for") - end - it "allows users to visit the account page" do get "/settings/account" expect(response.body).to include("Danger Zone")