From f6ac43373e52f4943a09ffa9c89791248e63f30f Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Fri, 25 Feb 2022 13:26:41 -0800 Subject: [PATCH] add createNewsletterEmailPublisher --- .../CreateNewsletterEmailMutation.swift | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 apple/OmnivoreKit/Sources/Services/DataService/Mutations/CreateNewsletterEmailMutation.swift diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/CreateNewsletterEmailMutation.swift b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/CreateNewsletterEmailMutation.swift new file mode 100644 index 000000000..b8028e47e --- /dev/null +++ b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/CreateNewsletterEmailMutation.swift @@ -0,0 +1,60 @@ +import Combine +import Foundation +import Models +import SwiftGraphQL + +public extension DataService { + func createNewsletterEmailPublisher() -> AnyPublisher { + enum MutationResult { + case saved(newsletterEmail: NewsletterEmail) + case error(errorCode: Enums.CreateNewsletterEmailErrorCode) + } + + let selection = Selection { + try $0.on( + createNewsletterEmailSuccess: .init { + .saved(newsletterEmail: try $0.newsletterEmail(selection: Selection.NewsletterEmail { + NewsletterEmail( + emailId: try $0.id(), + email: try $0.address(), + confirmationCode: try $0.confirmationCode() + ) + })) + }, createNewsletterEmailError: .init { + .error(errorCode: try $0.errorCodes().first ?? .badRequest) + } + ) + } + + let mutation = Selection.Mutation { + try $0.createNewsletterEmail(selection: selection) + } + + let path = appEnvironment.graphqlPath + let headers = networker.defaultHeaders + + return Deferred { + Future { promise in + send(mutation, to: path, headers: headers) { result in + switch result { + case let .success(payload): + if let graphqlError = payload.errors { + promise(.failure(.message(messageText: "graphql error: \(graphqlError)"))) + } + + switch payload.data { + case let .saved(newsletterEmail: newsletterEmail): + promise(.success(newsletterEmail)) + case let .error(errorCode: errorCode): + promise(.failure(.message(messageText: errorCode.rawValue))) + } + case .failure: + promise(.failure(.message(messageText: "graphql error"))) + } + } + } + } + .receive(on: DispatchQueue.main) + .eraseToAnyPublisher() + } +}