import Foundation /// Kategorien für Deck-Reports — entspricht serverseitig /// `report_category` Enum in `marketplace.deck_reports`. enum ReportCategory: String, Codable, CaseIterable { case spam case copyright case nsfw case misinformation case hate case other var label: String { switch self { case .spam: "Spam" case .copyright: "Urheberrecht" case .nsfw: "Anstößige Inhalte" case .misinformation: "Falschinformation" case .hate: "Hass / Diskriminierung" case .other: "Sonstiges" } } } /// Body für `POST /api/v1/marketplace/decks/:slug/report`. struct ReportDeckBody: Encodable { let category: ReportCategory let body: String? let versionId: String? let cardContentHash: String? enum CodingKeys: String, CodingKey { case category case body case versionId case cardContentHash } } /// Antwort vom Report-Endpoint. struct ReportDeckResponse: Decodable { let ok: Bool let alreadyReported: Bool let reportId: String? enum CodingKeys: String, CodingKey { case ok case alreadyReported = "already_reported" case reportId = "report_id" } } /// Eintrag aus `GET /api/v1/marketplace/me/blocks`. struct BlockEntry: Decodable, Identifiable { let authorSlug: String let displayName: String let blockedAt: Date var id: String { authorSlug } enum CodingKeys: String, CodingKey { case authorSlug = "author_slug" case displayName = "display_name" case blockedAt = "blocked_at" } } struct BlockListResponse: Decodable { let blocks: [BlockEntry] } /// Aktuelle Version eines `OwnedMarketplaceDeck` — semver + Karten-Count. struct OwnedMarketplaceVersion: Decodable { let versionId: String let semver: String let cardCount: Int let publishedAt: Date? enum CodingKeys: String, CodingKey { case versionId = "version_id" case semver case cardCount = "card_count" case publishedAt = "published_at" } } /// Eintrag aus `GET /api/v1/marketplace/me/decks` — Re-Publish-Flow. struct OwnedMarketplaceDeck: Decodable, Identifiable { let slug: String let title: String let description: String? let language: String? let category: String? let license: String let priceCredits: Int let isTakedown: Bool let createdAt: Date let latestVersion: OwnedMarketplaceVersion? var id: String { slug } enum CodingKeys: String, CodingKey { case slug case title case description case language case category case license case priceCredits = "price_credits" case isTakedown = "is_takedown" case createdAt = "created_at" case latestVersion = "latest_version" } } struct OwnedMarketplaceDecksResponse: Decodable { let decks: [OwnedMarketplaceDeck] }