ReadKeep/readeck/Domain/UseCase/CreateBookmarkUseCase.swift
Ilyas Hallak 930779169b feat: introduce protocol-based UseCase architecture and mock factory
- Add protocols for all UseCases and implement them in their respective classes
- Add DefaultUseCaseFactory and MockUseCaseFactory for dependency injection
- Implement all mock UseCases with dummy data
- Start migration of view models and views to protocol-based UseCase injection (not all migrated yet)
- Refactor previews and some initializers for easier testing
- Move SectionHeader to Components, update server settings UI text
- Add sample article.html for mock content
2025-07-18 00:46:07 +02:00

60 lines
2.2 KiB
Swift

import Foundation
protocol PCreateBookmarkUseCase {
func execute(createRequest: CreateBookmarkRequest) async throws -> String
func createFromURL(_ url: String) async throws -> String
func createFromURLWithTitle(_ url: String, title: String) async throws -> String
func createFromURLWithLabels(_ url: String, labels: [String]) async throws -> String
func createFromClipboard() async throws -> String?
}
class CreateBookmarkUseCase: PCreateBookmarkUseCase {
private let repository: PBookmarksRepository
init(repository: PBookmarksRepository) {
self.repository = repository
}
func execute(createRequest: CreateBookmarkRequest) async throws -> String {
// URL-Validierung
guard URL(string: createRequest.url) != nil else {
throw CreateBookmarkError.invalidURL
}
return try await repository.createBookmark(createRequest: createRequest)
}
// Convenience methods für häufige Use Cases
func createFromURL(_ url: String) async throws -> String {
let request = CreateBookmarkRequest.fromURL(url)
return try await execute(createRequest: request)
}
func createFromURLWithTitle(_ url: String, title: String) async throws -> String {
let request = CreateBookmarkRequest.fromURLWithTitle(url, title: title)
return try await execute(createRequest: request)
}
func createFromURLWithLabels(_ url: String, labels: [String]) async throws -> String {
let request = CreateBookmarkRequest.fromURLWithLabels(url, labels: labels)
return try await execute(createRequest: request)
}
func createFromClipboard() async throws -> String? {
return nil
// URL aus Zwischenablage holen (falls verfügbar)
/*#if canImport(UIKit)
import UIKit
guard let clipboardString = UIPasteboard.general.string,
URL(string: clipboardString) != nil else {
return nil
}
let request = CreateBookmarkRequest.fromURL(clipboardString)
return try await execute(createRequest: request)
#else
return nil
#endif*/
}
}