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 %>
-
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