diff --git a/app/controllers/buckets/subscriptions_controller.rb b/app/controllers/buckets/subscriptions_controller.rb new file mode 100644 index 000000000..9827ce770 --- /dev/null +++ b/app/controllers/buckets/subscriptions_controller.rb @@ -0,0 +1,11 @@ +class Buckets::SubscriptionsController < ApplicationController + include BucketScoped + + def update + if params[:subscribed] == "1" + @bucket.subscribe(Current.user) + else + @bucket.unsubscribe(Current.user) + end + end +end diff --git a/app/models/concerns/subscribable.rb b/app/models/concerns/subscribable.rb index b59f4d97e..92cf92d1c 100644 --- a/app/models/concerns/subscribable.rb +++ b/app/models/concerns/subscribable.rb @@ -11,4 +11,12 @@ module Subscribable def subscribe(user) subscriptions.create_or_find_by!(user: user) end + + def unsubscribe(user) + subscriptions.find_by(user: user)&.destroy! + end + + def subscribed_by?(user) + subscriptions.exists?(user: user) + end end diff --git a/app/views/notifications/settings/_bucket.html.erb b/app/views/notifications/settings/_bucket.html.erb new file mode 100644 index 000000000..25531963d --- /dev/null +++ b/app/views/notifications/settings/_bucket.html.erb @@ -0,0 +1,18 @@ +<%= turbo_frame_tag dom_id(bucket, :subscription) do %> + <%= form_with url: bucket_subscriptions_path(bucket), method: :put, data: { controller: "form"} do |form| %> +
+

+ <%= bucket.name %> +

+ + + + +
+ <% end %> +<% end %> diff --git a/app/views/notifications/settings/show.html.erb b/app/views/notifications/settings/show.html.erb index 56ffea0a0..bffe02a7d 100644 --- a/app/views/notifications/settings/show.html.erb +++ b/app/views/notifications/settings/show.html.erb @@ -20,20 +20,5 @@ <% end %>
- <% @buckets.each do | bucket | %> -
-

- <%= bucket.name %> -

- - - - -
- <% end %> + <%= render partial: "notifications/settings/bucket", collection: @buckets %>
- diff --git a/config/routes.rb b/config/routes.rb index 57c7d80a7..ef5cd2e36 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -33,6 +33,10 @@ Rails.application.routes.draw do end resources :buckets do + scope module: :buckets do + resource :subscriptions + end + resources :bubbles do resources :boosts resources :comments do diff --git a/test/controllers/buckets/subscriptions_controller_test.rb b/test/controllers/buckets/subscriptions_controller_test.rb new file mode 100644 index 000000000..e6d75778c --- /dev/null +++ b/test/controllers/buckets/subscriptions_controller_test.rb @@ -0,0 +1,25 @@ +require "test_helper" + +class Buckets::SubscriptionsControllerTest < ActionDispatch::IntegrationTest + setup do + sign_in_as :jz + end + + test "subscribing to a bucket" do + assert_changes -> { buckets(:writebook).subscribed_by?(users(:jz)) }, from: false, to: true do + put bucket_subscriptions_url(buckets(:writebook)), params: { subscribed: "1" } + end + + assert_response :success + end + + test "unsubscribing from a bucket" do + buckets(:writebook).subscribe(users(:jz)) + + assert_changes -> { buckets(:writebook).subscribed_by?(users(:jz)) }, from: true, to: false do + put bucket_subscriptions_url(buckets(:writebook)), params: { subscribed: "0" } + end + + assert_response :success + end +end