Files
omnivore/apple/OmnivoreKit/Sources/Services/DataService/Mutations/CreateReminder.swift
2022-05-26 21:51:22 -07:00

80 lines
2.0 KiB
Swift

import Foundation
import Models
import SwiftGraphQL
public enum ReminderItemId {
case clientRequest(id: String)
case link(id: String)
var linkId: String? {
switch self {
case .clientRequest:
return nil
case let .link(id):
return id
}
}
var clientRequestId: String? {
switch self {
case .link:
return nil
case let .clientRequest(id):
return id
}
}
}
public extension DataService {
func createReminder(
reminderItemId: ReminderItemId,
remindAt: Date
) async throws {
enum MutationResult {
case complete(id: String)
case error(errorCode: Enums.CreateReminderErrorCode)
}
let selection = Selection<MutationResult, Unions.CreateReminderResult> {
try $0.on(
createReminderSuccess: .init {
.complete(id: try $0.reminder(selection: Selection.Reminder { try $0.id() }))
},
createReminderError: .init { .error(errorCode: try $0.errorCodes().first ?? .badRequest) }
)
}
let mutation = Selection.Mutation {
try $0.createReminder(
input: InputObjects.CreateReminderInput(
linkId: OptionalArgument(reminderItemId.linkId),
clientRequestId: OptionalArgument(reminderItemId.clientRequestId),
archiveUntil: true,
sendNotification: true,
remindAt: DateTime(from: remindAt)
),
selection: selection
)
}
let path = appEnvironment.graphqlPath
let headers = networker.defaultHeaders
return try await withCheckedThrowingContinuation { continuation in
send(mutation, to: path, headers: headers) { queryResult in
guard let payload = try? queryResult.get() else {
continuation.resume(throwing: BasicError.message(messageText: "network error"))
return
}
switch payload.data {
case .complete:
continuation.resume()
case let .error(errorCode: errorCode):
continuation.resume(throwing: BasicError.message(messageText: errorCode.rawValue))
}
}
}
}
}