Как создать дружеские отношения в Хасуре - PullRequest
0 голосов
/ 07 августа 2020

У меня есть 2 таблицы: users и friends.

friends имеет внешний ключ user_id, который, очевидно, сопоставляется с ключом users id. friends также имеет ключ friend_id, который также соответствует ключу users id.

Я использую JWT Auth. Я успешно установил разрешение для таблицы users, так что когда пользователь запрашивает пользователей, пользователь извлекает только указанный столбец c пользователя. Я также создал отношение массива для друзей в таблице users, поэтому строки user могут иметь friends через отношение.

Однако при запросе чего-то вроде:

{
  user {
    username
    friends {
      id
      username
    }
  }
}

Это возвращает null для друзей, потому что роль пользователя не имеет доступа к друзьям (из-за переменной сеанса X-Hasura-User-Id, используемой для определения пользователя по сеансу. Как мне согласовать работу переменной сеанса, но также иметь возможность запрашивать других друзей ?

1 Ответ

1 голос
/ 07 августа 2020

Поместите это разрешение на friends, и тогда пользователи смогут видеть все строки друзей, где friend_id - это их user.id:

{
  "friend_id" :{
    "_eq" : "X-Hasura-User-Id"
   }
}

Разрешения для отношений наследуются из таблицы отношений. Поэтому вам просто нужно убедиться, что пользователь может регулярно получать доступ к связанным строкам таблицы самостоятельно, и если вы можете это сделать, это будет применяться и к отношениям.

Несвязано, похоже, в этих таблицах одинаковые столбцы. Возможно, вы захотите использовать отношения с ссылками на себя из users -> users как friends, если они идентичны. Если не игнорировать это =)

Изменить:

Попробуйте использовать разрешение _exists:

(Вы, вероятно, можете упростить это, используя прямой доступ к friends и user, но я не знаю ваша точная таблица и структура отношений)

"Если в таблице есть друзья, строка, в которой 'friend_id' - 'X-Hasura-User-Id', а 'user_id' совпадает с идентификатором пользователя этой строки «

{
  "_or": [
    {
      "_exists": {
        "_table": { "schema": "public", "name": "friends" },
        "_where": {
          "_and": [
            { "friend_id": { "_eq": "X-Hasura-User-Id" } },
            { "user_id": { "_ceq": "user_id" } }
          ]
        }
      }
    },
    { "id": { "_eq": "X-Hasura-User-Id" } }
  ]
}
...