У меня проблема с ограничением моей конечной точки graphql только для обслуживания данных, которые запрашивающий пользователь может запросить
Я использую
apollo-server 2.1.0
express 4.16.3
graphql 0.13.2
graphql-tools 4.0.0
neo4j-graphql-js 0.2.1
Тип Tag имеет поле elements , которое должно содержать только элементы, которыми владеет текущий пользователь.
type Tag {
name: String!
elements(username:String): [Element] @cypher(statement: "MATCH (this)-[:TAGGED]-(e:Element)-[:OWNER]-(u:User) WHERE u.name=$username RETURN e")
}
type Element {
uuid: String!
name: String
users: [User] @relation(name:"OWNER", direction:"IN")
tags: [Tag] @relation(name:"TAGGED", direction:"IN")
responses: [Element] @relation(name:"RESPONSE", direction:"OUT")
}
Когда мой запрос выглядит следующим образом:
{
Tag{
name,
elements(username:"crmue"){
name
}
}
}
Результат выглядит следующим образоможидается.Но я хочу проверить и установить аргумент имени пользователя в резольвере на основе присоединенного контекста пользователя.
Но когда я добавляю следующую строку в распознаватель корней тегов до выполнения запроса, мой ответ становится пустым.
params['username'] = ctx.user.name;
В этом случае сгенерированный оператор cypher помещает имя пользователя в корневой раздел Tag, а не в дочерний элемент (оператор @cypher).Но я понятия не имею, как установить аргумент имени пользователя для элементов поля Tag в распознавателе до того, как будут получены данные.
Так что я надеюсь, что у кого-то есть идея, как решить мою проблему, или у меня получшеИдея, чем мое решение здесь с оператором @cypher.
Спасибо!
ОБНОВЛЕНИЕ
Мои текущие основные средства распознавания:
export const resolvers = {
Tag : {
elements : (object, params, ctx, resolveInfo) => {
params["username"] = ctx.user.name;
}
},
Query: {
User(object, params, ctx, resolveInfo) {
return neo4jgraphql(object, params, ctx, resolveInfo);
},
Element(object, params, ctx, resolveInfo) {
return neo4jgraphql(object, params, ctx, resolveInfo);
},
Tag(object, params, ctx, resolveInfo) {
if(!ctx.user){
throw Error("Wrong request");
}
params["username"] = ctx.user.name;
return neo4jgraphql(object, params, ctx, resolveInfo);
},
}
};
Добавление параметра в распознаватель полей 'elements' не имеет никакого эффекта, так как распознаватели полей вызываются, когда данные уже извлечены.