diff --git a/src/storage.js b/src/storage.js index bc5578e..288c270 100644 --- a/src/storage.js +++ b/src/storage.js @@ -48,12 +48,17 @@ function isUsableStack(stack) { ); } +// entry.codes ist wie stack.codes optional: ein Stand aus einer Fassung vor +// dieser Erweiterung kennt das Feld nicht und gilt deshalb nicht als +// unstimmig (siehe isUsableStack). Ist es vorhanden, muss es eine Liste von +// Zeichenketten sein. function isUsableEntry(entry) { return ( isPlainObject(entry) && isPositiveInteger(entry.entryId) && typeof entry.stackId === 'string' && isPlainObject(entry.spec) + && (entry.codes === undefined || isStringArray(entry.codes)) ); } @@ -68,7 +73,14 @@ function isUsableEntry(entry) { * Der gespeicherte Stapelzaehler (stack.count) wird nie uebernommen, sondern * beim Laden stets aus der Zahl der ihm tatsaechlich zugeordneten Eintraege * neu berechnet - er dient in isUsableStack nur noch dazu, grob kaputten - * Inhalt schon an der Typprueung scheitern zu lassen. Zeigt ein Eintrag auf + * Inhalt schon an der Typprueung scheitern zu lassen. Genauso wird die + * gespeicherte Codemenge eines Stapels (stack.codes) nie uebernommen, sondern + * aus den Codes seiner tatsaechlich zugeordneten Eintraege (entry.codes) neu + * zusammengesetzt - dieselbe Ableitung, die session.js nach jedem Umsortieren + * oder Entfernen eines Eintrags vornimmt (siehe recomputeStackCodes dort); + * ein zwischenzeitlich per Hand korrigierter, aber vor dieser Erweiterung + * gesicherter Stand wuerde sonst einen laengst nicht mehr zutreffenden Code + * am falschen Stapel wiederherstellen. Zeigt ein Eintrag auf * eine Stapelkennung, die es nicht gibt, kommt eine Eintragsnummer oder eine * Stapelkennung mehrfach vor, oder ist nextEntryId nicht groesser als jede * vorhandene Eintragsnummer, ist der Inhalt in sich unstimmig und wird @@ -96,10 +108,16 @@ export function loadSession(store) { if (entryIds.some((entryId) => entryId >= parsed.nextEntryId)) return null; for (const stack of parsed.stacks) { - stack.count = parsed.entries.filter((entry) => entry.stackId === stack.id).length; - // Ein Stand aus einer aelteren Fassung ohne stack.codes gilt als - // Stapel ohne bekannte Codes, nicht als unstimmiger Zustand. - if (!Array.isArray(stack.codes)) stack.codes = []; + const stackEntries = parsed.entries.filter((entry) => entry.stackId === stack.id); + stack.count = stackEntries.length; + // Codemenge aus den Eintraegen ableiten statt dem gesicherten Wert zu + // vertrauen (siehe Kommentar oben). Ein Eintrag aus einer Fassung ohne + // entry.codes traegt keine Codes bei, gilt aber nicht als unstimmig. + const codes = new Set(); + for (const entry of stackEntries) { + for (const code of entry.codes ?? []) codes.add(code); + } + stack.codes = [...codes]; } return parsed;