Files
omnivore/apple/OmnivoreKit/Sources/Services/DataService/Mutations/CreateRecommendationGroup.swift
2023-02-20 12:15:29 -07:00

58 lines
2.2 KiB
Swift

import CoreData
import Foundation
import Models
import SwiftGraphQL
public extension DataService {
// swiftlint:disable:next line_length
func createRecommendationGroup(name: String, onlyAdminCanPost: Bool, onlyAdminCanSeeMembers: Bool) async throws -> InternalRecommendationGroup {
enum MutationResult {
case saved(recommendationGroup: InternalRecommendationGroup)
case error(errorCode: Enums.CreateGroupErrorCode)
}
let selection = Selection<MutationResult, Unions.CreateGroupResult> {
try $0.on(
createGroupError: .init {
.error(errorCode: try $0.errorCodes().first ?? .badRequest)
},
createGroupSuccess: .init {
.saved(recommendationGroup: try $0.group(selection: recommendationGroupSelection))
}
)
}
let input = InputObjects.CreateGroupInput(expiresInDays: OptionalArgument(14),
name: name,
onlyAdminCanPost: OptionalArgument(onlyAdminCanPost),
onlyAdminCanSeeMembers: OptionalArgument(onlyAdminCanSeeMembers))
let mutation = Selection.Mutation {
try $0.createGroup(input: input, selection: selection)
}
let path = appEnvironment.graphqlPath
let headers = networker.defaultHeaders
return try await withCheckedThrowingContinuation { continuation in
send(mutation, to: path, headers: headers) { [weak self] queryResult in
guard let payload = try? queryResult.get(), let self = self else {
continuation.resume(throwing: BasicError.message(messageText: "network error"))
return
}
switch payload.data {
case let .saved(recommendationGroup: recommendationGroup):
if [recommendationGroup].persist(context: self.backgroundContext) != nil {
continuation.resume(returning: recommendationGroup)
} else {
continuation.resume(throwing: BasicError.message(messageText: "CoreData error"))
}
case let .error(errorCode: errorCode):
continuation.resume(throwing: BasicError.message(messageText: errorCode.rawValue))
}
}
}
}
}