Files
bambuddy/backend
maziggy 558159c95c fix(queue): stop a library-file delete from destroying the jobs queued against it (#2819)
Nothing tied a library file to the queue rows pointing at it, and the FK
    that describes the relationship is ON DELETE CASCADE -- which SQLite does
    not enforce and PostgreSQL does. So the same fault had two faces: rows
    left pointing at a file that no longer existed, failing at the printer
    with "Library file not found" days later, or rows deleted outright with
    no error and no history.

    Two routes into it, both fixed by taking the queue off the file before
    the row goes.

    Dispatch (the reported case): quantity>1 on the printer-card
    upload-and-print flow puts cleanup_library_after_dispatch on every copy,
    and _clone_queue_item copies library_file_id onto batch clones, so the
    first dispatch consumed the file the rest were waiting on. The copies are
    now pointed at the archive that dispatch just created -- it holds its own
    copy of the 3MF -- and the consume flag is cleared on them. A copy already
    printing from its own archive keeps it, a finished one keeps its outcome,
    and a cross-model item (#671) keeps any candidate this does not consume.

    Deletion: the File Manager, bulk delete, folder delete, emptying the trash
    and the retention sweeper all removed rows with queued work against them.
    Folder delete did not even clear the cross-model candidates, because the
    file-id walk it already performs threw its result away. Jobs waiting on a
    deleted file are now cancelled at that moment, naming the file, and every
    other row referring to it is detached rather than destroyed -- print
    history and batch progress are counted from those rows. A job that is
    printing is left alone: what is deleted is the library copy, not the copy
    on the machine. The trash is reversible so it still changes nothing about
    the queue, and a job dispatched while its file is in the trash now says so
    instead of "not found".

    Verified row for row on PostgreSQL 16 as well as SQLite: without this,
    PostgreSQL deletes every queue row referencing the file.
2026-08-15 14:56:41 +02:00
..