- API-Klasse mit allen CRUD-Operationen für Bookmarks - Login/Authentifizierung mit Bearer Token - Bookmarks abrufen (Liste und Details) - Artikel-Inhalt abrufen - DTO-Strukturen in separate Dateien aufgeteilt - UserDto für Authentifizierung - BookmarkDto für Bookmark-Listen - BookmarkDetailDto mit vollständigen Metadaten - MVVM-Architektur mit @Observable - SettingsViewModel für Anmeldung - BookmarksViewModel für Bookmark-Verwaltung - SwiftUI Views mit modernem Design - SettingsView mit Eingabefeldern und Validierung - BookmarksView mit Pull-to-Refresh und Leerzustand - MainTabView als Navigation - Use Case Pattern implementiert - LoginUseCase für Authentifizierung - GetBookmarksUseCase für Datenabfrage - DefaultUseCaseFactory für Dependency Injection - Fehlerbehandlung und Loading States - Protocol-basierte Architektur für bessere Testbarkeit
82 lines
2.1 KiB
Swift
82 lines
2.1 KiB
Swift
import Foundation
|
|
|
|
struct BookmarkDetailDto: Codable {
|
|
let id: String
|
|
let href: String
|
|
let created: String
|
|
let updated: String
|
|
let state: Int
|
|
let loaded: Bool
|
|
let url: String
|
|
let title: String
|
|
let siteName: String
|
|
let site: String
|
|
let authors: [String]
|
|
let lang: String
|
|
let textDirection: String
|
|
let documentType: String
|
|
let type: String
|
|
let hasArticle: Bool
|
|
let description: String
|
|
let isDeleted: Bool
|
|
let isMarked: Bool
|
|
let isArchived: Bool
|
|
let labels: [String]
|
|
let readProgress: Int
|
|
let resources: Resources
|
|
let links: [Link]
|
|
let wordCount: Int
|
|
let readingTime: Int
|
|
|
|
enum CodingKeys: String, CodingKey {
|
|
case id, href, created, updated, state, loaded, url, title
|
|
case siteName = "site_name"
|
|
case site, authors, lang
|
|
case textDirection = "text_direction"
|
|
case documentType = "document_type"
|
|
case type
|
|
case hasArticle = "has_article"
|
|
case description
|
|
case isDeleted = "is_deleted"
|
|
case isMarked = "is_marked"
|
|
case isArchived = "is_archived"
|
|
case labels
|
|
case readProgress = "read_progress"
|
|
case resources, links
|
|
case wordCount = "word_count"
|
|
case readingTime = "reading_time"
|
|
}
|
|
|
|
struct Resources: Codable {
|
|
let article: Resource
|
|
let icon: ResourceWithDimensions
|
|
let image: ResourceWithDimensions
|
|
let log: Resource
|
|
let props: Resource
|
|
let thumbnail: ResourceWithDimensions
|
|
}
|
|
|
|
struct Resource: Codable {
|
|
let src: String
|
|
}
|
|
|
|
struct ResourceWithDimensions: Codable {
|
|
let src: String
|
|
let width: Int
|
|
let height: Int
|
|
}
|
|
|
|
struct Link: Codable {
|
|
let url: String
|
|
let domain: String
|
|
let title: String
|
|
let isPage: Bool
|
|
let contentType: String
|
|
|
|
enum CodingKeys: String, CodingKey {
|
|
case url, domain, title
|
|
case isPage = "is_page"
|
|
case contentType = "content_type"
|
|
}
|
|
}
|
|
} |