From fd1556b2986b07e7188642f62695e20faa1c611b Mon Sep 17 00:00:00 2001 From: Kevin McConnell Date: Mon, 10 Feb 2025 09:09:32 +0000 Subject: [PATCH] Decision can belong to subsequently created bubble --- .../bubbles/recovers_controller.rb | 4 +--- app/models/bubble/statuses.rb | 19 ++++++++------- app/views/bubbles/show.html.erb | 3 ++- test/models/bubble/statuses_test.rb | 23 +++++++++++++++++++ 4 files changed, 37 insertions(+), 12 deletions(-) diff --git a/app/controllers/bubbles/recovers_controller.rb b/app/controllers/bubbles/recovers_controller.rb index 5fccfeef2..530592762 100644 --- a/app/controllers/bubbles/recovers_controller.rb +++ b/app/controllers/bubbles/recovers_controller.rb @@ -2,8 +2,6 @@ class Bubbles::RecoversController < ApplicationController include BubbleScoped, BucketScoped def create - if bubble = Bubble.recover_recently_abandoned_creation(Current.user) - redirect_to bubble - end + redirect_to @bubble.recover_abandoned_creation end end diff --git a/app/models/bubble/statuses.rb b/app/models/bubble/statuses.rb index ef9c82a7c..7c01ed012 100644 --- a/app/models/bubble/statuses.rb +++ b/app/models/bubble/statuses.rb @@ -7,15 +7,13 @@ module Bubble::Statuses scope :published_or_drafted_by, ->(user) { where(status: :published).or(where(status: :drafted, creator: user)) } end - class_methods do - def recently_abandoned_creation(user) - creating.where(creator: user).where("created_at != updated_at").where(updated_at: 1.day.ago..).last - end + def can_recover_abandoned_creation? + abandoned_creations.where(updated_at: 1.day.ago..).any? + end - def recover_recently_abandoned_creation(user) - recently_abandoned_creation(user).tap do |bubble| - creating.where(creator: user).excluding(bubble).destroy_all - end + def recover_abandoned_creation + abandoned_creations.last.tap do |bubble| + Bubble.creating.where(creator: creator).excluding(bubble).destroy_all end end @@ -29,4 +27,9 @@ module Bubble::Statuses end end end + + private + def abandoned_creations + Bubble.creating.where(creator: creator).where("created_at != updated_at").excluding(self) + end end diff --git a/app/views/bubbles/show.html.erb b/app/views/bubbles/show.html.erb index 6204ebfb1..b9e940bb6 100644 --- a/app/views/bubbles/show.html.erb +++ b/app/views/bubbles/show.html.erb @@ -1,7 +1,7 @@ <% @page_title = @bubble.title %> <% content_for :header do %> - <% if @bubble.creating? && (abandoned = Bubble.recently_abandoned_creation(Current.user)) && abandoned != @bubble %> + <% if @bubble.can_recover_abandoned_creation? %>
You have an unsaved bubble. Would you like to continue where you left off? @@ -10,6 +10,7 @@ <% end %>
<% end %> + <% if @bubble.drafted? %>
diff --git a/test/models/bubble/statuses_test.rb b/test/models/bubble/statuses_test.rb index 0748c9267..a63525b2d 100644 --- a/test/models/bubble/statuses_test.rb +++ b/test/models/bubble/statuses_test.rb @@ -24,4 +24,27 @@ class Bubble::StatusesTest < ActiveSupport::TestCase assert_includes Bubble.published_or_drafted_by(users(:kevin)), bubble assert_includes Bubble.published_or_drafted_by(users(:jz)), bubble end + + test "can_recover_abandoned_creation?" do + bubble = buckets(:writebook).bubbles.create! creator: users(:kevin) + unsaved_bubble = buckets(:writebook).bubbles.new creator: users(:kevin) + + assert_not unsaved_bubble.can_recover_abandoned_creation? + + bubble.update!(title: "Something worth keeping") + assert unsaved_bubble.can_recover_abandoned_creation? + end + + test "recover_abandoned_creation" do + bubble_edited = buckets(:writebook).bubbles.create! creator: users(:kevin) + bubble_edited.update!(title: "Something worth keeping") + + bubble_not_edited = buckets(:writebook).bubbles.create! creator: users(:kevin) + + assert bubble_not_edited.can_recover_abandoned_creation? + + assert_equal bubble_edited, bubble_not_edited.recover_abandoned_creation + + assert_raises(ActiveRecord::RecordNotFound) { bubble_not_edited.reload } + end end