From f528ea448a62b76771af2bdb6649da2c13c4038f Mon Sep 17 00:00:00 2001 From: Till JS Date: Wed, 13 May 2026 15:46:20 +0200 Subject: [PATCH] fix: PublicDeckOwner.pseudonym ist Bool, nicht String? MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Beim Öffnen eines Marketplace-Decks crashed JSON-Decoder mit typeMismatch (Expected String, found Bool) auf owner.pseudonym. Ursache: Server-Schema (cards/apps/api/src/db/schema/marketplace/ authors.ts) hat pseudonym als `boolean NOT NULL DEFAULT false` — ein Flag, dass der Autor pseudonym auftritt (Anzeigename verbergen). Native hatte das fälschlich als String? (Anzeige-Pseudonym) interpretiert. Fix: - PublicDeckOwner.pseudonym: String? → Bool - decoder.decodeIfPresent(String.self) → decode(Bool.self) ?? false - Test-Fixture: "pseudonym": null → "pseudonym": false Build 3 → 4. Co-Authored-By: Claude Opus 4.7 (1M context) --- Sources/Core/Domain/Marketplace.swift | 8 ++++++-- Tests/UnitTests/MarketplaceDecodingTests.swift | 2 +- project.yml | 6 +++--- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/Sources/Core/Domain/Marketplace.swift b/Sources/Core/Domain/Marketplace.swift index b4f929e..52d1b6f 100644 --- a/Sources/Core/Domain/Marketplace.swift +++ b/Sources/Core/Domain/Marketplace.swift @@ -37,7 +37,11 @@ struct PublicDeckOwner: Codable, Hashable, Sendable { let displayName: String let verifiedMana: Bool let verifiedCommunity: Bool - let pseudonym: String? + /// Flag: Autor tritt pseudonym auf (Anzeigename verbergen). + /// Server-Schema ist `boolean NOT NULL DEFAULT false`. War in v0.8.x + /// fälschlich als `String?` (Anzeige-Pseudonym) interpretiert — + /// führte zu Decoder-typeMismatch beim Öffnen eines Marketplace-Decks. + let pseudonym: Bool enum CodingKeys: String, CodingKey { case slug @@ -53,7 +57,7 @@ struct PublicDeckOwner: Codable, Hashable, Sendable { displayName = try c.decode(String.self, forKey: .displayName) verifiedMana = try c.decode(Bool.self, forKey: .verifiedMana) verifiedCommunity = try c.decode(Bool.self, forKey: .verifiedCommunity) - pseudonym = try c.decodeIfPresent(String.self, forKey: .pseudonym) + pseudonym = (try? c.decode(Bool.self, forKey: .pseudonym)) ?? false } } diff --git a/Tests/UnitTests/MarketplaceDecodingTests.swift b/Tests/UnitTests/MarketplaceDecodingTests.swift index c1d7a80..c86904c 100644 --- a/Tests/UnitTests/MarketplaceDecodingTests.swift +++ b/Tests/UnitTests/MarketplaceDecodingTests.swift @@ -31,7 +31,7 @@ struct MarketplaceDecodingTests { "display_name": "mana-Kuratoren", "verified_mana": true, "verified_community": false, - "pseudonym": null + "pseudonym": false } } """.data(using: .utf8)! diff --git a/project.yml b/project.yml index 2a39639..43a5fe4 100644 --- a/project.yml +++ b/project.yml @@ -55,7 +55,7 @@ targets: path: Sources/Resources/Info.plist properties: CFBundleShortVersionString: "0.1.0" - CFBundleVersion: "3" + CFBundleVersion: "4" CFBundleDevelopmentRegion: de CFBundleDisplayName: Cardecky LSApplicationCategoryType: "public.app-category.education" @@ -111,7 +111,7 @@ targets: properties: CFBundleDisplayName: Als Karte speichern CFBundleShortVersionString: "0.1.0" - CFBundleVersion: "3" + CFBundleVersion: "4" NSExtension: NSExtensionPointIdentifier: com.apple.share-services NSExtensionPrincipalClass: $(PRODUCT_MODULE_NAME).ShareViewController @@ -144,7 +144,7 @@ targets: properties: CFBundleDisplayName: Cardecky Widget CFBundleShortVersionString: "0.1.0" - CFBundleVersion: "3" + CFBundleVersion: "4" NSExtension: NSExtensionPointIdentifier: com.apple.widgetkit-extension entitlements: