Я думаю, что первый шаг для фильтрации подписок на основе пользователя проще всего сделать с небольшим обновлением вашей схемы, разбив форму «input» на отдельные входы для мутации. В частности:
type mutation {
createEvent(userID: String!, eventID: ID!, type: String!,
data: String, dateTime: AWSDateTime!): event
}
... other stuff...
type Subscription {
onCreateEvent(userId: String!): event
@aws_subscribe(mutations: ["createEvent"])
}
Несколько замечаний по этому поводу:
1) Предполагается, что вы хотите, чтобы это было требованием для подписки. Если нет, если вы хотите, чтобы это было необязательное правило, удалите!. По твоему комментарию, я думаю, ты бы этого хотел.
2) Фильтры подписки (что является параметром userId в операции подписки) требуют, чтобы фильтры были в ответе на мутацию. Поэтому убедитесь, что когда вы определяете операцию на своем клиенте, вы включаете туда userId в ответ.
3) Это необходимо для применения фильтра подписки. Служба не будет знать, что такое userId, если это не прямой ввод в мутацию, если он внутри и форма ввода не будет работать.
Теперь, насколько это возможно, пользователь не может просто подписаться на чужое имя пользователя. Я полагаю, что вы просматривали эту страницу документации . Это будет работать, полностью допустимо и может быть дополнено чем-то похожим на пример на этой странице документации, но оно основано на наличии таблицы поиска разрешений и распознавателя Dynamo. Если у вас его нет или вы предпочитаете избегать его использования, небольшая настройка должна помочь ему работать с не / локальным распознавателем. Без таблицы разрешений или чего-либо, с чем можно было бы проверить, я настоятельно рекомендовал бы локальный / без разрешения.
В частности, я считаю, что вы можете переместить то, что у вас есть в шаблоне отображения ответов, в новый шаблон отображения вашего нет / локального преобразователя ...
#if(${context.identity.username} != ${context.arguments.userID})
$utils.unauthorized()
#else
##User is authorized, but we return null to continue
null
#end
... и если шаблон сопоставления ответов будет ответом по умолчанию, то вы получите его без ненужной инфраструктуры в таблице разрешений или мертвом коде, который настраивает взаимодействие динамо, которое не происходит. Вместо этого все, что нужно будет сделать, это проверить имя пользователя во входных данных и имя пользователя в токене Cognito.