Files
bambuddy/backend
MartinNYHC 21fd476668 Ask Spoolman which extra fields it has, once (issue #2983)
Bambuddy checked whether one of its four custom spool fields existed with
    GET /field/spool/{name}. Spoolman has never served that. Its API declares
    only POST and DELETE at that path -- confirmed against the live server's
    own OpenAPI document -- so the probe answered 405 Method Not Allowed
    every time and the check could not succeed on any version.

    Every call therefore fell through to POST /field/spool/{name}, and that
    endpoint is an upsert rather than a create. It answers 200 whether or not
    the field is already there, so a field the user had renamed, retyped or
    given a default to in Spoolman's own UI was reset to Bambuddy's version
    of it, and an untrue "Created Spoolman extra field" was logged beside it.
    The reporter's log carried 60 of those lines over three days -- once per
    field per client init, which is every restart and every settings save.

    Existence now comes from GET /field/spool, the listing endpoint, matched
    on each row's `key`. Matching on `key` rather than the display `name` is
    the part that fixes the overwrite: a renamed field is the same field, and
    reading it as a missing one is what re-created it. A field that already
    exists is now left completely alone.

    The listing is read once per client and banked, so registering all four
    fields costs one request instead of four, and a client that has already
    looked makes none at all. Only a successful read is banked -- a client
    that could not reach the listing asks again for the next field it has not
    seen, so one transient failure does not leave it posting blind, and
    overwriting, for the rest of its life.

    An unreadable listing still falls back to attempting the POST. Registration
    is best-effort by contract: it must not turn a write that might still
    succeed into one that never happens, so an unexpected Spoolman build is no
    worse off than before.

    Measured against Spoolman 0.23.1: a field renamed to "Bambu RFID Tag"
    survives a full registration pass that previously reset it, the pass makes
    one GET and one POST for the single genuinely-missing field where it used
    to make four POSTs, and a second pass on the same client makes no requests
    at all.

    The fake in test_spoolman_extra_field_registration_2903 modelled the
    per-field path as a working probe, which is the assumption this bug was
    built on; it now answers 405 as the real server does, and its assertions
    follow the listing. 18 new tests cover the rest, 10 of which fail against
    the old code.
2026-08-28 12:43:58 +02:00
..