Group series routes under a shared r.on block
Assisted-by: Claude Opus 4.6 via Claude Code
change ypusvxlwwrkzonmppxzpnmvomqurmzvq
commit 69048185df5204142b130d01f02026b1696ca9b7
author Alpha Chen <alpha@kejadlen.dev>
date
parent xqzxlznw
diff --git a/lib/ketchup/web.rb b/lib/ketchup/web.rb
index e9b4414..b5b14f3 100644
--- a/lib/ketchup/web.rb
+++ b/lib/ketchup/web.rb
@@ -54,56 +54,8 @@ class Web < Roda
       end
     end
 
-    r.on "series", Integer do |series_id|
-      series = @user.series_dataset.where(id: series_id).sole
-
-      r.get do
-        Views::Dashboard.new(current_user: @user, series:).call
-      end
-
-      r.patch do
-        updates = {}
-
-        if r.params.key?("note")
-          note = r.params["note"].to_s.strip
-          r.halt 422 if note.empty?
-          updates[:note] = note
-        end
-
-        if r.params.key?("interval_count") || r.params.key?("interval_unit")
-          interval_count = r.params.key?("interval_count") ? r.params["interval_count"].to_i : series.interval_count
-          interval_unit = r.params.key?("interval_unit") ? r.params["interval_unit"].to_s : series.interval_unit
-          r.halt 422 unless Series::INTERVAL_UNITS.include?(interval_unit)
-          r.halt 422 unless interval_count >= 1
-          updates[:interval_count] = interval_count
-          updates[:interval_unit] = interval_unit
-        end
-
-        if r.params.key?("due_date")
-          begin
-            due_date = Date.parse(r.params["due_date"].to_s)
-          rescue Date::Error
-            r.halt 422
-          end
-        end
-
-        DB.transaction do
-          series.update(updates) unless updates.empty?
-          if due_date
-            active = series.active_task
-            active.update(due_date: due_date) if active
-          end
-        end
-
-        response["content-type"] = "application/json"
-        result = updates.transform_keys(&:to_s)
-        result["due_date"] = due_date.to_s if due_date
-        result.to_json
-      end
-
-    end
-
-    r.post "series" do
+    r.on "series" do
+      r.post do
         note = r.params["note"].to_s.strip
         interval_unit = r.params["interval_unit"].to_s
         interval_count = r.params["interval_count"].to_i
@@ -128,6 +80,55 @@ class Web < Roda
         )
 
         r.redirect "/series/#{series.id}"
+      end
+
+      r.on Integer do |series_id|
+        series = @user.series_dataset.where(id: series_id).sole
+
+        r.get do
+          Views::Dashboard.new(current_user: @user, series:).call
+        end
+
+        r.patch do
+          updates = {}
+
+          if r.params.key?("note")
+            note = r.params["note"].to_s.strip
+            r.halt 422 if note.empty?
+            updates[:note] = note
+          end
+
+          if r.params.key?("interval_count") || r.params.key?("interval_unit")
+            interval_count = r.params.key?("interval_count") ? r.params["interval_count"].to_i : series.interval_count
+            interval_unit = r.params.key?("interval_unit") ? r.params["interval_unit"].to_s : series.interval_unit
+            r.halt 422 unless Series::INTERVAL_UNITS.include?(interval_unit)
+            r.halt 422 unless interval_count >= 1
+            updates[:interval_count] = interval_count
+            updates[:interval_unit] = interval_unit
+          end
+
+          if r.params.key?("due_date")
+            begin
+              due_date = Date.parse(r.params["due_date"].to_s)
+            rescue Date::Error
+              r.halt 422
+            end
+          end
+
+          DB.transaction do
+            series.update(updates) unless updates.empty?
+            if due_date
+              active = series.active_task
+              active.update(due_date: due_date) if active
+            end
+          end
+
+          response["content-type"] = "application/json"
+          result = updates.transform_keys(&:to_s)
+          result["due_date"] = due_date.to_s if due_date
+          result.to_json
+        end
+      end
     end
   end
 end