From 300801117538e57e08c1073633e1f38bf2154e17 Mon Sep 17 00:00:00 2001 From: Jorge Manrubia Date: Mon, 5 Jan 2026 15:57:48 +0100 Subject: [PATCH] Make sure new card drafts are refreshed when reused To deal with old timestamps messing with card ordering and so. https://app.fizzy.do/5986089/cards/3495 --- app/controllers/cards_controller.rb | 2 +- app/models/user/accessor.rb | 6 ++++++ test/models/user/accessor_test.rb | 32 +++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/app/controllers/cards_controller.rb b/app/controllers/cards_controller.rb index daf22a5bc..4b7b4748f 100644 --- a/app/controllers/cards_controller.rb +++ b/app/controllers/cards_controller.rb @@ -12,7 +12,7 @@ class CardsController < ApplicationController def create respond_to do |format| format.html do - card = @board.cards.find_or_create_by!(creator: Current.user, status: "drafted") + card = Current.user.draft_new_card_at(@board) redirect_to card end diff --git a/app/models/user/accessor.rb b/app/models/user/accessor.rb index a9cc5e459..b9744a667 100644 --- a/app/models/user/accessor.rb +++ b/app/models/user/accessor.rb @@ -11,6 +11,12 @@ module User::Accessor after_create_commit :grant_access_to_boards, unless: :system? end + def draft_new_card_at(board) + board.cards.find_or_initialize_by(creator: self, status: "drafted").tap do |card| + card.update!(created_at: Time.current, updated_at: Time.current, last_active_at: Time.current) + end + end + private def grant_access_to_boards Access.insert_all account.boards.all_access.pluck(:id).collect { |board_id| { id: ActiveRecord::Type::Uuid.generate, board_id: board_id, user_id: id, account_id: account.id } } diff --git a/test/models/user/accessor_test.rb b/test/models/user/accessor_test.rb index 95cb84edb..300c2c741 100644 --- a/test/models/user/accessor_test.rb +++ b/test/models/user/accessor_test.rb @@ -12,4 +12,36 @@ class User::AccessorTest < ActiveSupport::TestCase system_user = User.create!(account: accounts("37s"), role: "system", name: "Test System User") assert_empty system_user.boards end + + test "creating a new card draft sets current timestamps" do + user = users(:david) + board = boards(:writebook) + + freeze_time do + card = user.draft_new_card_at(board) + + assert card.persisted? + assert card.drafted? + assert_equal user, card.creator + assert_equal board, card.board + assert_equal Time.current, card.created_at + assert_equal Time.current, card.updated_at + assert_equal Time.current, card.last_active_at + end + end + + test "reusing an existing card draft refreshes timestamps" do + existing_draft = cards(:unfinished_thoughts) + user = existing_draft.creator + board = existing_draft.board + + freeze_time do + card = user.draft_new_card_at(board) + + assert_equal existing_draft, card + assert_equal Time.current, card.created_at + assert_equal Time.current, card.updated_at + assert_equal Time.current, card.last_active_at + end + end end