Я создаю образец приложения для оценки FaunaDB и Nextjs
Мой план состоит в том, чтобы веб-приложение аутентифицировалось отдельно, затем создавало пользователя на FaunaDB. Затем создавало токен на FaunaDB и позволяло пользователю подключаться через его собственный секретный токен.
Я считаю, что я на правильном пути, чтобы заставить эту модель работать, но я столкнулся с проблемой с пользовательской ролью в FaunaDB.
Модель данных - Пользователь - ›Доска -› Задачи, и в этом вопросе я воспользуюсь доступом к доскам.
Вот код для настраиваемой роли
{
ref: Role("Free_Tier_Role"),
ts: 1601934616790000,
name: "Free_Tier_Role",
membership: [
{
resource: Collection("user"),
predicate: Query(
Lambda("ref", Select(["data", "isEnabled"], Get(Var("ref"))))
)
}
],
privileges: [
{
resource: Collection("user"),
actions: {
read: true,
write: false,
create: false,
delete: false,
history_read: false,
history_write: false,
unrestricted_read: false
}
},
{
resource: Collection("board"),
actions: {
read: Query(
Lambda(
"ref",
Equals(Identity(), Select(["data", "owner"], Get(Var("ref"))))
)
),
write: Query(
Lambda(
["oldData", "newData"],
And(
Equals(
Select("id", Identity()),
Select(["data", "owner"], Var("oldData"))
),
Equals(
Select(["data", "owner"], Var("oldData")),
Select(["data", "owner"], Var("newData"))
)
)
)
),
create: Query(
Lambda(
"newData",
And(
Equals(Identity(), Select(["data", "owner"], Var("newData"))),
LT(Count(Match(Index("board_by_owner"), Identity())), 3)
)
)
),
delete: Query(
Lambda(
"ref",
Equals(Identity(), Select(["data", "owner"], Get(Var("ref"))))
)
),
history_read: false,
history_write: false,
unrestricted_read: false
}
},
{
resource: Collection("task"),
actions: {
read: Query(
Lambda(
"ref",
Equals(Identity(), Select(["data", "owner"], Get(Var("ref"))))
)
),
write: Query(
Lambda(
["oldData", "newData"],
And(
Equals(
Select("id", Identity()),
Select(["data", "owner"], Var("oldData"))
),
Equals(
Select(["data", "owner"], Var("oldData")),
Select(["data", "owner"], Var("newData"))
)
)
)
),
create: Query(
Lambda(
"newData",
And(
Equals(Identity(), Select(["data", "owner"], Var("newData"))),
LT(Count(Match(Index("task_by_owner"), Identity())), 10)
)
)
),
delete: Query(
Lambda(
"ref",
Equals(Identity(), Select(["data", "owner"], Get(Var("ref"))))
)
),
history_read: false,
history_write: false,
unrestricted_read: false
}
},
{
resource: Index("task_by_owner"),
actions: {
unrestricted_read: false,
read: false
}
},
{
resource: Index("board_by_owner"),
actions: {
unrestricted_read: false,
read: false
}
}
]
}
Проблема, с которой я столкнулся: когда я вхожу в систему с помощью токена пользователя, и этот пользователь является владельцем доски, я получаю пустой список
> Map(Paginate(Documents(Collection('board'))),Lambda('x', Get(Var('x'))))
{ data: [] }
Чтобы проверить, что они имеют одинаковое значение, я запускаю эту команду в оболочке на панели инструментов.
Select(["data", "owner"], Get(Ref(Collection("board"), "278575744915866117")))
Ref(Collection("user"), "278571699875611143")
>> Time elapsed: 28ms
И запустите Identity () на моем экземпляре с аутентификацией по токену
> Identity()
Ref(Collection("user"), "278571699875611143")
>
P.S. до этого подхода я сравнивал номер идентификатора только с помощью Select (['data', 'ownerId'], Ref), но это не сработало, даже когда я пытался преобразовать как ToString, так и ToNumber
Documents()
? - person Pier   schedule 06.10.2020