Skip to content

Commit

Permalink
v 2.28 subs fix
Browse files Browse the repository at this point in the history
  • Loading branch information
MuniekMg committed May 13, 2024
1 parent a1a2e3e commit bc7306b
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ public struct FilterDecorator: ModelBasedGraphQLDocumentDecorator {
} else if case .query = document.operationType {
inputs["filter"] = GraphQLDocumentInput(type: "Model\(modelName)FilterInput",
value: .object(filter))
} else if case .subscription = document.operationType {
inputs["filter"] = GraphQLDocumentInput(type: "ModelSubscription\(modelName)FilterInput",
value: .object(filter))
}

return document.copy(inputs: inputs)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,12 @@ protocol ModelSyncGraphQLRequestFactory {
authType: AWSAuthorizationType?) -> GraphQLRequest<MutationSyncResult>

static func subscription(to modelSchema: ModelSchema,
where predicate: QueryPredicate?,
subscriptionType: GraphQLSubscriptionType,
authType: AWSAuthorizationType?) -> GraphQLRequest<MutationSyncResult>

static func subscription(to modelSchema: ModelSchema,
where predicate: QueryPredicate?,
subscriptionType: GraphQLSubscriptionType,
claims: IdentityClaimsDictionary,
authType: AWSAuthorizationType?) -> GraphQLRequest<MutationSyncResult>
Expand Down Expand Up @@ -94,16 +96,18 @@ extension GraphQLRequest: ModelSyncGraphQLRequestFactory {
}

public static func subscription(to modelType: Model.Type,
where predicate: QueryPredicate?,
subscriptionType: GraphQLSubscriptionType,
authType: AWSAuthorizationType? = nil) -> GraphQLRequest<MutationSyncResult> {
subscription(to: modelType.schema, subscriptionType: subscriptionType, authType: authType)
subscription(to: modelType.schema, where: predicate, subscriptionType: subscriptionType, authType: authType)
}

public static func subscription(to modelType: Model.Type,
where predicate: QueryPredicate?,
subscriptionType: GraphQLSubscriptionType,
claims: IdentityClaimsDictionary,
authType: AWSAuthorizationType? = nil) -> GraphQLRequest<MutationSyncResult> {
subscription(to: modelType.schema, subscriptionType: subscriptionType, claims: claims, authType: authType)
subscription(to: modelType.schema, where: predicate, subscriptionType: subscriptionType, claims: claims, authType: authType)
}

public static func syncQuery(modelType: Model.Type,
Expand Down Expand Up @@ -169,12 +173,18 @@ extension GraphQLRequest: ModelSyncGraphQLRequestFactory {
}

public static func subscription(to modelSchema: ModelSchema,
where predicate: QueryPredicate?,
subscriptionType: GraphQLSubscriptionType,
authType: AWSAuthorizationType? = nil) -> GraphQLRequest<MutationSyncResult> {

var documentBuilder = ModelBasedGraphQLDocumentBuilder(modelSchema: modelSchema,
operationType: .subscription,
primaryKeysOnly: true)

if let predicate = optimizePredicate(predicate) {
documentBuilder.add(decorator: FilterDecorator(filter: predicate.graphQLFilter(for: modelSchema)))
}

documentBuilder.add(decorator: DirectiveNameDecorator(type: subscriptionType))
documentBuilder.add(decorator: ConflictResolutionDecorator(graphQLType: .subscription, primaryKeysOnly: true))
documentBuilder.add(decorator: AuthRuleDecorator(.subscription(subscriptionType, nil), authType: authType))
Expand All @@ -190,13 +200,19 @@ extension GraphQLRequest: ModelSyncGraphQLRequestFactory {
}

public static func subscription(to modelSchema: ModelSchema,
where predicate: QueryPredicate?,
subscriptionType: GraphQLSubscriptionType,
claims: IdentityClaimsDictionary,
authType: AWSAuthorizationType? = nil) -> GraphQLRequest<MutationSyncResult> {

var documentBuilder = ModelBasedGraphQLDocumentBuilder(modelSchema: modelSchema,
operationType: .subscription,
primaryKeysOnly: true)

if let predicate = optimizePredicate(predicate) {
documentBuilder.add(decorator: FilterDecorator(filter: predicate.graphQLFilter(for: modelSchema)))
}

documentBuilder.add(decorator: DirectiveNameDecorator(type: subscriptionType))
documentBuilder.add(decorator: ConflictResolutionDecorator(graphQLType: .subscription, primaryKeysOnly: true))
documentBuilder.add(decorator: AuthRuleDecorator(.subscription(subscriptionType, claims), authType: authType))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,8 @@ final class IncomingAsyncSubscriptionEventPublisher: AmplifyCancellable {
self.onCreateValueListener = onCreateValueListener
self.onCreateOperation = RetryableGraphQLSubscriptionOperation(
requestFactory: IncomingAsyncSubscriptionEventPublisher.apiRequestFactoryFor(
for: modelSchema,
for: modelSchema,
where: modelPredicate,
subscriptionType: .onCreate,
api: api,
auth: auth,
Expand All @@ -100,6 +101,7 @@ final class IncomingAsyncSubscriptionEventPublisher: AmplifyCancellable {
self.onUpdateOperation = RetryableGraphQLSubscriptionOperation(
requestFactory: IncomingAsyncSubscriptionEventPublisher.apiRequestFactoryFor(
for: modelSchema,
where: modelPredicate,
subscriptionType: .onUpdate,
api: api,
auth: auth,
Expand All @@ -120,7 +122,8 @@ final class IncomingAsyncSubscriptionEventPublisher: AmplifyCancellable {
self.onDeleteValueListener = onDeleteValueListener
self.onDeleteOperation = RetryableGraphQLSubscriptionOperation(
requestFactory: IncomingAsyncSubscriptionEventPublisher.apiRequestFactoryFor(
for: modelSchema,
for: modelSchema,
where: modelPredicate,
subscriptionType: .onDelete,
api: api,
auth: auth,
Expand Down Expand Up @@ -195,6 +198,7 @@ final class IncomingAsyncSubscriptionEventPublisher: AmplifyCancellable {
}

static func makeAPIRequest(for modelSchema: ModelSchema,
where predicate: QueryPredicate?,
subscriptionType: GraphQLSubscriptionType,
api: APICategoryGraphQLBehaviorExtended,
auth: AuthCategoryBehavior?,
Expand All @@ -205,20 +209,23 @@ final class IncomingAsyncSubscriptionEventPublisher: AmplifyCancellable {
let _ = auth,
let tokenString = try? await awsAuthService.getUserPoolAccessToken(),
case .success(let claims) = awsAuthService.getTokenClaims(tokenString: tokenString) {
request = GraphQLRequest<Payload>.subscription(to: modelSchema,
request = GraphQLRequest<Payload>.subscription(to: modelSchema,
where: predicate,
subscriptionType: subscriptionType,
claims: claims,
authType: authType)
} else if modelSchema.hasAuthenticationRules,
let oidcAuthProvider = hasOIDCAuthProviderAvailable(api: api),
let tokenString = try? await oidcAuthProvider.getLatestAuthToken(),
case .success(let claims) = awsAuthService.getTokenClaims(tokenString: tokenString) {
request = GraphQLRequest<Payload>.subscription(to: modelSchema,
request = GraphQLRequest<Payload>.subscription(to: modelSchema,
where: predicate,
subscriptionType: subscriptionType,
claims: claims,
authType: authType)
} else {
request = GraphQLRequest<Payload>.subscription(to: modelSchema,
where: predicate,
subscriptionType: subscriptionType,
authType: authType)
}
Expand Down Expand Up @@ -296,14 +303,16 @@ final class IncomingAsyncSubscriptionEventPublisher: AmplifyCancellable {
// MARK: - IncomingAsyncSubscriptionEventPublisher + API request factory
extension IncomingAsyncSubscriptionEventPublisher {
static func apiRequestFactoryFor(for modelSchema: ModelSchema,
where predicate: QueryPredicate?,
subscriptionType: GraphQLSubscriptionType,
api: APICategoryGraphQLBehaviorExtended,
auth: AuthCategoryBehavior?,
awsAuthService: AWSAuthServiceBehavior,
authTypeProvider: AWSAuthorizationTypeIterator) -> RetryableGraphQLOperation<Payload>.RequestFactory {
var authTypes = authTypeProvider
return {
return await IncomingAsyncSubscriptionEventPublisher.makeAPIRequest(for: modelSchema,
return await IncomingAsyncSubscriptionEventPublisher.makeAPIRequest(for: modelSchema,
where: predicate,
subscriptionType: subscriptionType,
api: api,
auth: auth,
Expand Down

0 comments on commit bc7306b

Please sign in to comment.