diff --git a/apple/OmnivoreKit/Sources/Models/NewsletterEmails.swift b/apple/OmnivoreKit/Sources/Models/NewsletterEmails.swift new file mode 100644 index 000000000..fde1f7017 --- /dev/null +++ b/apple/OmnivoreKit/Sources/Models/NewsletterEmails.swift @@ -0,0 +1,21 @@ +import Foundation + +public class NewsletterEmails { + public let newsletterEmails: [NewsletterEmail] + + public init(newsletterEmails: [NewsletterEmail]) { + self.newsletterEmails = newsletterEmails + } +} + +public struct NewsletterEmail { + public let id: String + public let email: String + public let confirmationCode: String? + + public init(id: String, email: String, confirmationCode: String?) { + self.id = id + self.email = email + self.confirmationCode = confirmationCode + } +} diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Queries/NewsletterEmailsQuery.swift b/apple/OmnivoreKit/Sources/Services/DataService/Queries/NewsletterEmailsQuery.swift new file mode 100644 index 000000000..a9d7fcf28 --- /dev/null +++ b/apple/OmnivoreKit/Sources/Services/DataService/Queries/NewsletterEmailsQuery.swift @@ -0,0 +1,63 @@ +import Combine +import Foundation +import Models +import SwiftGraphQL + +public extension DataService { + func newsletterEmailsPublisher() -> AnyPublisher { + enum QueryResult { + case success(result: NewsletterEmails) + case error(error: String) + } + + let newsletterEmailSelection = Selection.NewsletterEmail { + NewsletterEmail( + id: try $0.id(), + email: try $0.address(), + confirmationCode: try $0.confirmationCode() + ) + } + + let selection = Selection { + try $0.on( + newsletterEmailsSuccess: .init { + QueryResult.success(result: + NewsletterEmails( + newsletterEmails: 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): + promise(.success(result)) + case .error: + promise(.failure(.unknown)) + } + case .failure: + promise(.failure(.unknown)) + } + } + } + } + .receive(on: DispatchQueue.main) + .eraseToAnyPublisher() + } +}