Group series routes under a shared r.on block
Assisted-by: Claude Opus 4.6 via Claude Code
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