GraphQL - невозможно обновить строку таблицы

Допустим, у меня есть таблица Person с атрибутами id а также name, Сервер GraphQL полностью настроен на Postgraphile и работает, как я могу запросить и создать новую запись. Однако я не смог его обновить. Почесывая голову снова и снова, и я до сих пор не могу найти причину этого.

Это мутация, которую я пробовал, которая время от времени подводила меня.

mutation($id: Int!, $patch: PersonPatch!) {
  updatePersonById(input: { id: $id, patch: $patch }) {
    clientMutationId
  }
}

Переменные

{
    id: 1, 
    patch: {"name": "newname"}
}

Я использовал Altair GraphQL client отправить запрос на мутацию, и сообщение об ошибке было возвращено "No values were updated in collection 'people' because no values were found."

Человек id = 1 существует, подтверждено отправкой запроса personById чтобы получить его имя. Но я просто не мог обновить его имя.

Редактировать #1

Ниже приведен gql, сгенерированный Altair GraphQL Client

updatePersonById(
  input: UpdatePersonByIdInput!
): UpdatePersonPayload


input UpdatePersonByIdInput {
  clientMutationId: String
  patch: PersonPatch!
  id: Int!
}

input PersonPatch {
  id: Int
  name: String
}

1 ответ

Решение

Предполагая, что вы используете безопасность на уровне строк (RLS), похоже, что обновляемая строка не передает требуемые политики безопасности для текущего пользователя, прошедшего проверку подлинности.

Вот маленький пример; вы захотите настроить его под свою систему разрешений

create table person (id serial primary key, name text);
alter table person enable row level security;
grant select, insert(name), update(name), delete on person to graphql;
create policy select_all on person for select using (true);
create policy insert_all on person for insert with check(true);
create policy update_self on person for update using (id = current_person_id());
create policy delete_self on person for delete using (id = current_person_id());

где

create function current_person_id() returns int as $$
  select nullif(current_setting('jwt.claims.person_id', true), '')::int;
$$ language sql stable;

Если вам нужно больше рекомендаций, не стесняйтесь заходить в чат Graphile.

Другие вопросы по тегам