import Foundation /// Card-DTO. Wire-Format aus `cards/apps/api/src/lib/dto.ts:toCardDto` /// und `cards/packages/cards-domain/src/schemas/card.ts`. struct Card: Codable, Identifiable, Hashable, Sendable { let id: String let deckId: String let userId: String let type: CardType let fields: [String: String] let mediaRefs: [String] let contentHash: String? let createdAt: Date let updatedAt: Date enum CodingKeys: String, CodingKey { case id case deckId = "deck_id" case userId = "user_id" case type case fields case mediaRefs = "media_refs" case contentHash = "content_hash" case createdAt = "created_at" case updatedAt = "updated_at" } } /// Card-Type-Enum. Vollständig aus `CardTypeSchema`. In β-2 rendern /// wir nur `basic`, `basic-reverse`, `cloze`. Die anderen Types /// kommen in β-3 und β-4 dazu, sind aber jetzt schon decodierbar. enum CardType: String, Codable, Sendable, CaseIterable { case basic case basicReverse = "basic-reverse" case cloze case imageOcclusion = "image-occlusion" case audioFront = "audio-front" case typing case multipleChoice = "multiple-choice" } /// Vereinfachtes Card-Sub-Objekt aus `/reviews/due?deck_id=X`-Response. /// Server liefert nur 4 Felder (id, deckId, type, fields) als Drizzle- /// Joined-Subset — Achtung: `deckId` hier in **camelCase**, nicht /// snake_case wie sonst. struct ReviewCard: Codable, Hashable, Sendable { let id: String let deckId: String let type: CardType let fields: [String: String] }