Files
omnivore/apple/OmnivoreKit/Sources/Services/DataService/Queries/NewsletterEmailsQuery.swift
2022-04-21 20:27:10 -07:00

65 lines
1.8 KiB
Swift

import Combine
import CoreData
import Foundation
import Models
import SwiftGraphQL
public extension DataService {
func newsletterEmailsPublisher() -> AnyPublisher<[NSManagedObjectID], ServerError> {
enum QueryResult {
case success(result: [InternalNewsletterEmail])
case error(error: String)
}
let newsletterEmailSelection = Selection.NewsletterEmail {
InternalNewsletterEmail(
emailId: try $0.id(),
email: try $0.address(),
confirmationCode: try $0.confirmationCode()
)
}
let selection = Selection<QueryResult, Unions.NewsletterEmailsResult> {
try $0.on(
newsletterEmailsSuccess: .init {
QueryResult.success(result: try $0.newsletterEmails(selection: newsletterEmailSelection.list))
},
newsletterEmailsError: .init {
QueryResult.error(error: try $0.errorCodes().description)
}
)
}
let query = Selection.Query {
try $0.newsletterEmails(selection: selection)
}
let path = appEnvironment.graphqlPath
let headers = networker.defaultHeaders
return Deferred {
Future { promise in
send(query, to: path, headers: headers) { result in
switch result {
case let .success(payload):
switch payload.data {
case let .success(result: result):
if let newsletterEmailObjectIDs = result.persist(context: self.backgroundContext) {
promise(.success(newsletterEmailObjectIDs))
} else {
promise(.failure(.unknown))
}
case .error:
promise(.failure(.unknown))
}
case .failure:
promise(.failure(.unknown))
}
}
}
}
.receive(on: DispatchQueue.main)
.eraseToAnyPublisher()
}
}