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 9e1dc490b2be2..edccfba3e1b0e 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 @@ def badge 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 3c6ea2c9e7a75..0000000000000 --- 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 ccbf230578950..0000000000000 --- 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 b9b1d20b8a4f7..0000000000000 --- 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 8d6cd71f811ca..0000000000000 --- 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 90f9ad85a5dec..512a60b1f7c6e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -126,7 +126,6 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 3fc4dce4cf7c4..e38bff7cef68e 100644 --- a/spec/requests/pages_spec.rb +++ b/spec/requests/pages_spec.rb @@ -58,13 +58,6 @@ 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 5856c9ee9aafc..33319ce42d0f4 100644 --- a/spec/requests/stripe_active_cards_spec.rb +++ b/spec/requests/stripe_active_cards_spec.rb @@ -29,20 +29,6 @@ def valid_instance(user = user_one, amount = 1200) 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 @@ def valid_instance(user = user_one, amount = 1200) 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 fd902ff04abc3..0000000000000 --- 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 c2187bc02284b..502fd4cc58ccf 100644 --- a/spec/requests/user_settings_spec.rb +++ b/spec/requests/user_settings_spec.rb @@ -15,7 +15,7 @@ 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 @@ 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")