Я относительно новичок в мире GraphQL / Prisma / Apollo и работаю над приложением, в котором мне нужны функции входа в систему и ограничения доступа, основанные на разрешениях пользователя.
Когда я запускаю свою мутацию входа в систему, это терпит неудачу, если я запрашиваю возвращение поля «роли» пользователя, и я не могу, хоть убей, понять почему.
Если я сделаю простой запрос для всех пользователей и запрошу поле «роли», он возвращает без проблем. Точно так же, если я делаю запрос для одного пользователя и фильтрую по любому другому полю: - идентификатор, адрес электронной почты, имя пользователя.
Мое приложение настроено следующим образом:
datamodel.graphql (prisma)
type User {
id: ID! @id @unique
name: String!
email: String! @unique
username: String! @unique
password: String!
roles: [UserRoles!]!
}
enum UserRoles {
ADMIN
USER
DIRECTOR
}
schema.graphql (react / apollo)
type User {
id: ID!
name: String!
email: String!
username: String!
password: String!
roles: [UserRoles!]!
}
enum UserRoles {
ADMIN
USER
DIRECTOR
}
Mutation. js (внешний интерфейс преобразователей)
async loginUser(parent, args, { prisma }, info) {
const { username, password } = args.data;
const user = await prisma.query.user({ where: { username } });
if (!user) {
throw new Error("Invalid login credentials. Please try again");
}
const passwordIsMatch = await bcrypt.compare(password, user.password);
if (!passwordIsMatch) {
throw new Error("Invalid login credentials. Please try again");
}
return {
user,
token: generateToken(user.id),
};
},
Если я запустил мутацию входа в систему как-то так он работает нормально.
mutation LoginUser($username: String!, $password: String!){
loginUser(data: {
username: $username
password: $password
}) {
user {
id
name
}
token
}
}
Но если я запустил его вот так, он выйдет из строя с сообщением «Невозможно вернуть значение null для поля User.roles, не допускающего значения NULL».
mutation LoginUser($username: String!, $password: String!){
loginUser(data: {
username: $username
password: $password
}) {
user {
id
name
roles
}
token
}
}
Есть идеи, как это исправить? Или мне следует дождаться ответа на эту мутацию, а затем запустить запрос для пользователя с возвращенным идентификатором, а затем извлечь из него поле «роли»? Мне это кажется немного излишним, поскольку я думал, что одним из больших преимуществ GraphQL является минимизация количества HTTP-запросов.